WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch for landing
bug-236427-20220211101151.patch (text/plain), 3.70 MB, created by
Kyle Piddington
on 2022-02-11 10:11:57 PST
(
hide
)
Description:
Patch for landing
Filename:
MIME Type:
Creator:
Kyle Piddington
Created:
2022-02-11 10:11:57 PST
Size:
3.70 MB
patch
obsolete
>Subversion Revision: 289631 >diff --git a/Source/ThirdParty/ANGLE/ChangeLog b/Source/ThirdParty/ANGLE/ChangeLog >index d10f043c7c7872bec69f25c36c6d6e3d1664ce12..762d325ffed3982ab84cb4fd7be6a4df89f54522 100644 >--- a/Source/ThirdParty/ANGLE/ChangeLog >+++ b/Source/ThirdParty/ANGLE/ChangeLog >@@ -1,3 +1,21 @@ >+2022-02-11 Kyle Piddington <kpiddington@apple.com> >+ >+ Cocoa2d-HTLM5 game apepars to use wrong vertex buffer data >+ https://bugs.webkit.org/show_bug.cgi?id=236427 >+ <rdar://problem/87136345> >+ >+ Reviewed by Kimmo Kinnunen. >+ >+ Render encoder appears to carry stale state when a vertex array's element >+ buffer is updated, but no other parts of the buffer are updated. Reassign >+ vertex buffer bindings in this case, which clears up corruption >+ (Squished rendering elements, incorrect UV's) >+ >+ * src/libANGLE/renderer/metal/VertexArrayMtl.h: >+ * src/libANGLE/renderer/metal/VertexArrayMtl.mm: >+ (rx::VertexArrayMtl::syncState): >+ (rx::VertexArrayMtl::setupDraw): >+ > 2022-02-03 Michael Saboff <msaboff@apple.com> > > WebKit projects have incorrect install name for the frameworks for Catalyst builds with the system content path >diff --git a/Source/ThirdParty/ANGLE/ANGLE.plist b/Source/ThirdParty/ANGLE/ANGLE.plist >index 2a586dd9f2397ff5f937f63471e3d630c0156a23..b3abcd4e1b9f49853e98bcc6a4e6c583e0f381ef 100644 >--- a/Source/ThirdParty/ANGLE/ANGLE.plist >+++ b/Source/ThirdParty/ANGLE/ANGLE.plist >@@ -6,13 +6,13 @@ > <key>OpenSourceProject</key> > <string>ANGLE</string> > <key>OpenSourceVersion</key> >- <string>aabfe8747deb047308f6c2a521aa9fe493efd1f8</string> >+ <string>c4a9d41696920b14397f8cb2ee2012e271c7ac45</string> > <key>OpenSourceWebsiteURL</key> > <string>http://code.google.com/p/angleproject/</string> > <key>OpenSourceSCM</key> >- <string>git clone https://chromium.googlesource.com/angle/angle && cd angle && git checkout aabfe8747deb047308f6c2a521aa9fe493efd1f8</string> >+ <string>git clone https://chromium.googlesource.com/angle/angle && cd angle && git checkout c4a9d41696920b14397f8cb2ee2012e271c7ac45</string> > <key>OpenSourceImportDate</key> >- <string>2021-12-20</string> >+ <string>2022-01-27</string> > <key>OpenSourceLicense</key> > <string>BSD</string> > <key>OpenSourceLicenseFile</key> >diff --git a/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj b/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj >index a4c17b02f772f0112d4aa95cd3b4293888d95798..bd3fa28e4753a351e13ae437972b0708e558274e 100644 >--- a/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj >+++ b/Source/ThirdParty/ANGLE/ANGLE.xcodeproj/project.pbxproj >@@ -747,6 +747,8 @@ > FF62F69F27448D6A00AD6EDC /* Context_gles_3_1_autogen.h in Headers */ = {isa = PBXBuildFile; fileRef = FF62F69327448D6900AD6EDC /* Context_gles_3_1_autogen.h */; }; > FF62F6A027448D6A00AD6EDC /* Context_gles_3_2_autogen.h in Headers */ = {isa = PBXBuildFile; fileRef = FF62F69427448D6900AD6EDC /* Context_gles_3_2_autogen.h */; }; > FF62F6A127448D6A00AD6EDC /* gles_extensions_autogen.h in Headers */ = {isa = PBXBuildFile; fileRef = FF62F69527448D6900AD6EDC /* gles_extensions_autogen.h */; }; >+ FF85D93527A367ED007F08E1 /* GuardFragDepthWrite.h in Headers */ = {isa = PBXBuildFile; fileRef = FF85D93327A367ED007F08E1 /* GuardFragDepthWrite.h */; }; >+ FF85D93627A367ED007F08E1 /* GuardFragDepthWrite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FF85D93427A367ED007F08E1 /* GuardFragDepthWrite.cpp */; }; > FFD002212744938F002BE3BC /* glslang_wrapper_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = FFD002202744938F002BE3BC /* glslang_wrapper_utils.h */; }; > FFD00224274493AB002BE3BC /* ShaderInterfaceVariableInfoMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FFD00222274493AB002BE3BC /* ShaderInterfaceVariableInfoMap.cpp */; }; > FFD00225274493AB002BE3BC /* ShaderInterfaceVariableInfoMap.h in Headers */ = {isa = PBXBuildFile; fileRef = FFD00223274493AB002BE3BC /* ShaderInterfaceVariableInfoMap.h */; }; >@@ -1722,6 +1724,8 @@ > FF81FF982581A3C100894E24 /* AsNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsNode.h; sourceTree = "<group>"; }; > FF81FF992581A3C100894E24 /* IntermRebuild.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IntermRebuild.cpp; sourceTree = "<group>"; }; > FF81FF9A2581A3C200894E24 /* IntermRebuild.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntermRebuild.h; sourceTree = "<group>"; }; >+ FF85D93327A367ED007F08E1 /* GuardFragDepthWrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GuardFragDepthWrite.h; sourceTree = "<group>"; }; >+ FF85D93427A367ED007F08E1 /* GuardFragDepthWrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GuardFragDepthWrite.cpp; sourceTree = "<group>"; }; > FFA0C2C525CB6A7600105306 /* NameEmbeddedUniformStructsMetal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NameEmbeddedUniformStructsMetal.cpp; sourceTree = "<group>"; }; > FFA0C2C625CB6A7700105306 /* NameEmbeddedUniformStructsMetal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NameEmbeddedUniformStructsMetal.h; sourceTree = "<group>"; }; > FFD002202744938F002BE3BC /* glslang_wrapper_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glslang_wrapper_utils.h; sourceTree = "<group>"; }; >@@ -3012,6 +3016,8 @@ > FF2D2F5325C8B14A002FB699 /* FixTypeConstructors.cpp */, > FF2D2F5225C8B14A002FB699 /* FixTypeConstructors.h */, > FF81FF482581919700894E24 /* HoistConstants.cpp */, >+ FF85D93327A367ED007F08E1 /* GuardFragDepthWrite.h */, >+ FF85D93427A367ED007F08E1 /* GuardFragDepthWrite.cpp */, > FF81FF4C2581919700894E24 /* HoistConstants.h */, > FF81FF512581919700894E24 /* IdGen.cpp */, > FF81FF382581919700894E24 /* IdGen.h */, >@@ -3162,6 +3168,7 @@ > 31CDFFA52491849800486F27 /* DeferGlobalInitializers.h in Headers */, > 31CD005A249184FC00486F27 /* Device.h in Headers */, > 31CD0001249184B500486F27 /* DeviceCGL.h in Headers */, >+ FF85D93527A367ED007F08E1 /* GuardFragDepthWrite.h in Headers */, > 31CD0009249184BB00486F27 /* DeviceEAGL.h in Headers */, > 31CD0045249184F400486F27 /* DeviceImpl.h in Headers */, > 31CDFFD3249184A700486F27 /* Diagnostics.h in Headers */, >@@ -3865,6 +3872,7 @@ > DF83E27B2639FD33000825EF /* RemoveDynamicIndexing.cpp in Sources */, > DF83E2652639FD33000825EF /* RemoveInactiveInterfaceVariables.cpp in Sources */, > DF83E26C2639FD33000825EF /* RemoveInvariantDeclaration.cpp in Sources */, >+ FF85D93627A367ED007F08E1 /* GuardFragDepthWrite.cpp in Sources */, > DF83E2762639FD33000825EF /* RemoveUnreferencedVariables.cpp in Sources */, > DF83E31F2639FE17000825EF /* Renderbuffer.cpp in Sources */, > DF83E36E2639FE92000825EF /* RenderbufferGL.cpp in Sources */, >diff --git a/Source/ThirdParty/ANGLE/BUILD.gn b/Source/ThirdParty/ANGLE/BUILD.gn >index c14307a23baf05b445d8bea2aae2059a5c7d5d56..f5364875a1faffb85c73aec5eb13ab315dd66900 100644 >--- a/Source/ThirdParty/ANGLE/BUILD.gn >+++ b/Source/ThirdParty/ANGLE/BUILD.gn >@@ -830,6 +830,8 @@ angle_source_set("libANGLE_headers") { > if (angle_enable_vulkan || angle_enable_metal) { > angle_source_set("angle_glslang_wrapper") { > sources = [ >+ "src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp", >+ "src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h", > "src/libANGLE/renderer/glslang_wrapper_utils.cpp", > "src/libANGLE/renderer/glslang_wrapper_utils.h", > ] >diff --git a/Source/ThirdParty/ANGLE/Compiler.cmake b/Source/ThirdParty/ANGLE/Compiler.cmake >index 3a2cb1715434cde3405a8de255aa26f9e447a961..577b4f95faab053437412ca225b4c229cd1503a5 100644 >--- a/Source/ThirdParty/ANGLE/Compiler.cmake >+++ b/Source/ThirdParty/ANGLE/Compiler.cmake >@@ -375,6 +375,7 @@ set(angle_translator_glsl_symbol_table_sources > set(angle_translator_lib_metal_sources > "src/compiler/translator/DriverUniformMetal.cpp" > "src/compiler/translator/TranslatorMetal.cpp" >+ "src/compiler/translator/TranslatorMetalConstantNames.cpp" > "src/compiler/translator/TranslatorMetalDirect.cpp" > "src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.cpp" > "src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h" >@@ -389,6 +390,8 @@ set(angle_translator_lib_metal_sources > "src/compiler/translator/TranslatorMetalDirect/EmitMetal.h" > "src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp" > "src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.h" >+ "src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.cpp" >+ "src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.h" > "src/compiler/translator/TranslatorMetalDirect/HoistConstants.cpp" > "src/compiler/translator/TranslatorMetalDirect/HoistConstants.h" > "src/compiler/translator/TranslatorMetalDirect/IdGen.cpp" >diff --git a/Source/ThirdParty/ANGLE/DEPS b/Source/ThirdParty/ANGLE/DEPS >index b617a1e576954b31dcde34dba0372883edfe328f..7040b68701518f216f72147d8d14e87d1ac7d54f 100644 >--- a/Source/ThirdParty/ANGLE/DEPS >+++ b/Source/ThirdParty/ANGLE/DEPS >@@ -34,13 +34,13 @@ vars = { > 'checkout_android_native_support': 'checkout_android or checkout_chromeos', > > # Version of Chromium our Chromium-based DEPS are mirrored from. >- 'chromium_revision': '81decb7250e1be9456554efc7f2432f828e7f05c', >+ 'chromium_revision': '8ff0cb4f71d8a6e497d7d2cbc25ad6d317c3ba71', > # We never want to checkout chromium, > # but need a dummy DEPS entry for the autoroller > 'dummy_checkout_chromium': False, > > # Current revision of VK-GL-CTS (a.k.a dEQP). >- 'vk_gl_cts_revision': 'bfede065f419a93f3ea37dcc0c8fbcd794d3b7f8', >+ 'vk_gl_cts_revision': '97ceb2222747fef380d25acd15638b599fbc1d5a', > > # Current revision of googletest. > # Note: this dep cannot be auto-rolled b/c of nesting. >@@ -79,12 +79,12 @@ vars = { > # Three lines of non-changing comments so that > # the commit queue can handle CLs rolling catapult > # and whatever else without interference from each other. >- 'catapult_revision': '97da6b1e1c9db574e28d63e89fe83b23bbb22cef', >+ 'catapult_revision': 'd90eeee99383928afa92d6960ad9d3b5f51f8b76', > > # Three lines of non-changing comments so that > # the commit queue can handle CLs rolling luci-go > # and whatever else without interference from each other. >- 'luci_go': 'git_revision:e897e118887a2e6c50a82212b660cb2a7c58d910', >+ 'luci_go': 'git_revision:7528d700b89db0b6feb32be098d40597f738d3c7', > > # Three lines of non-changing comments so that > # the commit queue can handle CLs rolling android_sdk_build-tools_version >@@ -119,12 +119,12 @@ vars = { > deps = { > > 'build': { >- 'url': '{chromium_git}/chromium/src/build.git@13ae02d0c8be884c5c11d36cc04320a109e9a16a', >+ 'url': '{chromium_git}/chromium/src/build.git@45926bacc928e7e1d369533800bcb7eb21328ece', > 'condition': 'not build_with_chromium', > }, > > 'buildtools': { >- 'url': '{chromium_git}/chromium/src/buildtools.git@d7bdd6f0386aaf20cd00a01d499e8ce1cbf6063e', >+ 'url': '{chromium_git}/chromium/src/buildtools.git@f78b4b9f33bd8ef9944d5ce643daff1c31880189', > 'condition': 'not build_with_chromium', > }, > >@@ -137,7 +137,7 @@ deps = { > 'packages': [ > { > 'package': 'gn/gn/linux-amd64', >- 'version': 'git_revision:281ba2c91861b10fec7407c4b6172ec3d4661243', >+ 'version': 'git_revision:0725d7827575b239594fbc8fd5192873a1d62f44', > } > ], > 'dep_type': 'cipd', >@@ -148,7 +148,7 @@ deps = { > 'packages': [ > { > 'package': 'gn/gn/mac-${{arch}}', >- 'version': 'git_revision:281ba2c91861b10fec7407c4b6172ec3d4661243', >+ 'version': 'git_revision:0725d7827575b239594fbc8fd5192873a1d62f44', > } > ], > 'dep_type': 'cipd', >@@ -161,12 +161,12 @@ deps = { > }, > > 'buildtools/third_party/libc++abi/trunk': { >- 'url': '{chromium_git}/external/github.com/llvm/llvm-project/libcxxabi.git@603d9d1067d178ee2dbd1ba8028413baa876a771', >+ 'url': '{chromium_git}/external/github.com/llvm/llvm-project/libcxxabi.git@df43e1b0396fbd3a0e511b804eeec54f3b62e3f0', > 'condition': 'not build_with_chromium', > }, > > 'buildtools/third_party/libunwind/trunk': { >- 'url': '{chromium_git}/external/github.com/llvm/llvm-project/libunwind.git@4ead61094cab5ac7a90198fbe182596c4775183e', >+ 'url': '{chromium_git}/external/github.com/llvm/llvm-project/libunwind.git@c8a5d430f292ca05a317db056c297d6b0b755e0a', > 'condition': 'not build_with_chromium', > }, > >@@ -174,7 +174,7 @@ deps = { > 'packages': [ > { > 'package': 'gn/gn/windows-amd64', >- 'version': 'git_revision:281ba2c91861b10fec7407c4b6172ec3d4661243', >+ 'version': 'git_revision:0725d7827575b239594fbc8fd5192873a1d62f44', > } > ], > 'dep_type': 'cipd', >@@ -182,12 +182,12 @@ deps = { > }, > > 'testing': { >- 'url': '{chromium_git}/chromium/src/testing@76bec179953ab9aee221767e4130fe050ff22ac7', >+ 'url': '{chromium_git}/chromium/src/testing@092853377062cf39f783594552cdb1ad57da0697', > 'condition': 'not build_with_chromium', > }, > > 'third_party/abseil-cpp': { >- 'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@4afcb13a107dc91f334f1f668346697b382984d0', >+ 'url': '{chromium_git}/chromium/src/third_party/abseil-cpp@cfdfe8d1453ed2762d8e68d06b2e0a9fbf0f57bb', > 'condition': 'not build_with_chromium', > }, > >@@ -200,7 +200,7 @@ deps = { > 'packages': [ > { > 'package': 'chromium/third_party/android_build_tools/aapt2', >- 'version': 'ZHiDoiurxMLwajQq_CwBH9zaDW5xwYWYGbedxIslTm8C', >+ 'version': '0yR8wK_fSMgdVKwnx4nRPi-amaLV7Kcr4Os6mg_DGI4C', > }, > ], > 'condition': 'checkout_android and not build_with_chromium', >@@ -230,7 +230,7 @@ deps = { > }, > > 'third_party/android_deps': { >- 'url': '{chromium_git}/chromium/src/third_party/android_deps@e2503e42c548dfcaa52e923733c8e827b22249d3', >+ 'url': '{chromium_git}/chromium/src/third_party/android_deps@f7460e1e051a28d3673e9de83d7d32ed67e10b31', > 'condition': 'checkout_android and not build_with_chromium', > }, > >@@ -240,7 +240,7 @@ deps = { > }, > > 'third_party/android_platform': { >- 'url': '{chromium_git}/chromium/src/third_party/android_platform@abc362f16dfc1a6cc082298ed54504bef11eb9e7', >+ 'url': '{chromium_git}/chromium/src/third_party/android_platform@f0d4a3b4c88c961e6ea195c381ff1a48985f3f57', > 'condition': 'checkout_android and not build_with_chromium', > }, > >@@ -332,7 +332,7 @@ deps = { > }, > > 'third_party/depot_tools': { >- 'url': '{chromium_git}/chromium/tools/depot_tools.git@db41eed6b7442273b54bac9695567d97b60718de', >+ 'url': '{chromium_git}/chromium/tools/depot_tools.git@d5862557d6a2ceef3f85092aa76682a4cdf2fc4e', > 'condition': 'not build_with_chromium', > }, > >@@ -439,7 +439,7 @@ deps = { > }, > > 'third_party/protobuf': { >- 'url': '{chromium_git}/chromium/src/third_party/protobuf@5227e7d8309e231f8b7a61edd9d63d5446ca0b0b', >+ 'url': '{chromium_git}/chromium/src/third_party/protobuf@2dc9e853e138fdec5d56bf750c180ebb2365639e', > 'condition': 'not build_with_chromium', > }, > >@@ -496,7 +496,7 @@ deps = { > }, > > 'third_party/SwiftShader': { >- 'url': '{swiftshader_git}/SwiftShader@f354daff5a2b882fc182c8377c826aa99b30f989', >+ 'url': '{swiftshader_git}/SwiftShader@bca23447ad4667a7b79973569ab5d8d905d211ac', > 'condition': 'not build_with_chromium', > }, > >@@ -504,7 +504,7 @@ deps = { > 'packages': [ > { > 'package': 'chromium/third_party/turbine', >- 'version': 'RGxvdzLaS73gQOXCTgq7CWKsqCgrXDPPL0Pcxz6oGbQC', >+ 'version': 'RkSl7-UvBXltU55m5zi387oPTAJqTj3Oz6nIpQkOI4wC', > }, > ], > 'condition': 'checkout_android and not build_with_chromium', >@@ -516,7 +516,7 @@ deps = { > }, > > 'third_party/vulkan-deps': { >- 'url': '{chromium_git}/vulkan-deps@5568048d205e0758955789b263c830d12b73c29a', >+ 'url': '{chromium_git}/vulkan-deps@a19b5047ffcafc95fcba3f39e53f229acca6debc', > 'condition': 'not build_with_chromium', > }, > >@@ -526,17 +526,17 @@ deps = { > }, > > 'third_party/zlib': { >- 'url': '{chromium_git}/chromium/src/third_party/zlib@efd9399ae01364926be2a38946127fdf463480db', >+ 'url': '{chromium_git}/chromium/src/third_party/zlib@fc5cfd78a357d5bb7735a58f383634faaafe706a', > 'condition': 'not build_with_chromium', > }, > > 'tools/android/errorprone_plugin': { >- 'url': '{chromium_git}/chromium/src/tools/android/errorprone_plugin@e81dcab66095e6eec2cde2f76720b9a82c96d793', >+ 'url': '{chromium_git}/chromium/src/tools/android/errorprone_plugin@16a66294aedc637ae317abc25e0ca71c4f4180c0', > 'condition': 'checkout_android and not build_with_chromium', > }, > > 'tools/clang': { >- 'url': '{chromium_git}/chromium/src/tools/clang.git@a08f55296ba9347547944fe7657d71d35e343c3f', >+ 'url': '{chromium_git}/chromium/src/tools/clang.git@b93ee79874a76bf9c74264ef736f05a760c5dea3', > 'condition': 'not build_with_chromium', > }, > >@@ -567,7 +567,7 @@ deps = { > }, > > 'tools/mb': { >- 'url': '{chromium_git}/chromium/src/tools/mb@34acefcf6ecf40a4868741252f47dea797528426', >+ 'url': '{chromium_git}/chromium/src/tools/mb@cae500a68524958dfcff76da21b96ad0bdffa37d', > 'condition': 'not build_with_chromium', > }, > >@@ -577,12 +577,12 @@ deps = { > }, > > 'tools/memory': { >- 'url': '{chromium_git}/chromium/src/tools/memory@0639a8c19c66272f5064fcaf4e60ca1d03a84976', >+ 'url': '{chromium_git}/chromium/src/tools/memory@5b5485d9df586b17d0a25d668989b2fb0174f334', > 'condition': 'not build_with_chromium', > }, > > 'tools/perf': { >- 'url': '{chromium_git}/chromium/src/tools/perf@97f0806150e0db4978fd3c16ab7aa311575ed8f5', >+ 'url': '{chromium_git}/chromium/src/tools/perf@7c555d7184ee75ba59ace8ccda5cb3c26881f2fb', > 'condition': 'not build_with_chromium', > }, > >@@ -592,7 +592,7 @@ deps = { > }, > > 'tools/python': { >- 'url': '{chromium_git}/chromium/src/tools/python@d17f53e496b179d7b8c65ab4c921d6fd9328b8e7', >+ 'url': '{chromium_git}/chromium/src/tools/python@a21ec45e2dcff5a1620c0951652b47c4a060748d', > 'condition': 'checkout_android and not build_with_chromium', > }, > >@@ -600,7 +600,7 @@ deps = { > 'packages': [ > { > 'package': 'skia/tools/goldctl/linux-amd64', >- 'version': '2z57AgaznK-BN6rC-A4ZVj85ldJOjFFCMFQ_LYWeUv4C', >+ 'version': 'a94AbgYafC6yjxWNmJJ4cHUWWXNhjFUQLcU79HycYjkC', > }, > ], > 'dep_type': 'cipd', >@@ -611,18 +611,29 @@ deps = { > 'packages': [ > { > 'package': 'skia/tools/goldctl/windows-amd64', >- 'version': 'SSrgf0lBIrCHRZ2acvLwXzzm4KTPzRg17PGIiqsMxBQC', >+ 'version': '3uvz7bDTL-QoL5KPX-caB_HxcvVE7JamyMibu71hqHAC', > }, > ], > 'dep_type': 'cipd', > 'condition': 'checkout_win and not build_with_chromium', > }, > >- 'tools/skia_goldctl/mac': { >+ 'tools/skia_goldctl/mac_amd64': { > 'packages': [ > { > 'package': 'skia/tools/goldctl/mac-amd64', >- 'version': 'zLP4FDegN-yg3uvzWUdf4zNRVHDwHd0VLm86FkZCP_MC', >+ 'version': 'IEdOBXQmFOksbZa16aKIWU6uYVYJlgvPwyX3wktMkkIC', >+ }, >+ ], >+ 'dep_type': 'cipd', >+ 'condition': 'checkout_mac and not build_with_chromium', >+ }, >+ >+ 'tools/skia_goldctl/mac_arm64': { >+ 'packages': [ >+ { >+ 'package': 'skia/tools/goldctl/mac-arm64', >+ 'version': 'XtI7k09JHcA8aaaRNlOF92uDqOXfr8HMmepwH0q9uk0C', > }, > ], > 'dep_type': 'cipd', >@@ -639,7 +650,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/aliexpress', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -649,7 +660,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/among_us', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -659,7 +670,17 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/angry_birds_2_1500', >- 'version': 'version:1', >+ 'version': 'version:5', >+ }, >+ ], >+ 'dep_type': 'cipd', >+ 'condition': 'checkout_angle_restricted_traces', >+ }, >+ 'src/tests/restricted_traces/angry_birds_2_launch': { >+ 'packages': [ >+ { >+ 'package': 'angle/traces/angry_birds_2_launch', >+ 'version': 'version:7', > }, > ], > 'dep_type': 'cipd', >@@ -669,7 +690,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/arena_of_valor', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -679,7 +700,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/asphalt_8', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -689,7 +710,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/asphalt_9', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -699,7 +720,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/avakin_life', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -709,7 +730,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/aztec_ruins', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -719,7 +740,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/badland', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -729,7 +750,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/beach_buggy_racing', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -739,7 +760,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/blockman_go', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -749,7 +770,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/brawl_stars', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -759,7 +780,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/bricks_breaker_quest', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -769,7 +790,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/bubble_shooter', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -779,7 +800,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/bus_simulator_indonesia', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -789,7 +810,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/call_break_offline_card_game', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -799,7 +820,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/candy_crush_500', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -809,7 +830,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/candy_crush_soda_saga', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -819,7 +840,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/car_parking_multiplayer', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -829,7 +850,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/clash_of_clans', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -839,7 +860,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/clash_royale', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -849,7 +870,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/cod_mobile', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -859,7 +880,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/coin_master', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -869,7 +890,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/command_and_conquer_rivals', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -879,7 +900,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/cookie_run_kingdom', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -889,7 +910,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/disney_tsum_tsum', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -899,7 +920,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/dota_underlords', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -909,7 +930,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/dr_driving', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -919,7 +940,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/dragon_ball_legends', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -929,7 +950,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/dragon_raja', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -939,7 +960,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/efootball_pes_2021', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -949,7 +970,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/egypt_1500', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -959,7 +980,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/eight_ball_pool', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -969,7 +990,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/extreme_car_driving_simulator', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -979,7 +1000,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/fallout_shelter_online', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -989,7 +1010,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/farm_heroes_saga', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -999,7 +1020,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/fate_grand_order', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1009,7 +1030,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/fifa_mobile', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1019,7 +1040,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/final_fantasy', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1029,7 +1050,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/free_fire', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1039,7 +1060,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/gardenscapes', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1049,7 +1070,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/genshin_impact', >- 'version': 'version:2', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1059,7 +1080,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/google_maps', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1069,7 +1090,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/happy_color', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1079,7 +1100,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/hay_day', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1089,7 +1110,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/hearthstone', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1099,7 +1120,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/higgs_domino_island', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1109,7 +1130,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/hill_climb_racing', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1119,7 +1140,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/homescapes', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1129,7 +1150,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/idle_heroes', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1139,7 +1160,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/junes_journey', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1149,7 +1170,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/kartrider_rush', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1159,7 +1180,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/klondike_adventures', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1169,7 +1190,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/league_of_legends_wild_rift', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1179,7 +1200,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/lego_legacy', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1189,7 +1210,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/lineage_m', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1199,7 +1220,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/ludo_king', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1209,7 +1230,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/magic_tiles_3', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1219,7 +1240,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/manhattan_10', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1229,7 +1250,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/manhattan_31', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1239,7 +1260,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/mario_kart_tour', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1249,7 +1270,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/marvel_contest_of_champions', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1259,7 +1280,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/messenger_lite', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1269,7 +1290,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/minecraft', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1279,7 +1300,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/mini_world', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1289,7 +1310,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/mobile_legends', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1299,7 +1320,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/my_talking_tom2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1309,7 +1330,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/my_talking_tom_friends', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1319,7 +1340,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/nba2k20_800', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1329,7 +1350,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/nier_reincarnation', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1339,7 +1360,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/one_punch_man', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1349,7 +1370,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/plants_vs_zombies_2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1359,7 +1380,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/pokemon_go', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1369,7 +1390,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/pokemon_unite', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1379,7 +1400,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/professional_baseball_spirits', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1389,7 +1410,17 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/pubg_mobile_battle_royale', >- 'version': 'version:1', >+ 'version': 'version:5', >+ }, >+ ], >+ 'dep_type': 'cipd', >+ 'condition': 'checkout_angle_restricted_traces', >+ }, >+ 'src/tests/restricted_traces/pubg_mobile_launch': { >+ 'packages': [ >+ { >+ 'package': 'angle/traces/pubg_mobile_launch', >+ 'version': 'version:6', > }, > ], > 'dep_type': 'cipd', >@@ -1399,7 +1430,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/pubg_mobile_lite', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1409,7 +1440,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/pubg_mobile_skydive', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1419,7 +1450,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/ragnarok_m_eternal_love', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1429,7 +1460,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/raid_shadow_legends', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1439,7 +1470,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/real_commando_secret_mission', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1449,7 +1480,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/real_cricket_20', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1459,6 +1490,16 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/real_gangster_crime', >+ 'version': 'version:5', >+ }, >+ ], >+ 'dep_type': 'cipd', >+ 'condition': 'checkout_angle_restricted_traces', >+ }, >+ 'src/tests/restricted_traces/respawnables': { >+ 'packages': [ >+ { >+ 'package': 'angle/traces/respawnables', > 'version': 'version:1', > }, > ], >@@ -1469,7 +1510,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/rise_of_kingdoms', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1479,7 +1520,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/romancing_saga', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1489,7 +1530,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/rope_hero_vice_town', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1499,7 +1540,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/saint_seiya_awakening', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1509,7 +1550,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/sakura_school_simulator', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1519,7 +1560,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/scrabble_go', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1529,7 +1570,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/shadow_fight_2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1539,7 +1580,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/slingshot_test1', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1549,7 +1590,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/slingshot_test2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1559,7 +1600,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/sniper_3d', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1569,7 +1610,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/sonic_the_hedgehog', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1579,7 +1620,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/standoff_2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1589,7 +1630,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/subway_princess_runner', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1599,7 +1640,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/subway_surfers', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1609,7 +1650,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/summoners_war', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1619,7 +1660,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/talking_tom_hero_dash', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1629,7 +1670,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/temple_run_2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1639,7 +1680,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/temple_run_300', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1649,7 +1690,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/toon_blast', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1659,7 +1700,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/township', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1669,7 +1710,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/trex_200', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1679,7 +1720,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/whatsapp', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1689,7 +1730,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/words_with_friends_2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1699,7 +1740,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/wordscapes', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1709,7 +1750,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/world_cricket_championship_2', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1719,7 +1760,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/world_of_kings', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1729,7 +1770,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/world_of_tanks_blitz', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1739,7 +1780,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/world_war_doh', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1749,7 +1790,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/worms_zone_io', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >@@ -1759,7 +1800,7 @@ deps = { > 'packages': [ > { > 'package': 'angle/traces/zillow', >- 'version': 'version:1', >+ 'version': 'version:5', > }, > ], > 'dep_type': 'cipd', >diff --git a/Source/ThirdParty/ANGLE/GL.cmake b/Source/ThirdParty/ANGLE/GL.cmake >index e0c39c5882d235fc5a2c2d1e324f4793df204024..1d8d1d7465979079a742d931668a5aa6fe693634 100644 >--- a/Source/ThirdParty/ANGLE/GL.cmake >+++ b/Source/ThirdParty/ANGLE/GL.cmake >@@ -10,6 +10,15 @@ > > > >+if(angle_has_build AND ozone_platform_gbm) >+ >+ >+endif() >+ >+ >+declare_args() { >+ set(angle_enable_gl_nulltrue >+endif() > > > set(_gl_backend_sources >@@ -163,6 +172,10 @@ if(ozone_platform_gbm) > "src/libANGLE/renderer/gl/egl/gbm/SurfaceGbm.cpp" > "src/libANGLE/renderer/gl/egl/gbm/SurfaceGbm.h" > ) >+ >+ pkg_config("src/libANGLE/renderer/gl/libdrm") { >+ set(packages "src/libANGLE/renderer/gl/libdrm" ) >+ endif() > endif() > > >diff --git a/Source/ThirdParty/ANGLE/Metal.cmake b/Source/ThirdParty/ANGLE/Metal.cmake >index b65fff4ebfb560bcb6df5838dedcd0cfe0d3baeb..cc55eb7602f4cb260ea950227d66da9a101c49ab 100644 >--- a/Source/ThirdParty/ANGLE/Metal.cmake >+++ b/Source/ThirdParty/ANGLE/Metal.cmake >@@ -64,6 +64,7 @@ set(_metal_backend_sources > "src/libANGLE/renderer/metal/mtl_common.mm" > "src/libANGLE/renderer/metal/mtl_context_device.h" > "src/libANGLE/renderer/metal/mtl_context_device.mm" >+ "src/libANGLE/renderer/metal/mtl_default_shaders_compiled.inc" > "src/libANGLE/renderer/metal/mtl_format_table_autogen.mm" > "src/libANGLE/renderer/metal/mtl_format_utils.h" > "src/libANGLE/renderer/metal/mtl_format_utils.mm" >diff --git a/Source/ThirdParty/ANGLE/README.md b/Source/ThirdParty/ANGLE/README.md >index c0813abb1a35c6629e7be75af5b1e016b4dfb8b0..37f707e5194bc4fbc18ab9bd7c723c91f584e5ed 100644 >--- a/Source/ThirdParty/ANGLE/README.md >+++ b/Source/ThirdParty/ANGLE/README.md >@@ -22,7 +22,7 @@ Metal and MacOS, Chrome OS, and Fuchsia support. > | Windows | complete | complete | complete | complete | complete | | > | Linux | | | complete | | complete | | > | Mac OS X | | | complete | | | in progress | >-| iOS | | | | | | planned | >+| iOS | | | | | | in progress | > | Chrome OS | | | | complete | planned | | > | Android | | | | complete | complete | | > | GGP (Stadia) | | | | | complete | | >diff --git a/Source/ThirdParty/ANGLE/changes.diff b/Source/ThirdParty/ANGLE/changes.diff >index 4444a56ec499a40a153321109eecd3c368d3a172..fee395221b05bb0659d29df7a5ec7ad6801219d4 100644 >--- a/Source/ThirdParty/ANGLE/changes.diff >+++ b/Source/ThirdParty/ANGLE/changes.diff >@@ -1,5 +1,5 @@ > diff --git a/.gitignore b/.gitignore >-index 5502cca..fdabb39 100644 >+index 5502ccac6..fdabb391f 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -63,6 +63,7 @@ >@@ -10,135 +10,27 @@ index 5502cca..fdabb39 100644 > /third_party/rapidjson/src > /third_party/requests/src > /third_party/six >-diff --git a/include/platform/FeaturesMtl.h b/include/platform/FeaturesMtl.h >-index 7d9aec2..165bb47 100644 >---- a/include/platform/FeaturesMtl.h >-+++ b/include/platform/FeaturesMtl.h >-@@ -21,11 +21,6 @@ struct FeaturesMtl : FeatureSetBase >- "has_base_vertex_instanced_draw", FeatureCategory::MetalFeatures, >- "The renderer supports base vertex instanced draw", &members}; >- >-- // Support depth texture filtering >-- Feature hasDepthTextureFiltering = { >-- "has_depth_texture_filtering", FeatureCategory::MetalFeatures, >-- "The renderer supports depth texture's filtering other than nearest", &members}; >-- >- // Support explicit memory barrier >- Feature hasExplicitMemBarrier = {"has_explicit_mem_barrier_mtl", FeatureCategory::MetalFeatures, >- "The renderer supports explicit memory barrier", &members}; >-diff --git a/scripts/code_generation_hashes/Metal_format_table.json b/scripts/code_generation_hashes/Metal_format_table.json >-index 49bfa90..bf68a8b 100644 >---- a/scripts/code_generation_hashes/Metal_format_table.json >-+++ b/scripts/code_generation_hashes/Metal_format_table.json >-@@ -4,9 +4,9 @@ >- "src/libANGLE/renderer/angle_format_map.json": >- "951e1bceaba86eecb5c23173e897d092", >- "src/libANGLE/renderer/metal/gen_mtl_format_table.py": >-- "1d6c9a286282b37a94acbf7fa35d97b1", >-+ "cf0f32a98630ef4dabcf203c66d8e4ff", >- "src/libANGLE/renderer/metal/mtl_format_map.json": >-- "9199f9f2cf9bd7eb218a2bba3a7c0177", >-+ "04a80596b75c287f525dac9769219cb2", >- "src/libANGLE/renderer/metal/mtl_format_table_autogen.mm": >-- "abd7d711b401b1fb4a21053046f40fb0" >-+ "b413ae3c84956871988e5e01cc1c92ce" >- } >-\ No newline at end of file >-diff --git a/scripts/create-symlink-to-altroot.sh b/scripts/create-symlink-to-altroot.sh >-new file mode 100755 >-index 0000000..d5293a0 >+diff --git a/scripts/code_generation_hashes/Metal_format_table.json.orig b/scripts/code_generation_hashes/Metal_format_table.json.orig >+new file mode 100644 >+index 000000000..88da14f1f > --- /dev/null >-+++ b/scripts/create-symlink-to-altroot.sh >-@@ -0,0 +1,30 @@ >-+#!/bin/zsh >-+ >-+set -e >-+ >-+if [[ -z "${OUTPUT_ALTERNATE_ROOT_PATH}" ]]; then >-+ exit 0 >-+fi >-+ >-+if [[ "${SKIP_INSTALL}" = "YES" ]]; then >-+ exit 0 >-+fi >-+ >-+# Convert eg. `/System/Library/PrivateFrameworks` to `../../..` >-+RELATIVE_PATH_FROM_SYMLINK_TO_ROOT=$(echo "${ALTERNATE_ROOT_PATH}" | sed -E -e "s/\/[a-zA-Z0-9_]+/..\//g" -e "s/\/$//") >-+SYMLINK_VALUE="${RELATIVE_PATH_FROM_SYMLINK_TO_ROOT}${INSTALL_PATH}/${FULL_PRODUCT_NAME}" >-+ >-+if [[ -L "${OUTPUT_ALTERNATE_ROOT_PATH}" ]]; then >-+ EXISTING_SYMLINK_VALUE=$(readlink "${OUTPUT_ALTERNATE_ROOT_PATH}") >-+ >-+ if [[ "${EXISTING_SYMLINK_VALUE}" == "${SYMLINK_VALUE}" ]]; then >-+ exit 0 >-+ fi >-+ >-+ echo "warning: existing symlink is incorrect; expected ${SYMLINK_VALUE}, got ${EXISTING_SYMLINK_VALUE}" >-+elif [[ -e "${OUTPUT_ALTERNATE_ROOT_PATH}" ]]; then >-+ echo "error: expected a symlink at ${OUTPUT_ALTERNATE_ROOT_PATH}" >-+ exit 1 >-+fi >-+ >-+ln -sf "${SYMLINK_VALUE}" "${OUTPUT_ALTERNATE_ROOT_PATH}" >-diff --git a/scripts/run_code_generation.py b/scripts/run_code_generation.py >-index 9710b2e..c0a9a13 100755 >---- a/scripts/run_code_generation.py >-+++ b/scripts/run_code_generation.py >-@@ -13,6 +13,7 @@ import os >- import subprocess >- import sys >- import platform >-+import argparse >- >- script_dir = sys.path[0] >- root_dir = os.path.abspath(os.path.join(script_dir, '..')) >-@@ -214,11 +215,31 @@ def main(): >- all_new_hashes = {} >- any_dirty = False >- >-- verify_only = False >-- if len(sys.argv) > 1 and sys.argv[1] == '--verify-no-dirty': >-- verify_only = True >-+ parser = argparse.ArgumentParser(description='Generate ANGLE internal code.') >-+ parser.add_argument( >-+ '-v', >-+ '--verify-no-dirty', >-+ dest='verify_only', >-+ type=bool, >-+ help='verify hashes are not dirty') >-+ parser.add_argument( >-+ '-g', '--generator', action='append', nargs='*', type=str, dest='specifiedGenerators'), >-+ >-+ args = parser.parse_args() >-+ filteredGenerators = args.specifiedGenerators[0] >-+ verify_only = args.verify_only >-+ ranGenerators = {} >-+ >-+ if (filteredGenerators): >-+ ranGenerators = {k: v for k, v in generators.items() if k in filteredGenerators} >-+ else: >-+ ranGenerators = generators >-+ >-+ if (len(ranGenerators) == 0): >-+ print("No valid generators specified.") >-+ return -1 >- >-- for name, script in sorted(generators.items()): >-+ for name, script in sorted(ranGenerators.items()): >- info = auto_script(script) >- fname = get_hash_file_name(name) >- filenames = info['inputs'] + info['outputs'] + [script] >-@@ -257,7 +278,7 @@ def main(): >- sys.exit(1) >- >- # Update the output hashes again since they can be formatted. >-- for name, script in sorted(generators.items()): >-+ for name, script in sorted(ranGenerators.items()): >- info = auto_script(script) >- fname = get_hash_file_name(name) >- update_output_hashes(name, info['outputs'], all_new_hashes[fname]) >++++ b/scripts/code_generation_hashes/Metal_format_table.json.orig >+@@ -0,0 +1,12 @@ >++{ >++ "src/libANGLE/renderer/angle_format.py": >++ "2f8fa768088e22b0963bbdf842d3e725", >++ "src/libANGLE/renderer/angle_format_map.json": >++ "951e1bceaba86eecb5c23173e897d092", >++ "src/libANGLE/renderer/metal/gen_mtl_format_table.py": >++ "abb2300e5d9d70931e2497f820f64bd5", >++ "src/libANGLE/renderer/metal/mtl_format_map.json": >++ "8ee95dde69a2f04973ea19434e4f9f3e", >++ "src/libANGLE/renderer/metal/mtl_format_table_autogen.mm": >++ "dc15669905799afab8b22bdf400417ca" >++} >+\ No newline at end of file > diff --git a/src/common/utilities.cpp b/src/common/utilities.cpp >-index ebe282c..758fb06 100644 >+index ebe282c58..758fb06c4 100644 > --- a/src/common/utilities.cpp > +++ b/src/common/utilities.cpp > @@ -6,6 +6,12 @@ >@@ -155,7 +47,7 @@ index ebe282c..758fb06 100644 > #include "GLES3/gl3.h" > #include "common/mathutil.h" > diff --git a/src/compiler/preprocessor/preprocessor_tab_autogen.cpp b/src/compiler/preprocessor/preprocessor_tab_autogen.cpp >-index 4711774..9eab1b3 100644 >+index 4711774cd..9eab1b361 100644 > --- a/src/compiler/preprocessor/preprocessor_tab_autogen.cpp > +++ b/src/compiler/preprocessor/preprocessor_tab_autogen.cpp > @@ -1,5 +1,8 @@ >@@ -168,7 +60,7 @@ index 4711774..9eab1b3 100644 > > Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, > diff --git a/src/compiler/translator/CodeGen.cpp b/src/compiler/translator/CodeGen.cpp >-index 497ef88..47213c9 100644 >+index 497ef881e..47213c904 100644 > --- a/src/compiler/translator/CodeGen.cpp > +++ b/src/compiler/translator/CodeGen.cpp > @@ -23,6 +23,9 @@ >@@ -181,56 +73,19 @@ index 497ef88..47213c9 100644 > > #ifdef ANGLE_ENABLE_METAL_SPIRV > # include "compiler/translator/TranslatorMetal.h" >-diff --git a/src/compiler/translator/TranslatorMetal.cpp b/src/compiler/translator/TranslatorMetal.cpp >-index 7ac4749..d25b72a 100644 >---- a/src/compiler/translator/TranslatorMetal.cpp >-+++ b/src/compiler/translator/TranslatorMetal.cpp >-@@ -32,13 +32,6 @@ >- namespace sh >- { >- >--namespace mtl >--{ >--/** extern */ >--const char kCoverageMaskEnabledConstName[] = "ANGLECoverageMaskEnabled"; >--const char kRasterizerDiscardEnabledConstName[] = "ANGLERasterizerDisabled"; >--} // namespace mtl >-- >- namespace >- { >- > diff --git a/src/compiler/translator/TranslatorMetalConstantNames.cpp b/src/compiler/translator/TranslatorMetalConstantNames.cpp >-new file mode 100644 >-index 0000000..515cc6e >---- /dev/null >+index b1352fa26..ac230b1f6 100644 >+--- a/src/compiler/translator/TranslatorMetalConstantNames.cpp > +++ b/src/compiler/translator/TranslatorMetalConstantNames.cpp >-@@ -0,0 +1,24 @@ >-+// >+@@ -1,5 +1,5 @@ >+ // >+-// Copyright 2022 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. >-+// >-+// TranslatorMetalConstantNames: >-+// Implementation of constant values used in both translator >-+// backends. >-+ >-+#include <stdio.h> >-+ >-+#include "GLSLANG/ShaderLang.h" >-+ >-+namespace sh >-+{ >-+ >-+namespace mtl >-+{ >-+/** extern */ >-+const char kCoverageMaskEnabledConstName[] = "ANGLECoverageMaskEnabled"; >-+const char kRasterizerDiscardEnabledConstName[] = "ANGLERasterizerDisabled"; >-+} // namespace mtl >-+ >-+} // namespace sh >+ // Use of this source code is governed by a BSD-style license that can be >+ // found in the LICENSE file. >+ // > diff --git a/src/compiler/translator/TranslatorMetalDirect.cpp b/src/compiler/translator/TranslatorMetalDirect.cpp >-index 2e143ba..9da5ad2 100644 >+index 7f665c130..595810150 100644 > --- a/src/compiler/translator/TranslatorMetalDirect.cpp > +++ b/src/compiler/translator/TranslatorMetalDirect.cpp > @@ -950,7 +950,6 @@ bool TranslatorMetalDirect::translateImpl(TInfoSinkBase &sink, >@@ -242,10 +97,10 @@ index 2e143ba..9da5ad2 100644 > { > if (!ReplaceVariable(this, root, BuiltInVariable::gl_VertexIndex(), &kgl_VertexIDMetal)) > diff --git a/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp b/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp >-index e13d6e7..f9bb4e9 100644 >+index 019cfcf98..25c911e76 100644 > --- a/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp > +++ b/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp >-@@ -1738,7 +1738,6 @@ void GenMetalTraverser::emitFunctionSignature(const TFunction &func) >+@@ -1740,7 +1740,6 @@ void GenMetalTraverser::emitFunctionSignature(const TFunction &func) > const TVariable ¶m = *func.getParam(i); > emitFunctionParameter(func, param); > } >@@ -255,7 +110,7 @@ index e13d6e7..f9bb4e9 100644 > mOut << " @@XFB-Bindings@@ "; > diff --git a/src/compiler/translator/TranslatorMetalDirect/EnvironmentVariable.h b/src/compiler/translator/TranslatorMetalDirect/EnvironmentVariable.h > new file mode 100644 >-index 0000000..d823fc7 >+index 000000000..d823fc728 > --- /dev/null > +++ b/src/compiler/translator/TranslatorMetalDirect/EnvironmentVariable.h > @@ -0,0 +1,45 @@ >@@ -305,7 +160,7 @@ index 0000000..d823fc7 > + > +#endif // COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_ENVIRONMENTVARIABLE_H_ > diff --git a/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp b/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp >-index 81ff272..9d2b43b 100644 >+index 81ff2722f..9d2b43bc0 100644 > --- a/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp > +++ b/src/compiler/translator/TranslatorMetalDirect/IdGen.cpp > @@ -25,7 +25,7 @@ Name IdGen::createNewName(size_t count, >@@ -318,7 +173,7 @@ index 81ff272..9d2b43b 100644 > mNewNameBuffer.clear(); > mNewNameBuffer += '_'; > diff --git a/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp b/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp >-index 7fe13a6..299a2f9 100644 >+index bcc5d6589..60758fbe8 100644 > --- a/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp > +++ b/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp > @@ -601,7 +601,7 @@ class ConvertStructState : angle::NonCopyable >@@ -331,7 +186,7 @@ index 7fe13a6..299a2f9 100644 > } > > diff --git a/src/compiler/translator/glslang_tab_autogen.cpp b/src/compiler/translator/glslang_tab_autogen.cpp >-index 82837bf..2c580b5 100644 >+index 82837bfaf..2c580b5c0 100644 > --- a/src/compiler/translator/glslang_tab_autogen.cpp > +++ b/src/compiler/translator/glslang_tab_autogen.cpp > @@ -1,5 +1,8 @@ >@@ -344,7 +199,7 @@ index 82837bf..2c580b5 100644 > > Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, > diff --git a/src/compiler/translator/glslang_tab_autogen.h b/src/compiler/translator/glslang_tab_autogen.h >-index d2eab0b..2ec2d2c 100644 >+index d2eab0b7b..2ec2d2c44 100644 > --- a/src/compiler/translator/glslang_tab_autogen.h > +++ b/src/compiler/translator/glslang_tab_autogen.h > @@ -1,5 +1,8 @@ >@@ -357,7 +212,7 @@ index d2eab0b..2ec2d2c 100644 > > Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, > diff --git a/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp >-index 55e2f8b..4237558 100644 >+index 55e2f8b97..423755852 100644 > --- a/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp > +++ b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.cpp > @@ -10,6 +10,7 @@ >@@ -376,7 +231,7 @@ index 55e2f8b..4237558 100644 > +#endif > } // namespace sh > diff --git a/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h >-index ad3cc08..75069c5 100644 >+index ad3cc080d..75069c572 100644 > --- a/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h > +++ b/src/compiler/translator/tree_ops/apple/UnfoldShortCircuitAST.h > @@ -11,7 +11,7 @@ >@@ -388,8 +243,48 @@ index ad3cc08..75069c5 100644 > namespace sh > { > >+diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp >+index b67e1f605..7d41a4231 100644 >+--- a/src/libANGLE/Context.cpp >++++ b/src/libANGLE/Context.cpp >+@@ -9193,7 +9193,7 @@ egl::Error Context::setDefaultFramebuffer(egl::Surface *drawSurface, egl::Surfac >+ ASSERT(mCurrentDrawSurface == nullptr); >+ ASSERT(mCurrentReadSurface == nullptr); >+ >+- Framebuffer *newDefaultFramebuffer = nullptr; >++ std::unique_ptr<gl::Framebuffer> newDefaultFramebuffer; >+ >+ mCurrentDrawSurface = drawSurface; >+ mCurrentReadSurface = readSurface; >+@@ -9205,7 +9205,7 @@ egl::Error Context::setDefaultFramebuffer(egl::Surface *drawSurface, egl::Surfac >+ } >+ else >+ { >+- newDefaultFramebuffer = new Framebuffer(this, mImplementation.get(), readSurface); >++ newDefaultFramebuffer = std::make_unique<gl::Framebuffer>(this, mImplementation.get(), readSurface); >+ } >+ ASSERT(newDefaultFramebuffer); >+ >+@@ -9216,14 +9216,14 @@ egl::Error Context::setDefaultFramebuffer(egl::Surface *drawSurface, egl::Surfac >+ >+ // Update default framebuffer, the binding of the previous default >+ // framebuffer (or lack of) will have a nullptr. >+- mState.mFramebufferManager->setDefaultFramebuffer(newDefaultFramebuffer); >++ mState.mFramebufferManager->setDefaultFramebuffer(newDefaultFramebuffer.release()); >+ if (mState.getDrawFramebuffer() == nullptr) >+ { >+- bindDrawFramebuffer(newDefaultFramebuffer->id()); >++ bindDrawFramebuffer(mState.mFramebufferManager->getDefaultFramebuffer()->id()); >+ } >+ if (mState.getReadFramebuffer() == nullptr) >+ { >+- bindReadFramebuffer(newDefaultFramebuffer->id()); >++ bindReadFramebuffer(mState.mFramebufferManager->getDefaultFramebuffer()->id()); >+ } >+ >+ return egl::NoError(); > diff --git a/src/libANGLE/State.cpp b/src/libANGLE/State.cpp >-index 1535a99..a6016d5 100644 >+index 2f7c3dce6..4a87f0d29 100644 > --- a/src/libANGLE/State.cpp > +++ b/src/libANGLE/State.cpp > @@ -6,6 +6,9 @@ >@@ -402,181 +297,53 @@ index 1535a99..a6016d5 100644 > #include "libANGLE/State.h" > > #include <string.h> >-diff --git a/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp b/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp >-new file mode 100644 >-index 0000000..801e604 >---- /dev/null >-+++ b/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp >-@@ -0,0 +1,81 @@ >-+// >-+// Copyright 2021 The ANGLE Project Authors. All rights reserved. >-+// Use of this source code is governed by a BSD-style license that can be >-+// found in the LICENSE file. >-+// >-+// ShaderInterfaceVariableInfoMap.cpp: >-+// Implements helper class for shader compilers >-+// >-+ >-+#include "libANGLE/renderer/ShaderInterfaceVariableInfoMap.h" >-+namespace rx >-+{ >-+ >-+const uint32_t ShaderInterfaceVariableInfo::kInvalid; >-+ >-+ShaderInterfaceVariableInfo::ShaderInterfaceVariableInfo() {} >-+ >-+// ShaderInterfaceVariableInfoMap implementation. >-+ShaderInterfaceVariableInfoMap::ShaderInterfaceVariableInfoMap() = default; >-+ >-+ShaderInterfaceVariableInfoMap::~ShaderInterfaceVariableInfoMap() = default; >-+ >-+void ShaderInterfaceVariableInfoMap::clear() >-+{ >-+ for (VariableNameToInfoMap &shaderMap : mData) >-+ { >-+ shaderMap.clear(); >-+ } >-+} >-+ >-+bool ShaderInterfaceVariableInfoMap::contains(gl::ShaderType shaderType, >-+ const std::string &variableName) const >-+{ >-+ return mData[shaderType].find(variableName) != mData[shaderType].end(); >-+} >-+ >-+const ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::get( >-+ gl::ShaderType shaderType, >-+ const std::string &variableName) const >-+{ >-+ auto it = mData[shaderType].find(variableName); >-+ ASSERT(it != mData[shaderType].end()); >-+ return it->second; >-+} >-+ >-+ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::get(gl::ShaderType shaderType, >-+ const std::string &variableName) >-+{ >-+ auto it = mData[shaderType].find(variableName); >-+ ASSERT(it != mData[shaderType].end()); >-+ return it->second; >-+} >-+ >-+void ShaderInterfaceVariableInfoMap::markAsDuplicate(gl::ShaderType shaderType, >-+ const std::string &variableName) >-+{ >-+ ASSERT(contains(shaderType, variableName)); >-+ mData[shaderType][variableName].isDuplicate = true; >-+} >-+ >-+ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::add(gl::ShaderType shaderType, >-+ const std::string &variableName) >-+{ >-+ ASSERT(!contains(shaderType, variableName)); >-+ return mData[shaderType][variableName]; >-+} >-+ >-+ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::addOrGet( >-+ gl::ShaderType shaderType, >-+ const std::string &variableName) >-+{ >-+ return mData[shaderType][variableName]; >-+} >-+ >-+ShaderInterfaceVariableInfoMap::Iterator ShaderInterfaceVariableInfoMap::getIterator( >-+ gl::ShaderType shaderType) const >-+{ >-+ return Iterator(mData[shaderType].begin(), mData[shaderType].end()); >-+} >-+ >-+} // namespace rx >-diff --git a/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h b/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h >-new file mode 100644 >-index 0000000..851985a >---- /dev/null >-+++ b/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h >-@@ -0,0 +1,63 @@ >-+// >-+// Copyright 2021 The ANGLE Project Authors. All rights reserved. >-+// Use of this source code is governed by a BSD-style license that can be >-+// found in the LICENSE file. >-+// >-+// Header for the shared ShaderInterfaceVariableInfoMap class, used by both the >-+// Metal and Direct Metal backends. >-+#ifndef ShaderInterfaceVariableInfoMap_hpp >-+#define ShaderInterfaceVariableInfoMap_hpp >-+ >-+#include <functional> >-+ >-+#include <stdio.h> >-+#include "libANGLE/renderer/ProgramImpl.h" >-+#include "libANGLE/renderer/glslang_wrapper_utils.h" >-+#include "libANGLE/renderer/renderer_utils.h" >-+namespace rx >-+{ >-+ >-+// TODO: http://anglebug.com/4524: Need a different hash key than a string, since that's slow to >-+// calculate. >-+class ShaderInterfaceVariableInfoMap final : angle::NonCopyable >-+{ >-+ public: >-+ ShaderInterfaceVariableInfoMap(); >-+ ~ShaderInterfaceVariableInfoMap(); >-+ >-+ void clear(); >-+ bool contains(gl::ShaderType shaderType, const std::string &variableName) const; >-+ const ShaderInterfaceVariableInfo &get(gl::ShaderType shaderType, >-+ const std::string &variableName) const; >-+ ShaderInterfaceVariableInfo &get(gl::ShaderType shaderType, const std::string &variableName); >-+ ShaderInterfaceVariableInfo &add(gl::ShaderType shaderType, const std::string &variableName); >-+ void markAsDuplicate(gl::ShaderType shaderType, const std::string &variableName); >-+ ShaderInterfaceVariableInfo &addOrGet(gl::ShaderType shaderType, >-+ const std::string &variableName); >-+ size_t variableCount(gl::ShaderType shaderType) const { return mData[shaderType].size(); } >-+ >-+ using VariableNameToInfoMap = angle::HashMap<std::string, ShaderInterfaceVariableInfo>; >-+ >-+ class Iterator final >-+ { >-+ public: >-+ Iterator(VariableNameToInfoMap::const_iterator beginIt, >-+ VariableNameToInfoMap::const_iterator endIt) >-+ : mBeginIt(beginIt), mEndIt(endIt) >-+ {} >-+ VariableNameToInfoMap::const_iterator begin() { return mBeginIt; } >-+ VariableNameToInfoMap::const_iterator end() { return mEndIt; } >-+ >-+ private: >-+ VariableNameToInfoMap::const_iterator mBeginIt; >-+ VariableNameToInfoMap::const_iterator mEndIt; >-+ }; >-+ >-+ Iterator getIterator(gl::ShaderType shaderType) const; >-+ >-+ private: >-+ gl::ShaderMap<VariableNameToInfoMap> mData; >-+}; >-+ >-+} // namespace rx >-+#endif /* ShaderInterfaceVariableInfoMap_hpp */ >+diff --git a/src/libANGLE/Surface.cpp b/src/libANGLE/Surface.cpp >+index 1cd8a00ca..8b2186e63 100644 >+--- a/src/libANGLE/Surface.cpp >++++ b/src/libANGLE/Surface.cpp >+@@ -624,10 +624,10 @@ Error Surface::getBufferAge(const gl::Context *context, EGLint *age) const >+ return mImplementation->getBufferAge(context, age); >+ } >+ >+-gl::Framebuffer *Surface::createDefaultFramebuffer(const gl::Context *context, >++std::unique_ptr<gl::Framebuffer> Surface::createDefaultFramebuffer(const gl::Context *context, >+ egl::Surface *readSurface) >+ { >+- return new gl::Framebuffer(context, this, readSurface); >++ return std::make_unique<gl::Framebuffer>(context, this, readSurface); >+ } >+ >+ gl::InitState Surface::initState(const gl::ImageIndex & /*imageIndex*/) const >+diff --git a/src/libANGLE/Surface.h b/src/libANGLE/Surface.h >+index 98a3b86c0..0856a629b 100644 >+--- a/src/libANGLE/Surface.h >++++ b/src/libANGLE/Surface.h >+@@ -105,7 +105,7 @@ class Surface : public LabeledObject, public gl::FramebufferAttachmentObject >+ void setFixedWidth(EGLint width); >+ void setFixedHeight(EGLint height); >+ >+- gl::Framebuffer *createDefaultFramebuffer(const gl::Context *context, >++ std::unique_ptr<gl::Framebuffer> createDefaultFramebuffer(const gl::Context *context, >+ egl::Surface *readSurface); >+ >+ const Config *getConfig() const; >+@@ -216,8 +216,6 @@ class Surface : public LabeledObject, public gl::FramebufferAttachmentObject >+ ~Surface() override; >+ rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; >+ >+- gl::Framebuffer *createDefaultFramebuffer(const Display *display); >+- >+ // ANGLE-only method, used internally >+ friend class gl::Texture; >+ Error releaseTexImageFromTexture(const gl::Context *context); > diff --git a/src/libANGLE/renderer/driver_utils.cpp b/src/libANGLE/renderer/driver_utils.cpp >-index dab8868..bd9753a 100644 >+index bfdf0ff76..6e5097653 100644 > --- a/src/libANGLE/renderer/driver_utils.cpp > +++ b/src/libANGLE/renderer/driver_utils.cpp >-@@ -146,6 +146,8 @@ const char *GetVendorString(uint32_t vendorId) >- return "ARM"; >- case VENDOR_ID_APPLE: >- return "Apple"; >-+ case VENDOR_ID_MICROSOFT: >-+ return "Microsoft"; >- case VENDOR_ID_BROADCOM: >- return "Broadcom"; >- case VENDOR_ID_GOOGLE: >-@@ -160,6 +162,12 @@ const char *GetVendorString(uint32_t vendorId) >- return "Imagination Technologies"; >- case VENDOR_ID_QUALCOMM: >+@@ -164,6 +164,10 @@ const char *GetVendorString(uint32_t vendorId) > return "Qualcomm"; >-+ case VENDOR_ID_SAMSUNG: >-+ return "Samsung"; >+ case VENDOR_ID_SAMSUNG: >+ return "Samsung Electronics Co., Ltd."; > + case VENDOR_ID_VMWARE: > + return "VMware"; > + case VENDOR_ID_VIVANTE: >@@ -585,7 +352,7 @@ index dab8868..bd9753a 100644 > return "Test"; > case 0: > diff --git a/src/libANGLE/renderer/driver_utils.h b/src/libANGLE/renderer/driver_utils.h >-index 382a8be..40629e5 100644 >+index 5860df106..8bc114ca1 100644 > --- a/src/libANGLE/renderer/driver_utils.h > +++ b/src/libANGLE/renderer/driver_utils.h > @@ -21,6 +21,7 @@ enum VendorID : uint32_t >@@ -594,10 +361,10 @@ index 382a8be..40629e5 100644 > VENDOR_ID_ARM = 0x13B5, > + VENDOR_ID_MICROSOFT = 0x1414, > // Broadcom devices won't use PCI, but this is their Vulkan vendor id. >- VENDOR_ID_BROADCOM = 0x14E4, >- VENDOR_ID_GOOGLE = 0x1AE0, >+ VENDOR_ID_BROADCOM = 0x14E4, >+ VENDOR_ID_GOOGLE = 0x1AE0, > diff --git a/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.cpp b/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.cpp >-index a2b44d2..20ec85a 100644 >+index a2b44d2bf..20ec85a50 100644 > --- a/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.cpp > +++ b/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.cpp > @@ -250,12 +250,10 @@ bool IOSurfaceSurfaceCGL::validateAttributes(EGLClientBuffer buffer, >@@ -617,171 +384,8 @@ index a2b44d2..20ec85a 100644 > > return true; > } >-diff --git a/src/libANGLE/renderer/glslang_wrapper_utils.cpp b/src/libANGLE/renderer/glslang_wrapper_utils.cpp >-index ac1799c..91d8dc6 100644 >---- a/src/libANGLE/renderer/glslang_wrapper_utils.cpp >-+++ b/src/libANGLE/renderer/glslang_wrapper_utils.cpp >-@@ -4683,72 +4683,6 @@ UniformBindingInfo::UniformBindingInfo(uint32_t bindingIndex, >- >- UniformBindingInfo::UniformBindingInfo() {} >- >--// ShaderInterfaceVariableInfo implementation. >--ShaderInterfaceVariableInfo::ShaderInterfaceVariableInfo() {} >-- >--// ShaderInterfaceVariableInfoMap implementation. >--ShaderInterfaceVariableInfoMap::ShaderInterfaceVariableInfoMap() = default; >-- >--ShaderInterfaceVariableInfoMap::~ShaderInterfaceVariableInfoMap() = default; >-- >--void ShaderInterfaceVariableInfoMap::clear() >--{ >-- for (VariableNameToInfoMap &shaderMap : mData) >-- { >-- shaderMap.clear(); >-- } >--} >-- >--bool ShaderInterfaceVariableInfoMap::contains(gl::ShaderType shaderType, >-- const std::string &variableName) const >--{ >-- return mData[shaderType].find(variableName) != mData[shaderType].end(); >--} >-- >--const ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::get( >-- gl::ShaderType shaderType, >-- const std::string &variableName) const >--{ >-- auto it = mData[shaderType].find(variableName); >-- ASSERT(it != mData[shaderType].end()); >-- return it->second; >--} >-- >--ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::get(gl::ShaderType shaderType, >-- const std::string &variableName) >--{ >-- auto it = mData[shaderType].find(variableName); >-- ASSERT(it != mData[shaderType].end()); >-- return it->second; >--} >-- >--void ShaderInterfaceVariableInfoMap::markAsDuplicate(gl::ShaderType shaderType, >-- const std::string &variableName) >--{ >-- ASSERT(contains(shaderType, variableName)); >-- mData[shaderType][variableName].isDuplicate = true; >--} >-- >--ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::add(gl::ShaderType shaderType, >-- const std::string &variableName) >--{ >-- ASSERT(!contains(shaderType, variableName)); >-- return mData[shaderType][variableName]; >--} >-- >--ShaderInterfaceVariableInfo &ShaderInterfaceVariableInfoMap::addOrGet( >-- gl::ShaderType shaderType, >-- const std::string &variableName) >--{ >-- return mData[shaderType][variableName]; >--} >-- >--ShaderInterfaceVariableInfoMap::Iterator ShaderInterfaceVariableInfoMap::getIterator( >-- gl::ShaderType shaderType) const >--{ >-- return Iterator(mData[shaderType].begin(), mData[shaderType].end()); >--} >-- >- // Strip indices from the name. If there are non-zero indices, return false to indicate that this >- // image uniform doesn't require set/binding. That is done on index 0. >- bool GetImageNameWithoutIndices(std::string *name) >-diff --git a/src/libANGLE/renderer/glslang_wrapper_utils.h b/src/libANGLE/renderer/glslang_wrapper_utils.h >-index 787193c..3f9cdc6 100644 >---- a/src/libANGLE/renderer/glslang_wrapper_utils.h >-+++ b/src/libANGLE/renderer/glslang_wrapper_utils.h >-@@ -10,13 +10,13 @@ >- #define LIBANGLE_RENDERER_GLSLANG_WRAPPER_UTILS_H_ >- >- #include <functional> >-- >--#include "common/spirv/spirv_types.h" >- #include "libANGLE/renderer/ProgramImpl.h" >- #include "libANGLE/renderer/renderer_utils.h" >- >- namespace rx >- { >-+ >-+class ShaderInterfaceVariableInfoMap; >- constexpr gl::ShaderMap<const char *> kDefaultUniformNames = { >- {gl::ShaderType::Vertex, sh::vk::kDefaultUniformsNameVS}, >- {gl::ShaderType::TessControl, sh::vk::kDefaultUniformsNameTCS}, >-@@ -136,48 +136,6 @@ struct ShaderInterfaceVariableInfo >- bool isDuplicate = false; >- }; >- >--// TODO: http://anglebug.com/4524: Need a different hash key than a string, since that's slow to >--// calculate. >--class ShaderInterfaceVariableInfoMap final : angle::NonCopyable >--{ >-- public: >-- ShaderInterfaceVariableInfoMap(); >-- ~ShaderInterfaceVariableInfoMap(); >-- >-- void clear(); >-- bool contains(gl::ShaderType shaderType, const std::string &variableName) const; >-- const ShaderInterfaceVariableInfo &get(gl::ShaderType shaderType, >-- const std::string &variableName) const; >-- ShaderInterfaceVariableInfo &get(gl::ShaderType shaderType, const std::string &variableName); >-- ShaderInterfaceVariableInfo &add(gl::ShaderType shaderType, const std::string &variableName); >-- void markAsDuplicate(gl::ShaderType shaderType, const std::string &variableName); >-- ShaderInterfaceVariableInfo &addOrGet(gl::ShaderType shaderType, >-- const std::string &variableName); >-- size_t variableCount(gl::ShaderType shaderType) const { return mData[shaderType].size(); } >-- >-- using VariableNameToInfoMap = angle::HashMap<std::string, ShaderInterfaceVariableInfo>; >-- >-- class Iterator final >-- { >-- public: >-- Iterator(VariableNameToInfoMap::const_iterator beginIt, >-- VariableNameToInfoMap::const_iterator endIt) >-- : mBeginIt(beginIt), mEndIt(endIt) >-- {} >-- VariableNameToInfoMap::const_iterator begin() { return mBeginIt; } >-- VariableNameToInfoMap::const_iterator end() { return mEndIt; } >-- >-- private: >-- VariableNameToInfoMap::const_iterator mBeginIt; >-- VariableNameToInfoMap::const_iterator mEndIt; >-- }; >-- >-- Iterator getIterator(gl::ShaderType shaderType) const; >-- >-- private: >-- gl::ShaderMap<VariableNameToInfoMap> mData; >--}; >-- >- bool GetImageNameWithoutIndices(std::string *name); >- >- // Get the mapped sampler name. >-@@ -199,7 +157,7 @@ void GlslangAssignTransformFeedbackLocations(gl::ShaderType shaderType, >- bool isTransformFeedbackStage, >- GlslangProgramInterfaceInfo *programInterfaceInfo, >- ShaderInterfaceVariableInfoMap *variableInfoMapOut); >-- >-+#if ANGLE_ENABLE_METAL_SPIRV >- // Retrieves the compiled SPIR-V code for each shader stage, and calls |GlslangAssignLocations|. >- void GlslangGetShaderSpirvCode(const GlslangSourceOptions &options, >- const gl::ProgramState &programState, >-@@ -212,6 +170,7 @@ angle::Result GlslangTransformSpirvCode(const GlslangSpirvOptions &options, >- const ShaderInterfaceVariableInfoMap &variableInfoMap, >- const angle::spirv::Blob &initialSpirvBlob, >- angle::spirv::Blob *spirvBlobOut); >-+#endif >- >- } // namespace rx >- > diff --git a/src/libANGLE/renderer/metal/BufferMtl.mm b/src/libANGLE/renderer/metal/BufferMtl.mm >-index 279923f..900aea8 100644 >+index 279923ff2..900aea8af 100644 > --- a/src/libANGLE/renderer/metal/BufferMtl.mm > +++ b/src/libANGLE/renderer/metal/BufferMtl.mm > @@ -365,7 +365,7 @@ >@@ -802,8 +406,71 @@ index 279923f..900aea8 100644 > { > maxBuffers = 10; > mBufferPool.setAlwaysUseSharedMem(); >+diff --git a/src/libANGLE/renderer/metal/DisplayMtl.mm b/src/libANGLE/renderer/metal/DisplayMtl.mm >+index 88130a7e6..4f3e55ed0 100644 >+--- a/src/libANGLE/renderer/metal/DisplayMtl.mm >++++ b/src/libANGLE/renderer/metal/DisplayMtl.mm >+@@ -254,9 +254,9 @@ bool IsMetalDisplayAvailable() >+ } >+ } >+ >+- NSMutableArray<id<MTLDevice>> *externalGPUs = [[NSMutableArray alloc] init]; >+- NSMutableArray<id<MTLDevice>> *integratedGPUs = [[NSMutableArray alloc] init]; >+- NSMutableArray<id<MTLDevice>> *discreteGPUs = [[NSMutableArray alloc] init]; >++ auto externalGPUs = mtl::adoptObjCObj<NSMutableArray<id<MTLDevice>>>([[NSMutableArray alloc] init]); >++ auto integratedGPUs = mtl::adoptObjCObj<NSMutableArray<id<MTLDevice>>>([[NSMutableArray alloc] init]); >++ auto discreteGPUs = mtl::adoptObjCObj<NSMutableArray<id<MTLDevice>>>([[NSMutableArray alloc] init]); >+ for (id<MTLDevice> device in deviceList.get()) >+ { >+ if (device.removable) >+@@ -278,7 +278,7 @@ bool IsMetalDisplayAvailable() >+ if (attribs.get(EGL_POWER_PREFERENCE_ANGLE, 0) == EGL_HIGH_POWER_ANGLE) >+ { >+ // Search for a discrete GPU first. >+- for (id<MTLDevice> device in discreteGPUs) >++ for (id<MTLDevice> device in discreteGPUs.get()) >+ { >+ if (![device isHeadless]) >+ return device; >+@@ -287,7 +287,7 @@ bool IsMetalDisplayAvailable() >+ else if (attribs.get(EGL_POWER_PREFERENCE_ANGLE, 0) == EGL_LOW_POWER_ANGLE) >+ { >+ // If we've selected a low power device, look through integrated devices. >+- for (id<MTLDevice> device in integratedGPUs) >++ for (id<MTLDevice> device in integratedGPUs.get()) >+ { >+ if (![device isHeadless]) >+ return device; >+@@ -310,6 +310,17 @@ bool IsMetalDisplayAvailable() >+ } >+ } >+ >++ // Default to use a low power device, look through integrated devices. >++ for (id<MTLDevice> device in integratedGPUs.get()) >++ { >++ if (![device isHeadless]) >++ return device; >++ } >++ >++ // If we selected a low power device and there's no low-power devices avaialble, return the >++ // first (default) device. >++ if (deviceList.get().count > 0) >++ return deviceList[0]; >+ #endif >+ // If we can't find anything, or are on a platform that doesn't support power options, create a >+ // default device. >+@@ -1203,8 +1214,7 @@ bool IsMetalDisplayAvailable() >+ bool DisplayMtl::supports32BitFloatFiltering() const >+ { >+ #if (defined(__MAC_11_0) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_11_0) || \ >+- (defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_14_0) || \ >+- (defined(__TVOS_14_0) && __TV_OS_VERSION_MIN_REQUIRED >= __TVOS_14_0) >++ (defined(__IPHONE_14_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_14_0) >+ if (@available(ios 14.0, macOS 11.0, *)) >+ { >+ return [mMetalDevice supports32BitFloatFiltering]; > diff --git a/src/libANGLE/renderer/metal/FrameBufferMtl.mm b/src/libANGLE/renderer/metal/FrameBufferMtl.mm >-index d3f9794..5847177 100644 >+index d3f9794a9..58471773e 100644 > --- a/src/libANGLE/renderer/metal/FrameBufferMtl.mm > +++ b/src/libANGLE/renderer/metal/FrameBufferMtl.mm > @@ -809,9 +809,7 @@ void RoundValueAndAdjustCorrespondingValue(float a, >@@ -823,169 +490,68 @@ index d3f9794..5847177 100644 > } > - > } >-diff --git a/src/libANGLE/renderer/metal/ProgramMtl.h b/src/libANGLE/renderer/metal/ProgramMtl.h >-index 0e15681..96b77e2 100644 >---- a/src/libANGLE/renderer/metal/ProgramMtl.h >-+++ b/src/libANGLE/renderer/metal/ProgramMtl.h >-@@ -18,6 +18,7 @@ >- #include "common/Optional.h" >- #include "common/utilities.h" >- #include "libANGLE/renderer/ProgramImpl.h" >-+#include "libANGLE/renderer/ShaderInterfaceVariableInfoMap.h" >- #include "libANGLE/renderer/glslang_wrapper_utils.h" >- #include "libANGLE/renderer/metal/mtl_buffer_pool.h" >- #include "libANGLE/renderer/metal/mtl_command_buffer.h" >+diff --git a/src/libANGLE/renderer/metal/ProgramMtl.mm b/src/libANGLE/renderer/metal/ProgramMtl.mm >+index f14f15ce8..0b138c1d7 100644 >+--- a/src/libANGLE/renderer/metal/ProgramMtl.mm >++++ b/src/libANGLE/renderer/metal/ProgramMtl.mm >+@@ -589,7 +589,7 @@ void InitArgumentBufferEncoder(mtl::Context *context, >+ >+ mtl::TranslatedShaderInfo *translatedMslInfo = &mMslShaderTranslateInfo[shaderType]; >+ ProgramShaderObjVariantMtl *shaderVariant; >+- MTLFunctionConstantValues *funcConstants = nil; >++ mtl::AutoObjCObj<MTLFunctionConstantValues> funcConstants; >+ >+ if (shaderType == gl::ShaderType::Vertex) >+ { >+@@ -639,7 +639,7 @@ void InitArgumentBufferEncoder(mtl::Context *context, >+ [NSString stringWithUTF8String:sh::mtl::kRasterizerDiscardEnabledConstName]; >+ } >+ >+- funcConstants = [[MTLFunctionConstantValues alloc] init]; >++ funcConstants = mtl::adoptObjCObj([[MTLFunctionConstantValues alloc] init]); >+ [funcConstants setConstantValue:&emulateDiscard >+ type:MTLDataTypeBool >+ withName:discardEnabledStr]; >+@@ -674,11 +674,10 @@ void InitArgumentBufferEncoder(mtl::Context *context, >+ coverageMaskEnabledStr = >+ [NSString stringWithUTF8String:sh::mtl::kCoverageMaskEnabledConstName]; >+ } >+- >+ NSString *depthWriteEnabledStr = >+ [NSString stringWithUTF8String:sh::mtl::kDepthWriteEnabledConstName]; >+ >+- funcConstants = [[MTLFunctionConstantValues alloc] init]; >++ funcConstants = mtl::adoptObjCObj([[MTLFunctionConstantValues alloc] init]); >+ [funcConstants setConstantValue:&emulateCoverageMask >+ type:MTLDataTypeBool >+ withName:coverageMaskEnabledStr]; >+@@ -705,12 +704,12 @@ void InitArgumentBufferEncoder(mtl::Context *context, >+ setConstantValue:&(context->getDisplay()->getFeatures().allowSamplerCompareLod.enabled) >+ type:MTLDataTypeBool >+ withName:@"ANGLEUseSampleCompareLod"]; >++ >+ // Create Metal shader object >+ ANGLE_MTL_OBJC_SCOPE >+ { >+ ANGLE_TRY(CreateMslShader(context, translatedMslInfo->metalLibrary, SHADER_ENTRY_NAME, >+- funcConstants, &shaderVariant->metalShader)); >+- [funcConstants ANGLE_MTL_AUTORELEASE]; >++ funcConstants.get(), &shaderVariant->metalShader)); >+ } >+ >+ // Store reference to the translated source for easily querying mapped bindings later. > diff --git a/src/libANGLE/renderer/metal/SurfaceMtl.mm b/src/libANGLE/renderer/metal/SurfaceMtl.mm >-index 161ed51..95006fe 100644 >+index 6855e4516..daa0e59cf 100644 > --- a/src/libANGLE/renderer/metal/SurfaceMtl.mm > +++ b/src/libANGLE/renderer/metal/SurfaceMtl.mm >-@@ -770,5 +770,4 @@ >+@@ -775,5 +775,4 @@ > { > mSize.height = height; > } > - > } >-diff --git a/src/libANGLE/renderer/metal/gen_mtl_format_table.py b/src/libANGLE/renderer/metal/gen_mtl_format_table.py >-index aa0a522..3c59d6b 100644 >---- a/src/libANGLE/renderer/metal/gen_mtl_format_table.py >-+++ b/src/libANGLE/renderer/metal/gen_mtl_format_table.py >-@@ -364,7 +364,7 @@ def gen_image_map_switch_es3_case(angle_format, actual_angle_format_info, angle_ >- >- >- # Generate format conversion switch case (ASTC LDR/HDR case) >--def gen_image_map_switch_astc_case(angle_format, angle_to_gl, angle_to_mtl_map): >-+def gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, angle_to_mtl_map): >- gl_format = angle_to_gl[angle_format] >- >- def gen_format_assign_code(actual_angle_format, angle_to_mtl_map): >-@@ -383,6 +383,20 @@ def gen_image_map_switch_astc_case(angle_format, angle_to_gl, angle_to_mtl_map): >- gen_format_assign_code) >- >- >-+def gen_image_map_switch_astc_case_watchos(angle_format, angle_to_gl, angle_to_mtl_map): >-+ gl_format = angle_to_gl[angle_format] >-+ >-+ def gen_format_assign_code(actual_angle_format, angle_to_mtl_map): >-+ return image_format_assign_template1.format( >-+ actual_angle_format=actual_angle_format, >-+ mtl_format=angle_to_mtl_map[actual_angle_format] + "LDR", >-+ init_function=angle_format_utils.get_internal_format_initializer( >-+ gl_format, actual_angle_format)) >-+ >-+ return gen_image_map_switch_case(angle_format, angle_format, angle_to_mtl_map, >-+ gen_format_assign_code) >-+ >-+ >- def gen_image_map_switch_string(image_table, angle_to_gl): >- angle_override = image_table["override"] >- mac_override = image_table["override_mac"] >-@@ -448,19 +462,36 @@ def gen_image_map_switch_string(image_table, angle_to_gl): >- for angle_format in sorted(sim_override.keys()): >- switch_data += gen_image_map_switch_simple_case(angle_format, sim_override[angle_format], >- angle_to_gl, sim_angle_to_mtl) >-+ switch_data += "#if TARGET_OS_IOS || TARGET_OS_TV\n" >- for angle_format in sorted(astc_tpl_map.keys()): >-- switch_data += gen_image_map_switch_astc_case(angle_format, angle_to_gl, astc_tpl_map) >-+ switch_data += gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, >-+ astc_tpl_map) >-+ switch_data += "#elif TARGET_OS_WATCH\n" >-+ >-+ for angle_format in sorted(astc_tpl_map.keys()): >-+ switch_data += gen_image_map_switch_astc_case_watchos(angle_format, angle_to_gl, >-+ astc_tpl_map) >-+ switch_data += "#endif // TARGET_OS_IOS || TARGET_OS_TV \n " >- # iOS specific >-- switch_data += "#elif TARGET_OS_IOS || TARGET_OS_TV\n" >-+ switch_data += "#elif TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST\n" >- for angle_format in sorted(ios_specific_map.keys()): >- switch_data += gen_image_map_switch_simple_case(angle_format, angle_format, angle_to_gl, >- ios_specific_map) >- for angle_format in sorted(ios_override.keys()): >- switch_data += gen_image_map_switch_simple_case(angle_format, ios_override[angle_format], >- angle_to_gl, ios_angle_to_mtl) >-+ switch_data += "#if TARGET_OS_IOS || TARGET_OS_TV\n" >- for angle_format in sorted(astc_tpl_map.keys()): >-- switch_data += gen_image_map_switch_astc_case(angle_format, angle_to_gl, astc_tpl_map) >-- switch_data += "#endif\n" >-+ switch_data += gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, >-+ astc_tpl_map) >-+ >-+ switch_data += "#elif TARGET_OS_WATCH\n" >-+ >-+ for angle_format in sorted(astc_tpl_map.keys()): >-+ switch_data += gen_image_map_switch_astc_case_watchos(angle_format, angle_to_gl, >-+ astc_tpl_map) >-+ switch_data += "#endif // TARGET_OS_IOS || TARGET_OS_TV\n" >-+ switch_data += "#endif // TARGET_OS_IPHONE\n" >- >- # Try to support all iOS formats on newer macOS with Apple GPU. >- switch_data += "#if (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000))\n" >-@@ -475,8 +506,9 @@ def gen_image_map_switch_string(image_table, angle_to_gl): >- angle_to_gl, ios_specific_map) >- # ASTC LDR or HDR >- for angle_format in sorted(astc_tpl_map.keys()): >-- switch_data += gen_image_map_switch_astc_case(angle_format, angle_to_gl, astc_tpl_map) >-- switch_data += "#endif\n" >-+ switch_data += gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, >-+ astc_tpl_map) >-+ switch_data += "#endif // TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600)) \n" >- >- switch_data += " default:\n" >- switch_data += " this->metalFormat = MTLPixelFormatInvalid;\n" >-@@ -505,7 +537,7 @@ def gen_image_mtl_to_angle_switch_string(image_table): >- switch_data += "#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >- >- # iOS + macOS 11.0+ specific >-- switch_data += "#if TARGET_OS_IOS || TARGET_OS_TV || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000))\n" >-+ switch_data += "#if TARGET_OS_IPHONE || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600))\n" >- for angle_format in sorted(ios_specific_map.keys()): >- # ETC1_R8G8B8_UNORM_BLOCK is a duplicated of ETC2_R8G8B8_UNORM_BLOCK >- if angle_format == 'ETC1_R8G8B8_UNORM_BLOCK': >-@@ -515,9 +547,12 @@ def gen_image_mtl_to_angle_switch_string(image_table): >- for angle_format in sorted(astc_tpl_map.keys()): >- switch_data += case_image_mtl_to_angle_template.format( >- mtl_format=astc_tpl_map[angle_format] + "LDR", angle_format=angle_format) >-+ switch_data += "#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_OSX \n" >-+ for angle_format in sorted(astc_tpl_map.keys()): >- switch_data += case_image_mtl_to_angle_template.format( >- mtl_format=astc_tpl_map[angle_format] + "HDR", angle_format=angle_format) >-- switch_data += "#endif // TARGET_OS_IOS || TARGET_OS_TV || mac 11.0+\n" >-+ switch_data += "#endif // TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_OSX\n" >-+ switch_data += "#endif // TARGET_OS_IPHONE || mac 11.0+\n" >- >- switch_data += " default:\n" >- switch_data += " return angle::FormatID::NONE;\n" >-@@ -586,7 +621,8 @@ def gen_vertex_map_switch_string(vertex_table): >- def gen_mtl_format_caps_init_string(map_image): >- caps = map_image['caps'] >- mac_caps = map_image['caps_mac'] >-- ios_caps = map_image['caps_ios'] >-+ ios_platform_caps = map_image['caps_ios_platform'] >-+ ios_specific_caps = map_image['caps_ios_spcific'] >- caps_init_str = '' >- >- def cap_to_param(caps, key): >-@@ -616,12 +652,15 @@ def gen_mtl_format_caps_init_string(map_image): >- caps_init_str += caps_to_cpp(mac_caps) >- caps_init_str += "#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" >- >-- caps_init_str += "#if (TARGET_OS_IOS && !TARGET_OS_MACCATALYST) || TARGET_OS_TV || \\\n" >-+ caps_init_str += "#if (TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST) || \\\n" >- caps_init_str += " (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000))\n" >- >-- caps_init_str += caps_to_cpp(ios_caps) >-+ caps_init_str += caps_to_cpp(ios_platform_caps) >- >-- caps_init_str += "#endif\n" >-+ caps_init_str += "#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_OSX\n" >-+ caps_init_str += caps_to_cpp(ios_specific_caps) >-+ caps_init_str += "#endif // TARGET_OS_IOS || TARGET_OS_TV || mac 11.0+ \n" >-+ caps_init_str += "#endif // TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST || mac 11.0+ \n" >- >- return caps_init_str >- > diff --git a/src/libANGLE/renderer/metal/mtl_buffer_pool.h b/src/libANGLE/renderer/metal/mtl_buffer_pool.h >-index c3be11f..204ebb9 100644 >+index c3be11f78..204ebb949 100644 > --- a/src/libANGLE/renderer/metal/mtl_buffer_pool.h > +++ b/src/libANGLE/renderer/metal/mtl_buffer_pool.h > @@ -126,7 +126,7 @@ class BufferPool >@@ -997,1127 +563,30 @@ index c3be11f..204ebb9 100644 > bool mAlwaysAllocateNewBuffer; > }; > >-diff --git a/src/libANGLE/renderer/metal/mtl_format_map.json b/src/libANGLE/renderer/metal/mtl_format_map.json >-index 2a63665..6d80191 100644 >---- a/src/libANGLE/renderer/metal/mtl_format_map.json >-+++ b/src/libANGLE/renderer/metal/mtl_format_map.json >-@@ -74,7 +74,6 @@ >- "D32_FLOAT": "MTLPixelFormatDepth32Float", >- "S8_UINT": "MTLPixelFormatStencil8", >- "D32_FLOAT_S8X24_UINT": "MTLPixelFormatDepth32Float_Stencil8", >-- "B10G10R10A2_UNORM": "MTLPixelFormatBGR10A2Unorm", >- "R10G10B10A2_UINT": "MTLPixelFormatRGB10A2Uint", >- "R10G10B10A2_UNORM": "MTLPixelFormatRGB10A2Unorm", >- "R11G11B10_FLOAT": "MTLPixelFormatRG11B10Float", >-@@ -105,20 +104,20 @@ >- "EAC_R11_SNORM_BLOCK": "MTLPixelFormatEAC_R11Snorm", >- "EAC_R11G11_UNORM_BLOCK": "MTLPixelFormatEAC_RG11Unorm", >- "EAC_R11G11_SNORM_BLOCK": "MTLPixelFormatEAC_RG11Snorm", >-- "ASTC_4x4_SRGB_BLOCK": "MTLPixelFormatASTC_4x4_sRGB", >-- "ASTC_5x4_SRGB_BLOCK": "MTLPixelFormatASTC_5x4_sRGB", >-- "ASTC_5x5_SRGB_BLOCK": "MTLPixelFormatASTC_5x5_sRGB", >-- "ASTC_6x5_SRGB_BLOCK": "MTLPixelFormatASTC_6x5_sRGB", >-- "ASTC_6x6_SRGB_BLOCK": "MTLPixelFormatASTC_6x6_sRGB", >-- "ASTC_8x5_SRGB_BLOCK": "MTLPixelFormatASTC_8x5_sRGB", >-- "ASTC_8x6_SRGB_BLOCK": "MTLPixelFormatASTC_8x6_sRGB", >-- "ASTC_8x8_SRGB_BLOCK": "MTLPixelFormatASTC_8x8_sRGB", >-- "ASTC_10x5_SRGB_BLOCK": "MTLPixelFormatASTC_10x5_sRGB", >-- "ASTC_10x6_SRGB_BLOCK": "MTLPixelFormatASTC_10x6_sRGB", >-- "ASTC_10x8_SRGB_BLOCK": "MTLPixelFormatASTC_10x8_sRGB", >-- "ASTC_10x10_SRGB_BLOCK": "MTLPixelFormatASTC_10x10_sRGB", >-- "ASTC_12x10_SRGB_BLOCK": "MTLPixelFormatASTC_12x10_sRGB", >-- "ASTC_12x12_SRGB_BLOCK": "MTLPixelFormatASTC_12x12_sRGB" >-+ "ASTC_4x4_SRGB_BLOCK" : "MTLPixelFormatASTC_4x4_sRGB", >-+ "ASTC_5x4_SRGB_BLOCK" : "MTLPixelFormatASTC_5x4_sRGB", >-+ "ASTC_5x5_SRGB_BLOCK" : "MTLPixelFormatASTC_5x5_sRGB", >-+ "ASTC_6x5_SRGB_BLOCK" : "MTLPixelFormatASTC_6x5_sRGB", >-+ "ASTC_6x6_SRGB_BLOCK" : "MTLPixelFormatASTC_6x6_sRGB", >-+ "ASTC_8x5_SRGB_BLOCK" : "MTLPixelFormatASTC_8x5_sRGB", >-+ "ASTC_8x6_SRGB_BLOCK" : "MTLPixelFormatASTC_8x6_sRGB", >-+ "ASTC_8x8_SRGB_BLOCK" : "MTLPixelFormatASTC_8x8_sRGB", >-+ "ASTC_10x5_SRGB_BLOCK" : "MTLPixelFormatASTC_10x5_sRGB", >-+ "ASTC_10x6_SRGB_BLOCK" : "MTLPixelFormatASTC_10x6_sRGB", >-+ "ASTC_10x8_SRGB_BLOCK" : "MTLPixelFormatASTC_10x8_sRGB", >-+ "ASTC_10x10_SRGB_BLOCK" : "MTLPixelFormatASTC_10x10_sRGB", >-+ "ASTC_12x10_SRGB_BLOCK" : "MTLPixelFormatASTC_12x10_sRGB", >-+ "ASTC_12x12_SRGB_BLOCK" : "MTLPixelFormatASTC_12x12_sRGB" >- }, >- "map_sim": { >- "ETC1_R8G8B8_UNORM_BLOCK": "MTLPixelFormatETC2_RGB8", >-@@ -130,7 +129,7 @@ >- "ETC2_R8G8B8A8_SRGB_BLOCK": "MTLPixelFormatEAC_RGBA8_sRGB", >- "EAC_R11_UNORM_BLOCK": "MTLPixelFormatEAC_R11Unorm", >- "EAC_R11_SNORM_BLOCK": "MTLPixelFormatEAC_R11Snorm", >-- "EAC_R11G11_UNORM_BLOCK": "MTLPixelFormatEAC_R11Unorm", >-+ "EAC_R11G11_UNORM_BLOCK": "MTLPixelFormatEAC_RG11Unorm", >- "EAC_R11G11_SNORM_BLOCK": "MTLPixelFormatEAC_RG11Snorm", >- "ASTC_4x4_SRGB_BLOCK": "MTLPixelFormatASTC_4x4_sRGB", >- "ASTC_5x4_SRGB_BLOCK": "MTLPixelFormatASTC_5x4_sRGB", >-@@ -145,21 +144,7 @@ >- "ASTC_10x8_SRGB_BLOCK": "MTLPixelFormatASTC_10x8_sRGB", >- "ASTC_10x10_SRGB_BLOCK": "MTLPixelFormatASTC_10x10_sRGB", >- "ASTC_12x10_SRGB_BLOCK": "MTLPixelFormatASTC_12x10_sRGB", >-- "ASTC_12x12_SRGB_BLOCK": "MTLPixelFormatASTC_12x12_sRGB", >-- "ASTC_4x4_UNORM_BLOCK": "MTLPixelFormatASTC_4x4_LDR", >-- "ASTC_5x4_UNORM_BLOCK": "MTLPixelFormatASTC_5x4_LDR", >-- "ASTC_5x5_UNORM_BLOCK": "MTLPixelFormatASTC_5x5_LDR", >-- "ASTC_6x5_UNORM_BLOCK": "MTLPixelFormatASTC_6x5_LDR", >-- "ASTC_6x6_UNORM_BLOCK": "MTLPixelFormatASTC_6x6_LDR", >-- "ASTC_8x5_UNORM_BLOCK": "MTLPixelFormatASTC_8x5_LDR", >-- "ASTC_8x6_UNORM_BLOCK": "MTLPixelFormatASTC_8x6_LDR", >-- "ASTC_8x8_UNORM_BLOCK": "MTLPixelFormatASTC_8x8_LDR", >-- "ASTC_10x5_UNORM_BLOCK": "MTLPixelFormatASTC_10x5_LDR", >-- "ASTC_10x6_UNORM_BLOCK": "MTLPixelFormatASTC_10x6_LDR", >-- "ASTC_10x8_UNORM_BLOCK": "MTLPixelFormatASTC_10x8_LDR", >-- "ASTC_10x10_UNORM_BLOCK": "MTLPixelFormatASTC_10x10_LDR", >-- "ASTC_12x10_UNORM_BLOCK": "MTLPixelFormatASTC_12x10_LDR", >-- "ASTC_12x12_UNORM_BLOCK": "MTLPixelFormatASTC_12x12_LDR" >-+ "ASTC_12x12_SRGB_BLOCK": "MTLPixelFormatASTC_12x12_sRGB" >- }, >- "map_astc_tpl": { >- "ASTC_4x4_UNORM_BLOCK": "MTLPixelFormatASTC_4x4_", >-@@ -230,7 +215,8 @@ >- "R5G6B5_UNORM": "R8G8B8A8_UNORM", >- "R5G5B5A1_UNORM": "R8G8B8A8_UNORM", >- "D24_UNORM_S8_UINT": "D32_FLOAT_S8X24_UINT", >-- "R4G4B4A4_UNORM": "R8G8B8A8_UNORM" >-+ "R4G4B4A4_UNORM": "R8G8B8A8_UNORM", >-+ "D16_UNORM": "D32_FLOAT" >- }, >- "override_mac_bc1": { >- "BC1_RGB_UNORM_BLOCK": { >-@@ -261,6 +247,8 @@ >- "d24s8_fallbacks_mac": { >- "D24_UNORM_S8_UINT": "D32_FLOAT_S8X24_UINT" >- }, >-+ "fallbacks_ios": { >-+ }, >- "caps": { >- "MTLPixelFormatA8Unorm":{ >- "filterable": "true", >-@@ -623,7 +611,7 @@ >- "colorRenderable": "true" >- }, >- "MTLPixelFormatDepth32Float":{ >-- "filterable": "display->supportsEitherGPUFamily(1, 1)", >-+ "filterable": "display->supports32BitFloatFiltering()", >- "writable": "false", >- "blendable": "false", >- "multisample": "true", >-@@ -641,7 +629,7 @@ >- "depthRenderable": "true" >- }, >- "MTLPixelFormatDepth32Float_Stencil8":{ >-- "filterable": "display->supportsEitherGPUFamily(1, 1)", >-+ "filterable": "display->supports32BitFloatFiltering()", >- "writable": "false", >- "blendable": "false", >- "multisample": "true", >-@@ -661,13 +649,13 @@ >- "depthRenderable": "true" >- }, >- "MTLPixelFormatDepth24Unorm_Stencil8":{ >-- "filterable": "display->supportsMacGPUFamily(1)", >-+ "filterable": "display->supportsMacGPUFamily(1) && display->supportsDepth24Stencil8PixelFormat()", >- "writable": "false", >- "blendable": "false", >- "multisample": "true", >- "resolve": "supportDepthStencilAutoResolve", >- "colorRenderable": "false", >-- "depthRenderable": "display->supportsMacGPUFamily(1)" >-+ "depthRenderable": "display->supportsMacGPUFamily(1) && display->supportsDepth24Stencil8PixelFormat()" >- }, >- "MTLPixelFormatBC1_RGBA":{ >- "filterable": "true" >-@@ -712,7 +700,7 @@ >- "filterable": "true" >- } >- }, >-- "caps_ios": { >-+ "caps_ios_platform": { >- "MTLPixelFormatR8Unorm_sRGB":{ >- "filterable": "display->supportsAppleGPUFamily(1)", >- "writable": "display->supportsAppleGPUFamily(2)", >-@@ -898,7 +886,10 @@ >- }, >- "MTLPixelFormatASTC_12x12_sRGB":{ >- "filterable": "display->supportsAppleGPUFamily(2)" >-+ } >- }, >-+ "caps_ios_spcific" : >-+ { >- "MTLPixelFormatASTC_4x4_HDR":{ >- "filterable": "display->supportsAppleGPUFamily(6)" >- }, > diff --git a/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm b/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm >-index e43160e..05adf69 100644 >+index 9d19c854d..c6b74bc4c 100644 > --- a/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm > +++ b/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm >-@@ -33,8 +33,6 @@ >- { >- case MTLPixelFormatA8Unorm: >- return angle::FormatID::A8_UNORM; >-- case MTLPixelFormatBGR10A2Unorm: >-- return angle::FormatID::B10G10R10A2_UNORM; >- case MTLPixelFormatBGRA8Unorm: >- return angle::FormatID::B8G8R8A8_UNORM; >- case MTLPixelFormatBGRA8Unorm_sRGB: >-@@ -161,7 +159,7 @@ >- case MTLPixelFormatDepth24Unorm_Stencil8: >- return angle::FormatID::D24_UNORM_S8_UINT; >- #endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST >--#if TARGET_OS_IOS || TARGET_OS_TV || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000)) >-+#if TARGET_OS_IPHONE || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600)) >- case MTLPixelFormatASTC_10x10_sRGB: >- return angle::FormatID::ASTC_10x10_SRGB_BLOCK; >- case MTLPixelFormatASTC_10x5_sRGB: >-@@ -238,61 +236,63 @@ >- return angle::FormatID::R8_UNORM_SRGB; >- case MTLPixelFormatASTC_10x10_LDR: >- return angle::FormatID::ASTC_10x10_UNORM_BLOCK; >-- case MTLPixelFormatASTC_10x10_HDR: >-- return angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- case MTLPixelFormatASTC_10x5_LDR: >- return angle::FormatID::ASTC_10x5_UNORM_BLOCK; >-- case MTLPixelFormatASTC_10x5_HDR: >-- return angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- case MTLPixelFormatASTC_10x6_LDR: >- return angle::FormatID::ASTC_10x6_UNORM_BLOCK; >-- case MTLPixelFormatASTC_10x6_HDR: >-- return angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- case MTLPixelFormatASTC_10x8_LDR: >- return angle::FormatID::ASTC_10x8_UNORM_BLOCK; >-- case MTLPixelFormatASTC_10x8_HDR: >-- return angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- case MTLPixelFormatASTC_12x10_LDR: >- return angle::FormatID::ASTC_12x10_UNORM_BLOCK; >-- case MTLPixelFormatASTC_12x10_HDR: >-- return angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- case MTLPixelFormatASTC_12x12_LDR: >- return angle::FormatID::ASTC_12x12_UNORM_BLOCK; >-- case MTLPixelFormatASTC_12x12_HDR: >-- return angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- case MTLPixelFormatASTC_4x4_LDR: >- return angle::FormatID::ASTC_4x4_UNORM_BLOCK; >-- case MTLPixelFormatASTC_4x4_HDR: >-- return angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- case MTLPixelFormatASTC_5x4_LDR: >- return angle::FormatID::ASTC_5x4_UNORM_BLOCK; >-- case MTLPixelFormatASTC_5x4_HDR: >-- return angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- case MTLPixelFormatASTC_5x5_LDR: >- return angle::FormatID::ASTC_5x5_UNORM_BLOCK; >-- case MTLPixelFormatASTC_5x5_HDR: >-- return angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- case MTLPixelFormatASTC_6x5_LDR: >- return angle::FormatID::ASTC_6x5_UNORM_BLOCK; >-- case MTLPixelFormatASTC_6x5_HDR: >-- return angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- case MTLPixelFormatASTC_6x6_LDR: >- return angle::FormatID::ASTC_6x6_UNORM_BLOCK; >-- case MTLPixelFormatASTC_6x6_HDR: >-- return angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- case MTLPixelFormatASTC_8x5_LDR: >- return angle::FormatID::ASTC_8x5_UNORM_BLOCK; >-- case MTLPixelFormatASTC_8x5_HDR: >-- return angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- case MTLPixelFormatASTC_8x6_LDR: >- return angle::FormatID::ASTC_8x6_UNORM_BLOCK; >-- case MTLPixelFormatASTC_8x6_HDR: >-- return angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- case MTLPixelFormatASTC_8x8_LDR: >- return angle::FormatID::ASTC_8x8_UNORM_BLOCK; >-+# if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_OSX >-+ case MTLPixelFormatASTC_10x10_HDR: >-+ return angle::FormatID::ASTC_10x10_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_10x5_HDR: >-+ return angle::FormatID::ASTC_10x5_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_10x6_HDR: >-+ return angle::FormatID::ASTC_10x6_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_10x8_HDR: >-+ return angle::FormatID::ASTC_10x8_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_12x10_HDR: >-+ return angle::FormatID::ASTC_12x10_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_12x12_HDR: >-+ return angle::FormatID::ASTC_12x12_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_4x4_HDR: >-+ return angle::FormatID::ASTC_4x4_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_5x4_HDR: >-+ return angle::FormatID::ASTC_5x4_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_5x5_HDR: >-+ return angle::FormatID::ASTC_5x5_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_6x5_HDR: >-+ return angle::FormatID::ASTC_6x5_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_6x6_HDR: >-+ return angle::FormatID::ASTC_6x6_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_8x5_HDR: >-+ return angle::FormatID::ASTC_8x5_UNORM_BLOCK; >-+ case MTLPixelFormatASTC_8x6_HDR: >-+ return angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- case MTLPixelFormatASTC_8x8_HDR: >- return angle::FormatID::ASTC_8x8_UNORM_BLOCK; >--#endif // TARGET_OS_IOS || TARGET_OS_TV || mac 11.0+ >-+# endif // TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_OSX >-+#endif // TARGET_OS_IPHONE || mac 11.0+ >- default: >- return angle::FormatID::NONE; >- } >-@@ -317,15 +317,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::B10G10R10A2_UNORM: >-- >-- this->metalFormat = MTLPixelFormatBGR10A2Unorm; >-- this->actualFormatId = angle::FormatID::B10G10R10A2_UNORM; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::B8G8R8A8_UNORM: >- >- this->metalFormat = MTLPixelFormatBGRA8Unorm; >-@@ -1304,15 +1295,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_10x10_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_10x10_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_10x5_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_10x5_sRGB; >-@@ -1322,15 +1304,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_10x5_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_10x5_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_10x6_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_10x6_sRGB; >-@@ -1340,15 +1313,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_10x6_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_10x6_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_10x8_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_10x8_sRGB; >-@@ -1358,15 +1322,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_10x8_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_10x8_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_12x10_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_12x10_sRGB; >-@@ -1376,15 +1331,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_12x10_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_12x10_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_12x12_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_12x12_sRGB; >-@@ -1394,15 +1340,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_12x12_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_12x12_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_4x4_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_4x4_sRGB; >-@@ -1412,15 +1349,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_4x4_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_4x4_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_5x4_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_5x4_sRGB; >-@@ -1430,15 +1358,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_5x4_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_5x4_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_5x5_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_5x5_sRGB; >-@@ -1448,15 +1367,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_5x5_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_5x5_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_6x5_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_6x5_sRGB; >-@@ -1466,15 +1376,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_6x5_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_6x5_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_6x6_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_6x6_sRGB; >-@@ -1484,15 +1385,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_6x6_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_6x6_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_8x5_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_8x5_sRGB; >-@@ -1502,15 +1394,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_8x5_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_8x5_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_8x6_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_8x6_sRGB; >-@@ -1520,15 +1403,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_8x6_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_8x6_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::ASTC_8x8_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_8x8_sRGB; >-@@ -1538,15 +1412,6 @@ >- this->swizzled = false; >- break; >- >-- case angle::FormatID::ASTC_8x8_UNORM_BLOCK: >-- >-- this->metalFormat = MTLPixelFormatASTC_8x8_LDR; >-- this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- >-- this->swizzled = false; >-- break; >-- >- case angle::FormatID::EAC_R11G11_SNORM_BLOCK: >- >- this->metalFormat = MTLPixelFormatEAC_RG11Snorm; >-@@ -1558,7 +1423,7 @@ >- >- case angle::FormatID::EAC_R11G11_UNORM_BLOCK: >- >-- this->metalFormat = MTLPixelFormatEAC_R11Unorm; >-+ this->metalFormat = MTLPixelFormatEAC_RG11Unorm; >- this->actualFormatId = angle::FormatID::EAC_R11G11_UNORM_BLOCK; >- this->initFunction = nullptr; >- >-@@ -1646,6 +1511,15 @@ >- this->swizzled = false; >- break; >- >-+ case angle::FormatID::D16_UNORM: >-+ >-+ this->metalFormat = MTLPixelFormatDepth32Float; >-+ this->actualFormatId = angle::FormatID::D32_FLOAT; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >- case angle::FormatID::D24_UNORM_S8_UINT: >- >- this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; >-@@ -1682,6 +1556,7 @@ >- this->swizzled = false; >+@@ -1952,7 +1952,7 @@ >+ } > break; > >-+# if TARGET_OS_IOS || TARGET_OS_TV >+-# elif TARGET_OS_TV || TARGET_OS_WATCH >++# elif TARGET_OS_WATCH || TARGET_OS_TV > case angle::FormatID::ASTC_10x10_UNORM_BLOCK: > >- if (display->supportsAppleGPUFamily(6)) >-@@ -1911,30 +1786,158 @@ >- this->metalFormat = MTLPixelFormatASTC_8x6_LDR; >- this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; >-- } >-+ } >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_8x8_UNORM_BLOCK: >-+ >-+ if (display->supportsAppleGPUFamily(6)) >-+ { >-+ this->metalFormat = MTLPixelFormatASTC_8x8_HDR; >-+ this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ } >-+ else >-+ { >-+ this->metalFormat = MTLPixelFormatASTC_8x8_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ } >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+# elif TARGET_OS_WATCH >-+ case angle::FormatID::ASTC_10x10_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x10_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_10x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_10x6_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x6_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_10x8_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x8_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_12x10_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_12x10_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_12x12_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_12x12_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_4x4_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_4x4_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_5x4_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_5x4_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_5x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_5x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_6x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_6x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_6x6_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_6x6_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_8x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_8x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_8x6_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_8x6_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >-+ this->initFunction = nullptr; >- >- this->swizzled = false; >- break; >- >- case angle::FormatID::ASTC_8x8_UNORM_BLOCK: >- >-- if (display->supportsAppleGPUFamily(6)) >-- { >-- this->metalFormat = MTLPixelFormatASTC_8x8_HDR; >-- this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >-- this->initFunction = nullptr; >-- } >-- else >-- { >- this->metalFormat = MTLPixelFormatASTC_8x8_LDR; >+ this->metalFormat = MTLPixelFormatASTC_10x10_LDR; >+@@ -2037,7 +2037,7 @@ > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; >-- } >- >- this->swizzled = false; >- break; >- >--#elif TARGET_OS_IOS || TARGET_OS_TV >-+# endif // TARGET_OS_IOS || TARGET_OS_TV >-+#elif TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST >- case angle::FormatID::ASTC_10x10_SRGB_BLOCK: >- >- this->metalFormat = MTLPixelFormatASTC_10x10_sRGB; >-@@ -2295,6 +2298,7 @@ >- this->swizzled = false; > break; > >-+# if TARGET_OS_IOS || TARGET_OS_TV >- case angle::FormatID::ASTC_10x10_UNORM_BLOCK: >- >- if (display->supportsAppleGPUFamily(6)) >-@@ -2547,7 +2551,135 @@ >- this->swizzled = false; >- break; >- >--#endif >-+# elif TARGET_OS_WATCH >-+ case angle::FormatID::ASTC_10x10_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x10_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_10x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_10x6_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x6_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_10x8_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_10x8_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_12x10_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_12x10_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_12x12_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_12x12_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_4x4_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_4x4_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_5x4_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_5x4_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_5x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_5x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_6x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_6x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_6x6_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_6x6_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_8x5_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_8x5_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_8x6_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_8x6_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+ case angle::FormatID::ASTC_8x8_UNORM_BLOCK: >-+ >-+ this->metalFormat = MTLPixelFormatASTC_8x8_LDR; >-+ this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >-+ this->initFunction = nullptr; >-+ >-+ this->swizzled = false; >-+ break; >-+ >-+# endif // TARGET_OS_IOS || TARGET_OS_TV >-+#endif // TARGET_OS_IPHONE >+-# endif // TARGET_OS_IOS || TARGET_OS_TV >++# endif // TARGET_OS_IOS >+ #endif // TARGET_OS_IPHONE > #if (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000)) > case angle::FormatID::ASTC_10x10_SRGB_BLOCK: >- >-@@ -3269,7 +3401,7 @@ >- this->swizzled = false; >- break; >- >--#endif >-+#endif // TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600)) >- default: >- this->metalFormat = MTLPixelFormatInvalid; >- this->actualFormatId = angle::FormatID::NONE; >-@@ -4411,13 +4543,13 @@ >- /** depthRenderable*/ false); >- >- setFormatCaps(MTLPixelFormatDepth32Float, >-- /** filterable*/ display->supportsEitherGPUFamily(1, 1), /** writable*/ false, >-+ /** filterable*/ display->supports32BitFloatFiltering(), /** writable*/ false, >- /** blendable*/ false, /** multisample*/ true, >- /** resolve*/ supportDepthAutoResolve, /** colorRenderable*/ false, >- /** depthRenderable*/ true); >- >- setFormatCaps(MTLPixelFormatDepth32Float_Stencil8, >-- /** filterable*/ display->supportsEitherGPUFamily(1, 1), /** writable*/ false, >-+ /** filterable*/ display->supports32BitFloatFiltering(), /** writable*/ false, >- /** blendable*/ false, /** multisample*/ true, >- /** resolve*/ supportDepthStencilAutoResolve, /** colorRenderable*/ false, >- /** depthRenderable*/ true); >-@@ -4676,13 +4808,15 @@ >- /** depthRenderable*/ true); >- >- setFormatCaps(MTLPixelFormatDepth24Unorm_Stencil8, >-- /** filterable*/ display->supportsMacGPUFamily(1), /** writable*/ false, >-- /** blendable*/ false, /** multisample*/ true, >-+ /** filterable*/ display->supportsMacGPUFamily(1) && >-+ display->supportsDepth24Stencil8PixelFormat(), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ true, >- /** resolve*/ supportDepthStencilAutoResolve, /** colorRenderable*/ false, >-- /** depthRenderable*/ display->supportsMacGPUFamily(1)); >-+ /** depthRenderable*/ display->supportsMacGPUFamily(1) && >-+ display->supportsDepth24Stencil8PixelFormat()); >- >- #endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST >--#if (TARGET_OS_IOS && !TARGET_OS_MACCATALYST) || TARGET_OS_TV || \ >-+#if (TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST) || \ >- (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000)) >- setFormatCaps(MTLPixelFormatA1BGR5Unorm, /** filterable*/ display->supportsAppleGPUFamily(1), >- /** writable*/ false, /** blendable*/ display->supportsAppleGPUFamily(1), >-@@ -4698,10 +4832,6 @@ >- /** colorRenderable*/ display->supportsAppleGPUFamily(1), >- /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_10x10_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_10x10_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4711,10 +4841,6 @@ >- /** blendable*/ false, /** multisample*/ false, /** resolve*/ false, >- /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_10x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_10x5_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4723,10 +4849,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_10x6_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_10x6_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4735,10 +4857,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_10x8_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_10x8_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4747,10 +4865,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_12x10_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_12x10_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4760,10 +4874,6 @@ >- /** blendable*/ false, /** multisample*/ false, /** resolve*/ false, >- /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_12x12_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_12x12_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4773,10 +4883,6 @@ >- /** blendable*/ false, /** multisample*/ false, /** resolve*/ false, >- /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_4x4_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_4x4_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4785,10 +4891,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_5x4_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_5x4_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4797,10 +4899,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_5x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_5x5_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4809,10 +4907,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_6x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_6x5_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4821,10 +4915,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_6x6_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_6x6_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4833,10 +4923,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_8x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_8x5_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4845,10 +4931,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_8x6_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_8x6_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4857,10 +4939,6 @@ >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >- >-- setFormatCaps(MTLPixelFormatASTC_8x8_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-- >- setFormatCaps(MTLPixelFormatASTC_8x8_LDR, /** filterable*/ display->supportsAppleGPUFamily(2), >- /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >- /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-@@ -4978,7 +5056,65 @@ >- /** colorRenderable*/ display->supportsAppleGPUFamily(1), >- /** depthRenderable*/ false); >- >--#endif >-+# if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_OSX >-+ setFormatCaps(MTLPixelFormatASTC_10x10_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_10x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_10x6_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_10x8_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_12x10_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_12x12_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_4x4_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_5x4_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_5x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_6x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_6x6_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_8x5_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_8x6_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+ setFormatCaps(MTLPixelFormatASTC_8x8_HDR, /** filterable*/ display->supportsAppleGPUFamily(6), >-+ /** writable*/ false, /** blendable*/ false, /** multisample*/ false, >-+ /** resolve*/ false, /** colorRenderable*/ false, /** depthRenderable*/ false); >-+ >-+# endif // TARGET_OS_IOS || TARGET_OS_TV || mac 11.0+ >-+#endif // TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST || mac 11.0+ >- } >- >- } // namespace mtl > diff --git a/src/libANGLE/renderer/metal/mtl_render_utils.mm b/src/libANGLE/renderer/metal/mtl_render_utils.mm >-index 1613ee9..e075295 100644 >+index 1613ee9b7..e075295f8 100644 > --- a/src/libANGLE/renderer/metal/mtl_render_utils.mm > +++ b/src/libANGLE/renderer/metal/mtl_render_utils.mm > @@ -2540,45 +2540,13 @@ ANGLE_INLINE void SetPipelineState(ComputeCommandEncoder *encoder, >@@ -2198,7 +667,7 @@ index 1613ee9..e075295 100644 > MipmapNativeLevel batchSrcLevel = kZeroNativeMipLevel; > options.srcLevel = batchSrcLevel.get(); > diff --git a/src/libANGLE/renderer/metal/mtl_resource_spi.h b/src/libANGLE/renderer/metal/mtl_resource_spi.h >-index 3eaa9a6..2ecf7b4 100644 >+index 3eaa9a64e..2ecf7b40b 100644 > --- a/src/libANGLE/renderer/metal/mtl_resource_spi.h > +++ b/src/libANGLE/renderer/metal/mtl_resource_spi.h > @@ -1,9 +1,63 @@ >@@ -2272,11 +741,11 @@ index 3eaa9a6..2ecf7b4 100644 > + > +#endif /* LIBANGLE_RENDERER_METAL_RESOURCE_SPI_H_ */ > diff --git a/src/libANGLE/renderer/metal/mtl_resources.h b/src/libANGLE/renderer/metal/mtl_resources.h >-index b51294c..b51378a 100644 >+index 8b8eb26b5..19a974087 100644 > --- a/src/libANGLE/renderer/metal/mtl_resources.h > +++ b/src/libANGLE/renderer/metal/mtl_resources.h >-@@ -337,7 +337,9 @@ class Texture final : public Resource, >- TextureRef mReadCopy; >+@@ -345,7 +345,9 @@ class Texture final : public Resource, >+ size_t mEstimatedByteSize = 0; > }; > > -class Buffer final : public Resource, public WrappedObject<id<MTLBuffer>> >@@ -2287,7 +756,7 @@ index b51294c..b51378a 100644 > public: > static angle::Result MakeBuffer(ContextMtl *context, > diff --git a/src/libANGLE/renderer/metal/mtl_resources.mm b/src/libANGLE/renderer/metal/mtl_resources.mm >-index 294853d..06a5cd0 100644 >+index 8c05fc25d..0f9b53b6d 100644 > --- a/src/libANGLE/renderer/metal/mtl_resources.mm > +++ b/src/libANGLE/renderer/metal/mtl_resources.mm > @@ -35,12 +35,14 @@ inline NSUInteger GetMipSize(NSUInteger baseSize, const MipmapNativeLevel level) >@@ -2316,7 +785,7 @@ index 294853d..06a5cd0 100644 > { > #if TARGET_OS_OSX || TARGET_OS_MACCATALYST > // Make sure GPU & CPU contents are synchronized. >-@@ -495,12 +497,12 @@ void EnsureCPUMemWillBeSynced(ContextMtl *context, T *resource) >+@@ -512,12 +514,12 @@ void EnsureCPUMemWillBeSynced(ContextMtl *context, T *resource) > > void Texture::syncContent(ContextMtl *context, mtl::BlitCommandEncoder *blitEncoder) > { >@@ -2331,7 +800,7 @@ index 294853d..06a5cd0 100644 > } > > bool Texture::isCPUAccessible() const >-@@ -965,7 +967,7 @@ void EnsureCPUMemWillBeSynced(ContextMtl *context, T *resource) >+@@ -982,7 +984,7 @@ void EnsureCPUMemWillBeSynced(ContextMtl *context, T *resource) > > void Buffer::syncContent(ContextMtl *context, mtl::BlitCommandEncoder *blitEncoder) > { >@@ -2340,7 +809,7 @@ index 294853d..06a5cd0 100644 > } > > const uint8_t *Buffer::mapReadOnly(ContextMtl *context) >-@@ -986,7 +988,7 @@ void EnsureCPUMemWillBeSynced(ContextMtl *context, T *resource) >+@@ -1003,7 +1005,7 @@ void EnsureCPUMemWillBeSynced(ContextMtl *context, T *resource) > { > CommandQueue &cmdQueue = context->cmdQueue(); > >@@ -2350,7 +819,7 @@ index 294853d..06a5cd0 100644 > if (this->isBeingUsedByGPU(context)) > { > diff --git a/src/libANGLE/renderer/metal/mtl_utils.h b/src/libANGLE/renderer/metal/mtl_utils.h >-index 6c7e140..a77588c 100644 >+index d218c13ed..b236d9265 100644 > --- a/src/libANGLE/renderer/metal/mtl_utils.h > +++ b/src/libANGLE/renderer/metal/mtl_utils.h > @@ -105,11 +105,9 @@ AutoObjCPtr<id<MTLLibrary>> CreateShaderLibrary( >@@ -2366,39 +835,8 @@ index 6c7e140..a77588c 100644 > AutoObjCPtr<NSError *> *error); > > bool SupportsAppleGPUFamily(id<MTLDevice> device, uint8_t appleFamily); >-diff --git a/src/libANGLE/renderer/metal/mtl_utils.mm b/src/libANGLE/renderer/metal/mtl_utils.mm >-index ee547a8..8f91f43 100644 >---- a/src/libANGLE/renderer/metal/mtl_utils.mm >-+++ b/src/libANGLE/renderer/metal/mtl_utils.mm >-@@ -374,7 +374,13 @@ bool GetCompressedBufferSizeAndRowLengthForTextureWithFormat(const TextureRef &t >- // Intiialize the content to black >- GLint layer, startDepth; >- GetSliceAndDepth(index, &layer, &startDepth); >-- if (texture->isCPUAccessible() && index.getType() != gl::TextureType::_2DMultisample && >-+ >-+ if (intendedInternalFormat.compressed) >-+ { >-+ return InitializeCompressedTextureContents(context, texture, textureObjFormat, index, layer, >-+ startDepth); >-+ } >-+ else if (texture->isCPUAccessible() && index.getType() != gl::TextureType::_2DMultisample && >- index.getType() != gl::TextureType::_2DMultisampleArray && !forceGPUInitialization) >- { >- const angle::Format &dstFormat = angle::Format::Get(textureObjFormat.actualFormatId); >-@@ -418,11 +424,6 @@ bool GetCompressedBufferSizeAndRowLengthForTextureWithFormat(const TextureRef &t >- } >- } >- } >-- else if (intendedInternalFormat.compressed) >-- { >-- return InitializeCompressedTextureContents(context, texture, textureObjFormat, index, layer, >-- startDepth); >-- } >- else >- { >- ANGLE_TRY(InitializeTextureContentsGPU(context, texture, textureObjFormat, index, > diff --git a/src/tests/angle_unittests.gni b/src/tests/angle_unittests.gni >-index 61345f8..dd70b9f 100644 >+index 61345f8c4..dd70b9fb6 100644 > --- a/src/tests/angle_unittests.gni > +++ b/src/tests/angle_unittests.gni > @@ -166,6 +166,8 @@ if (is_android) { >@@ -2452,5 +890,5 @@ rename from src/tests/deqp_support/deqp_khr_gles3_test_expectations.txt > rename to src/tests/deqp_support/deqp_khr_gles3_TestExpectations > diff --git a/third_party/r8/custom_d8.jar b/third_party/r8/custom_d8.jar > deleted file mode 100644 >-index 99a9106..0000000 >+index 99a910637..000000000 > Binary files a/third_party/r8/custom_d8.jar and /dev/null differ >diff --git a/Source/ThirdParty/ANGLE/doc/CaptureAndReplay.md b/Source/ThirdParty/ANGLE/doc/CaptureAndReplay.md >index f93af4c165b2c80fef610f73ef698b43947af017..df346bca1695ab669f4e2784caf70a1a8291f816 100644 >--- a/Source/ThirdParty/ANGLE/doc/CaptureAndReplay.md >+++ b/Source/ThirdParty/ANGLE/doc/CaptureAndReplay.md >@@ -19,8 +19,11 @@ To build ANGLE with capture and replay enabled update your GN args: > angle_with_capture_by_default = true > ``` > >-Once built ANGLE will capture the OpenGL ES calls to CPP replay files. By default the replay will be >-stored in the current working directory. The capture files will be named according to the pattern >+Once built with capture enabled by default, ANGLE supports capturing OpenGL ES calls to CPP replay >+files. To enable capture, set the `ANGLE_CAPTURE_FRAME_START` and `ANGLE_CAPTURE_FRAME_END` >+environment variables to define a capture frame range, or use the [capture trigger >+property][CaptureTrigger] on Android. By default the replay will be stored in the current working >+directory. The capture files will be named according to the pattern > `angle_capture_context{id}_frame{n}.cpp`. Each GL Context currently has its own replay sources. > ANGLE will write out data binary blobs for large Texture or Buffer contents to > `angle_capture_context{id}_frame{n}.angledata`. Replay programs must be able to load data from the >@@ -223,5 +226,4 @@ All command line arguments can be found at the top of the [python script][link_t > [angle_folder]: ../ > [capture_replay_test_folder]: ../src/tests/capture_replay_tests/ > [link_to_python_script]: ../src/tests/capture_replay_tests.py >- >- >+[CaptureTrigger]: ../src/tests/restricted_traces/README.md#trigger-the-capture >diff --git a/Source/ThirdParty/ANGLE/doc/CodingStandard.md b/Source/ThirdParty/ANGLE/doc/CodingStandard.md >index 89c609374137bd9d1446d66f5ef5a10f6dca70cf..27d3fa9fbb1fdfab234282ce661c7daa2229a298 100644 >--- a/Source/ThirdParty/ANGLE/doc/CodingStandard.md >+++ b/Source/ThirdParty/ANGLE/doc/CodingStandard.md >@@ -35,8 +35,8 @@ This will catch most of the trivial formatting errors and save you time. > * {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](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++11.md). >+* {DO} use C++11/14/17 according to the >+ [Chromium C++ features guide](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++-features.md). > > ### [Naming](https://google.github.io/styleguide/cppguide.html#Naming) > >diff --git a/Source/ThirdParty/ANGLE/doc/DebuggingTips.md b/Source/ThirdParty/ANGLE/doc/DebuggingTips.md >index 882eeb6d230b7087f128ef1aecba7a6bf22781bf..dcd81081132323f5cda7d4c22c09be7c311e2cf0 100644 >--- a/Source/ThirdParty/ANGLE/doc/DebuggingTips.md >+++ b/Source/ThirdParty/ANGLE/doc/DebuggingTips.md >@@ -335,19 +335,8 @@ Canary. > #### macOS > > 1. Download and install [Google Chrome Canary](https://www.google.com/chrome/canary/). >-2. Clear all attributes. >- ``` >- % xattr -cr /Applications/Google\ Chrome\ Canary.app >- ``` >-3. Build ANGLE x64 or arm64, Release. >-4. Replace ANGLE libraries, adjusting paths if needed. >- ``` >- % cp angle/out/Release/{libEGL.dylib,libGLESv2.dylib} /Applications/Google\ Chrome\ Canary.app/Contents/Frameworks/Google\ Chrome\ Framework.framework/Libraries >- ``` >-5. Re-sign the application bundle. >- ``` >- % codesign --force --sign - --deep /Applications/Google\ Chrome\ Canary.app >- ``` >+2. Build ANGLE for the running platform; GN args should contain `is_debug = false`. >+3. Run `./scripts/update_chrome_angle.py` to replace Canary's ANGLE with your custom ANGLE. > > ### Usage > >diff --git a/Source/ThirdParty/ANGLE/doc/DevSetup.md b/Source/ThirdParty/ANGLE/doc/DevSetup.md >index 597fb641e740309a98e24b32353bcaff77bf723a..31141e8c4c2adef2b97a701cf6376557e829963e 100644 >--- a/Source/ThirdParty/ANGLE/doc/DevSetup.md >+++ b/Source/ThirdParty/ANGLE/doc/DevSetup.md >@@ -104,7 +104,7 @@ ninja. A good default is 10*numCores to 20*numCores. If you run autoninja then > it will automatically pass an appropriate -j value to ninja for goma or not. > > ``` >-$ autoninja -C out\Debug >+$ autoninja -C out/Debug > ``` > > ### Building and Debugging with Visual Studio >diff --git a/Source/ThirdParty/ANGLE/doc/ExtensionSupport.md b/Source/ThirdParty/ANGLE/doc/ExtensionSupport.md >index ff05efc9e30b3c31950b741be157b91d194fb6c4..bc244300d6adf27ddc376d0d3e6a93776a7b14e3 100644 >--- a/Source/ThirdParty/ANGLE/doc/ExtensionSupport.md >+++ b/Source/ThirdParty/ANGLE/doc/ExtensionSupport.md >@@ -21,222 +21,224 @@ using data from registry_xml.py and gl.xml. > > *Note: some data is sampled from older drivers, so might not represent the latest driver support.* > >-| Extension Name | NVIDIA P400 Win10 | Intel 630 Win10 | NVIDIA P400 Linux | Intel 630 Linux | SwiftShader Win10 | Pixel 4 Android 11 | >+| Extension Name | NVIDIA 1660 Win10 | Intel 630 Win10 | NVIDIA 1660 Linux | Intel 630 Linux | SwiftShader Win10 | Pixel 4 Android 11 | > | -------------- | :---------------: | :-------------: | :---------------: | :-------------: | :---------------: | :----------------: | >-| [GL_KHR_blend_equation_advanced](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_blend_equation_advanced.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_blend_func_extended](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_blend_func_extended.txt) | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ | >-| [GL_EXT_blend_minmax](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_blend_minmax.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_buffer_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_buffer_storage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_clip_control](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_clip_cull_distance](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_cull_distance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_APPLE_clip_distance](https://khronos.org/registry/OpenGL/extensions/APPLE/APPLE_clip_distance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_color_buffer_float](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_color_buffer_half_float](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_EAC_R11_signed_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_R11_signed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_EAC_R11_unsigned_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_R11_unsigned_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_EAC_RG11_signed_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_RG11_signed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_EAC_RG11_unsigned_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_RG11_unsigned_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_compressed_ETC1_RGB8_sub_texture](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_compressed_ETC1_RGB8_sub_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_ETC1_RGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_punchthroughA_RGBA8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_ETC2_RGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_RGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_ETC2_RGBA8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_RGBA8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_ETC2_sRGB8_alpha8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_sRGB8_alpha8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_compressed_ETC2_sRGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_sRGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_copy_image](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_copy_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_copy_image](https://khronos.org/registry/OpenGL/extensions/OES/OES_copy_image.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_KHR_debug](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_debug.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_debug_label](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_debug_label.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_debug_marker](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_debug_marker.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_depth24](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth24.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_depth32](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth32.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_NV_depth_buffer_float2](https://khronos.org/registry/OpenGL/extensions/NV/NV_depth_buffer_float2.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_depth_texture](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_depth_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_depth_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_depth_texture_cube_map](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth_texture_cube_map.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_discard_framebuffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_discard_framebuffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_disjoint_timer_query](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_disjoint_timer_query.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_draw_buffers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_buffers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_draw_buffers_indexed](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_buffers_indexed.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_draw_buffers_indexed](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_buffers_indexed.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_draw_elements_base_vertex](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_elements_base_vertex.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_draw_elements_base_vertex](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_elements_base_vertex.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_EGL_image](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_EGL_image_array](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_EGL_image_external](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_EGL_image_external_essl3](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external_essl3.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_EGL_image_external_wrap_modes](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_external_wrap_modes.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_EGL_image_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_storage.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_NV_EGL_stream_consumer_external](https://khronos.org/registry/OpenGL/extensions/NV/NV_EGL_stream_consumer_external.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_OES_EGL_sync](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_sync.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_element_index_uint](https://khronos.org/registry/OpenGL/extensions/OES/OES_element_index_uint.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_external_buffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_buffer.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ | >-| [GL_OES_fbo_render_mipmap](https://khronos.org/registry/OpenGL/extensions/OES/OES_fbo_render_mipmap.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_NV_fence](https://khronos.org/registry/OpenGL/extensions/NV/NV_fence.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_float_blend](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_float_blend.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_frag_depth](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_frag_depth.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_framebuffer_blit](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_framebuffer_blit.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_NV_framebuffer_blit](https://khronos.org/registry/OpenGL/extensions/NV/NV_framebuffer_blit.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_MESA_framebuffer_flip_y](https://khronos.org/registry/OpenGL/extensions/MESA/MESA_framebuffer_flip_y.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_geometry_shader](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_geometry_shader.txt) | ✔ | ✔ | ❌ | ❌ | ❌ | ❌ | >-| [GL_OES_geometry_shader](https://khronos.org/registry/OpenGL/extensions/OES/OES_geometry_shader.txt) | ✔ | ✔ | ❌ | ❌ | ❌ | ❌ | >-| [GL_OES_get_program_binary](https://khronos.org/registry/OpenGL/extensions/OES/OES_get_program_binary.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_gpu_shader5](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_gpu_shader5.txt) | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ | >-| [GL_ANGLE_instanced_arrays](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_instanced_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_instanced_arrays](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_instanced_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_mapbuffer](https://khronos.org/registry/OpenGL/extensions/OES/OES_mapbuffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_map_buffer_range](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_map_buffer_range.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_memory_object](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_memory_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_memory_object_fd](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_fd.txt) | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ | >-| [GL_EXT_multi_draw_indirect](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multi_draw_indirect.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_multisample_compatibility](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisample_compatibility.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_multisampled_render_to_texture](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture.txt) | ✔ | ❌ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_multisampled_render_to_texture2](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture2.txt) | ✔ | ❌ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OVR_multiview](https://khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview.txt) | ✔ | ✔ | ❌ | ❌ | ✔ | ✔ | >-| [GL_OVR_multiview2](https://khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt) | ✔ | ✔ | ❌ | ❌ | ✔ | ✔ | >-| [GL_KHR_no_error](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_no_error.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_occlusion_query_boolean](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_occlusion_query_boolean.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_packed_depth_stencil](https://khronos.org/registry/OpenGL/extensions/OES/OES_packed_depth_stencil.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_pack_reverse_row_order](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_pack_reverse_row_order.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_NV_pack_subimage](https://khronos.org/registry/OpenGL/extensions/NV/NV_pack_subimage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_KHR_parallel_shader_compile](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_parallel_shader_compile.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_NV_pixel_buffer_object](https://khronos.org/registry/OpenGL/extensions/NV/NV_pixel_buffer_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_primitive_bounding_box](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_primitive_bounding_box.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_protected_textures](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_protected_textures.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ | >-| [GL_EXT_pvrtc_sRGB](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_pvrtc_sRGB.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_NV_read_depth](https://khronos.org/registry/OpenGL/extensions/NV/NV_read_depth.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_read_format_bgra](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_read_format_bgra.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_NV_read_stencil](https://khronos.org/registry/OpenGL/extensions/NV/NV_read_stencil.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_rgb8_rgba8](https://khronos.org/registry/OpenGL/extensions/OES/OES_rgb8_rgba8.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_KHR_robust_buffer_access_behavior](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_robust_buffer_access_behavior.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_robustness](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_robustness.txt) | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ | >-| [GL_NV_robustness_video_memory_purge](https://khronos.org/registry/OpenGL/extensions/NV/NV_robustness_video_memory_purge.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_OES_sample_shading](https://khronos.org/registry/OpenGL/extensions/OES/OES_sample_shading.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_sample_variables](https://khronos.org/registry/OpenGL/extensions/OES/OES_sample_variables.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_semaphore](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_semaphore.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_semaphore_fd](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_fd.txt) | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ | >-| [GL_EXT_separate_shader_objects](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_separate_shader_objects.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_shader_framebuffer_fetch_non_coherent](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_framebuffer_fetch_non_coherent.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_OES_shader_image_atomic](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_image_atomic.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_shader_io_blocks](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_io_blocks.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_shader_io_blocks](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_io_blocks.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_shader_multisample_interpolation](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_multisample_interpolation.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_shader_non_constant_global_initializers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_non_constant_global_initializers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_NV_shader_noperspective_interpolation](https://khronos.org/registry/OpenGL/extensions/NV/NV_shader_noperspective_interpolation.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_shader_texture_lod](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_texture_lod.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_shadow_samplers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shadow_samplers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_sRGB](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_sRGB_write_control](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB_write_control.txt) | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ | >-| [GL_OES_standard_derivatives](https://khronos.org/registry/OpenGL/extensions/OES/OES_standard_derivatives.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_surfaceless_context](https://khronos.org/registry/OpenGL/extensions/OES/OES_surfaceless_context.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ARB_sync](https://khronos.org/registry/OpenGL/extensions/ARB/ARB_sync.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_tessellation_shader](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_tessellation_shader.txt) | ✔ | ✔ | ❌ | ❌ | ❌ | ❌ | >-| [GL_OES_texture_3D](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_3D.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_border_clamp](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_border_clamp.txt) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_OES_texture_border_clamp](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_border_clamp.txt) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_texture_buffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_buffer.txt) | ✔ | ❌ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_texture_buffer](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_buffer.txt) | ✔ | ❌ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_texture_compression_astc](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_compression_astc.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_KHR_texture_compression_astc_hdr](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_hdr.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_KHR_texture_compression_astc_ldr](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_ldr.txt) | ❌ | ✔ | ❌ | ✔ | ✔ | ✔ | >-| [GL_KHR_texture_compression_astc_sliced_3d](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_sliced_3d.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_texture_compression_bptc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_bptc.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_EXT_texture_compression_dxt1](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_dxt1.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_IMG_texture_compression_pvrtc](https://khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_IMG_texture_compression_pvrtc2](https://khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc2.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_texture_compression_rgtc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_rgtc.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_EXT_texture_compression_s3tc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_s3tc.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_texture_compression_s3tc_srgb](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_s3tc_srgb.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_EXT_texture_cube_map_array](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_cube_map_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_texture_cube_map_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_cube_map_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_filter_anisotropic](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_filter_anisotropic.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_texture_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_texture_float_linear](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_float_linear.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_EXT_texture_format_BGRA8888](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_format_BGRA8888.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_format_sRGB_override](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_format_sRGB_override.txt) | ❌ | ✔ | ❌ | ❌ | ❌ | ❌ | >-| [GL_OES_texture_half_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_texture_half_float_linear](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_half_float_linear.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_norm16](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_norm16.txt) | ❌ | ✔ | ❌ | ✔ | ❌ | ❌ | >-| [GL_OES_texture_npot](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_npot.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_rg](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_rg.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_sRGB_decode](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_decode.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_sRGB_R8](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_R8.txt) | ✔ | ❌ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_sRGB_RG8](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_RG8.txt) | ❌ | ❌ | ❌ | ❌ | ✔ | ✔ | >-| [GL_OES_texture_stencil8](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_stencil8.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_storage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_texture_storage_multisample_2d_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_storage_multisample_2d_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_EXT_texture_type_2_10_10_10_REV](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_type_2_10_10_10_REV.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_texture_usage](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_texture_usage.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_translated_shader_source](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_translated_shader_source.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_unpack_subimage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_unpack_subimage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_vertex_array_object](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_array_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_vertex_half_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_OES_vertex_type_10_10_10_2](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_type_10_10_10_2.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_WEBGL_video_texture](https://khronos.org/registry/OpenGL/extensions/WEBGL/WEBGL_video_texture.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_EXT_YUV_target](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_YUV_target.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >+| [GL_KHR_blend_equation_advanced](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_blend_equation_advanced.txt) | | | | | | | >+| [GL_EXT_blend_func_extended](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_blend_func_extended.txt) | ✔ | ✔ | ✔ | ✔ | | ✔ | >+| [GL_EXT_blend_minmax](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_blend_minmax.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_buffer_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_buffer_storage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_clip_control](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_clip_cull_distance](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_clip_cull_distance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_APPLE_clip_distance](https://khronos.org/registry/OpenGL/extensions/APPLE/APPLE_clip_distance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_color_buffer_float](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_color_buffer_half_float](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_color_buffer_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_EAC_R11_signed_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_R11_signed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_EAC_R11_unsigned_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_R11_unsigned_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_EAC_RG11_signed_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_RG11_signed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_EAC_RG11_unsigned_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_EAC_RG11_unsigned_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_compressed_ETC1_RGB8_sub_texture](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_compressed_ETC1_RGB8_sub_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_ETC1_RGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC1_RGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_punchthroughA_RGBA8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_ETC2_RGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_RGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_ETC2_RGBA8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_RGBA8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_ETC2_sRGB8_alpha8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_sRGB8_alpha8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_compressed_ETC2_sRGB8_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_compressed_ETC2_sRGB8_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_copy_image](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_copy_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_copy_image](https://khronos.org/registry/OpenGL/extensions/OES/OES_copy_image.txt) | | | | | | | >+| [GL_KHR_debug](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_debug.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_debug_label](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_debug_label.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_debug_marker](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_debug_marker.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_depth24](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth24.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_depth32](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth32.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_NV_depth_buffer_float2](https://khronos.org/registry/OpenGL/extensions/NV/NV_depth_buffer_float2.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_depth_texture](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_depth_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_depth_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_depth_texture_cube_map](https://khronos.org/registry/OpenGL/extensions/OES/OES_depth_texture_cube_map.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_discard_framebuffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_discard_framebuffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_disjoint_timer_query](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_disjoint_timer_query.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_draw_buffers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_buffers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_draw_buffers_indexed](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_buffers_indexed.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_draw_buffers_indexed](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_buffers_indexed.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_draw_elements_base_vertex](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_elements_base_vertex.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_draw_elements_base_vertex](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_elements_base_vertex.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_EGL_image](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_EGL_image_array](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_EGL_image_external](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_EGL_image_external_essl3](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external_essl3.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_EGL_image_external_wrap_modes](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_external_wrap_modes.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_EGL_image_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_EGL_image_storage.txt) | | | | | | | >+| [GL_NV_EGL_stream_consumer_external](https://khronos.org/registry/OpenGL/extensions/NV/NV_EGL_stream_consumer_external.txt) | | | | | | | >+| [GL_OES_EGL_sync](https://khronos.org/registry/OpenGL/extensions/OES/OES_EGL_sync.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_element_index_uint](https://khronos.org/registry/OpenGL/extensions/OES/OES_element_index_uint.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANDROID_extension_pack_es31a](https://khronos.org/registry/OpenGL/extensions/ANDROID/ANDROID_extension_pack_es31a.txt) | | | | | | | >+| [GL_EXT_external_buffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_buffer.txt) | | | | | | ✔ | >+| [GL_OES_fbo_render_mipmap](https://khronos.org/registry/OpenGL/extensions/OES/OES_fbo_render_mipmap.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_NV_fence](https://khronos.org/registry/OpenGL/extensions/NV/NV_fence.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_float_blend](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_float_blend.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_frag_depth](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_frag_depth.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_framebuffer_blit](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_framebuffer_blit.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_NV_framebuffer_blit](https://khronos.org/registry/OpenGL/extensions/NV/NV_framebuffer_blit.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_MESA_framebuffer_flip_y](https://khronos.org/registry/OpenGL/extensions/MESA/MESA_framebuffer_flip_y.txt) | | | | | | | >+| [GL_EXT_geometry_shader](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_geometry_shader.txt) | ✔ | ✔ | ✔ | | | | >+| [GL_OES_geometry_shader](https://khronos.org/registry/OpenGL/extensions/OES/OES_geometry_shader.txt) | ✔ | ✔ | ✔ | | | | >+| [GL_OES_get_program_binary](https://khronos.org/registry/OpenGL/extensions/OES/OES_get_program_binary.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_gpu_shader5](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_gpu_shader5.txt) | ✔ | ✔ | ✔ | ✔ | | ✔ | >+| [GL_ANGLE_instanced_arrays](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_instanced_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_instanced_arrays](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_instanced_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_mapbuffer](https://khronos.org/registry/OpenGL/extensions/OES/OES_mapbuffer.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_map_buffer_range](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_map_buffer_range.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_memory_object](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_memory_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_memory_object_fd](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_fd.txt) | | | ✔ | ✔ | | ✔ | >+| [GL_EXT_multi_draw_indirect](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multi_draw_indirect.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_multisample_compatibility](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisample_compatibility.txt) | | | | | | | >+| [GL_EXT_multisampled_render_to_texture](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture.txt) | ✔ | | ✔ | ✔ | | ✔ | >+| [GL_EXT_multisampled_render_to_texture2](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture2.txt) | ✔ | | ✔ | ✔ | | ✔ | >+| [GL_OVR_multiview](https://khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview.txt) | ✔ | ✔ | ✔ | | ✔ | ✔ | >+| [GL_OVR_multiview2](https://khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt) | ✔ | ✔ | ✔ | | ✔ | ✔ | >+| [GL_KHR_no_error](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_no_error.txt) | | | | | | | >+| [GL_EXT_occlusion_query_boolean](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_occlusion_query_boolean.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_packed_depth_stencil](https://khronos.org/registry/OpenGL/extensions/OES/OES_packed_depth_stencil.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_pack_reverse_row_order](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_pack_reverse_row_order.txt) | | | | | | | >+| [GL_NV_pack_subimage](https://khronos.org/registry/OpenGL/extensions/NV/NV_pack_subimage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_KHR_parallel_shader_compile](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_parallel_shader_compile.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_NV_pixel_buffer_object](https://khronos.org/registry/OpenGL/extensions/NV/NV_pixel_buffer_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_primitive_bounding_box](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_primitive_bounding_box.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_protected_textures](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_protected_textures.txt) | | | | | | ✔ | >+| [GL_EXT_pvrtc_sRGB](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_pvrtc_sRGB.txt) | | | | | | | >+| [GL_NV_read_depth](https://khronos.org/registry/OpenGL/extensions/NV/NV_read_depth.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_read_format_bgra](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_read_format_bgra.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_NV_read_stencil](https://khronos.org/registry/OpenGL/extensions/NV/NV_read_stencil.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_rgb8_rgba8](https://khronos.org/registry/OpenGL/extensions/OES/OES_rgb8_rgba8.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_KHR_robust_buffer_access_behavior](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_robust_buffer_access_behavior.txt) | | | | | | | >+| [GL_EXT_robustness](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_robustness.txt) | ✔ | ✔ | ✔ | ✔ | | ✔ | >+| [GL_NV_robustness_video_memory_purge](https://khronos.org/registry/OpenGL/extensions/NV/NV_robustness_video_memory_purge.txt) | | | | | | | >+| [GL_OES_sample_shading](https://khronos.org/registry/OpenGL/extensions/OES/OES_sample_shading.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_sample_variables](https://khronos.org/registry/OpenGL/extensions/OES/OES_sample_variables.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_semaphore](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_semaphore.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_semaphore_fd](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_external_objects_fd.txt) | | | ✔ | ✔ | | ✔ | >+| [GL_EXT_separate_shader_objects](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_separate_shader_objects.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_shader_framebuffer_fetch](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_framebuffer_fetch.txt) | | | | | | | >+| [GL_EXT_shader_framebuffer_fetch_non_coherent](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_framebuffer_fetch_non_coherent.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_OES_shader_image_atomic](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_image_atomic.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_shader_io_blocks](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_io_blocks.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_shader_io_blocks](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_io_blocks.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_shader_multisample_interpolation](https://khronos.org/registry/OpenGL/extensions/OES/OES_shader_multisample_interpolation.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_shader_non_constant_global_initializers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_non_constant_global_initializers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_NV_shader_noperspective_interpolation](https://khronos.org/registry/OpenGL/extensions/NV/NV_shader_noperspective_interpolation.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_shader_texture_lod](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shader_texture_lod.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_shadow_samplers](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_shadow_samplers.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_sRGB](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_sRGB_write_control](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB_write_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_standard_derivatives](https://khronos.org/registry/OpenGL/extensions/OES/OES_standard_derivatives.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_surfaceless_context](https://khronos.org/registry/OpenGL/extensions/OES/OES_surfaceless_context.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ARB_sync](https://khronos.org/registry/OpenGL/extensions/ARB/ARB_sync.txt) | | | | | | | >+| [GL_EXT_tessellation_shader](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_tessellation_shader.txt) | ✔ | ✔ | ✔ | | | | >+| [GL_OES_texture_3D](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_3D.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_border_clamp](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_border_clamp.txt) | ✔ | | | | | | >+| [GL_OES_texture_border_clamp](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_border_clamp.txt) | ✔ | | | | | | >+| [GL_EXT_texture_buffer](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_buffer.txt) | ✔ | | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_texture_buffer](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_buffer.txt) | ✔ | | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_texture_compression_astc](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_compression_astc.txt) | | | | | | | >+| [GL_KHR_texture_compression_astc_hdr](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_hdr.txt) | | | | | | | >+| [GL_KHR_texture_compression_astc_ldr](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_ldr.txt) | | ✔ | | ✔ | ✔ | ✔ | >+| [GL_KHR_texture_compression_astc_sliced_3d](https://khronos.org/registry/OpenGL/extensions/KHR/KHR_texture_compression_astc_sliced_3d.txt) | | | | | | | >+| [GL_EXT_texture_compression_bptc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_bptc.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_EXT_texture_compression_dxt1](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_dxt1.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_IMG_texture_compression_pvrtc](https://khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt) | | | | | | | >+| [GL_IMG_texture_compression_pvrtc2](https://khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc2.txt) | | | | | | | >+| [GL_EXT_texture_compression_rgtc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_rgtc.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_EXT_texture_compression_s3tc](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_s3tc.txt) | | | | | | | >+| [GL_EXT_texture_compression_s3tc_srgb](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_compression_s3tc_srgb.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_EXT_texture_cube_map_array](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_cube_map_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_texture_cube_map_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_cube_map_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_filter_anisotropic](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_filter_anisotropic.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_texture_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_texture_float_linear](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_float_linear.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_EXT_texture_format_BGRA8888](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_format_BGRA8888.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_format_sRGB_override](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_format_sRGB_override.txt) | | ✔ | | | | | >+| [GL_OES_texture_half_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_texture_half_float_linear](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_half_float_linear.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_norm16](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_norm16.txt) | | ✔ | | ✔ | | | >+| [GL_OES_texture_npot](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_npot.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_rg](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_rg.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_sRGB_decode](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_decode.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_sRGB_R8](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_R8.txt) | ✔ | | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_sRGB_RG8](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB_RG8.txt) | | | | | ✔ | ✔ | >+| [GL_OES_texture_stencil8](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_stencil8.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_storage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_storage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_texture_storage_multisample_2d_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_storage_multisample_2d_array.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_EXT_texture_type_2_10_10_10_REV](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_type_2_10_10_10_REV.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_texture_usage](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_texture_usage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_translated_shader_source](https://khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_translated_shader_source.txt) | | | | | | | >+| [GL_EXT_unpack_subimage](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_unpack_subimage.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_vertex_array_object](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_array_object.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_vertex_half_float](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_half_float.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_OES_vertex_type_10_10_10_2](https://khronos.org/registry/OpenGL/extensions/OES/OES_vertex_type_10_10_10_2.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_WEBGL_video_texture](https://khronos.org/registry/OpenGL/extensions/WEBGL/WEBGL_video_texture.txt) | | | | | | | >+| [GL_EXT_YUV_target](https://khronos.org/registry/OpenGL/extensions/EXT/EXT_YUV_target.txt) | | | | | | | > > ## ANGLE unofficial extension support > > *Note: some ANGLE extensions are currently missing specifications.* > >-| Extension Name | NVIDIA P400 Win10 | Intel 630 Win10 | NVIDIA P400 Linux | Intel 630 Linux | SwiftShader Win10 | Pixel 4 Android 11 | >+| Extension Name | NVIDIA 1660 Win10 | Intel 630 Win10 | NVIDIA 1660 Linux | Intel 630 Linux | SwiftShader Win10 | Pixel 4 Android 11 | > | -------------- | :---------------: | :-------------: | :---------------: | :-------------: | :---------------: | :----------------: | >-| [GL_ANGLE_base_vertex_base_instance](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_base_vertex_base_instance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_base_vertex_base_instance_shader_builtin](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_base_vertex_base_instance_shader_builtin.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_CHROMIUM_bind_generates_resource](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_bind_generates_resource.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_CHROMIUM_bind_uniform_location](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_bind_uniform_location.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_client_arrays](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_client_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_CHROMIUM_color_buffer_float_rgb](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_color_buffer_float_rgb.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_CHROMIUM_color_buffer_float_rgba](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_color_buffer_float_rgba.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_compressed_texture_etc](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_compressed_texture_etc.txt) | ❌ | ✔ | ❌ | ✔ | ✔ | ✔ | >-| [GL_CHROMIUM_copy_compressed_texture](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_copy_compressed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_CHROMIUM_copy_texture](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_copy_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_copy_texture_3d](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_copy_texture_3d.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_CHROMIUM_framebuffer_mixed_samples](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_framebuffer_mixed_samples.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_framebuffer_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_framebuffer_multisample.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_get_image](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_get_serialized_context_string](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_serialized_context_string.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_get_tex_level_parameter](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_tex_level_parameter.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_CHROMIUM_lose_context](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_lose_context.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_lossy_etc_decode](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_lossy_etc_decode.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_memory_object_flags](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_object_flags.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_memory_object_fuchsia](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_object_fuchsia.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_memory_size](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_size.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_multi_draw](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_multi_draw.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_multiview_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_multiview_multisample.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_program_binary](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_program_binary.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_program_cache_control](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_program_cache_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_provoking_vertex](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_provoking_vertex.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_relaxed_vertex_attribute_type](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_relaxed_vertex_attribute_type.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_request_extension](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_request_extension.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_rgbx_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_rgbx_internal_format.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_robust_client_memory](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_client_memory.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >-| [GL_ANGLE_robust_fragment_shader_output](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_fragment_shader_output.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_robust_resource_initialization](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_resource_initialization.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_semaphore_fuchsia](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_semaphore_fuchsia.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_CHROMIUM_sync_query](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_sync_query.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_texture_compression_dxt3](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_compression_dxt3.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_ANGLE_texture_compression_dxt5](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_compression_dxt5.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | >-| [GL_ANGLE_texture_external_update](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_external_update.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_CHROMIUM_texture_filtering_hint](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_texture_filtering_hint.txt) | ❌ | ❌ | ❌ | ❌ | ✔ | ❌ | >-| [GL_ANGLE_texture_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_multisample.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_texture_rectangle](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_rectangle.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_vulkan_image](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_vulkan_image.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_webgl_compatibility](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_webgl_compatibility.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | >-| [GL_ANGLE_yuv_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_yuv_internal_format.txt) | ✔ | ❌ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_base_vertex_base_instance](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_base_vertex_base_instance.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_base_vertex_base_instance_shader_builtin](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_base_vertex_base_instance_shader_builtin.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_CHROMIUM_bind_generates_resource](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_bind_generates_resource.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_CHROMIUM_bind_uniform_location](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_bind_uniform_location.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_client_arrays](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_client_arrays.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_CHROMIUM_color_buffer_float_rgb](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_color_buffer_float_rgb.txt) | | | | | | | >+| [GL_CHROMIUM_color_buffer_float_rgba](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_color_buffer_float_rgba.txt) | | | | | | | >+| [GL_ANGLE_compressed_texture_etc](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_compressed_texture_etc.txt) | | ✔ | | ✔ | ✔ | ✔ | >+| [GL_CHROMIUM_copy_compressed_texture](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_copy_compressed_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_CHROMIUM_copy_texture](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_copy_texture.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_copy_texture_3d](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_copy_texture_3d.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_CHROMIUM_framebuffer_mixed_samples](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_framebuffer_mixed_samples.txt) | | | | | | | >+| [GL_ANGLE_framebuffer_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_framebuffer_multisample.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_get_image](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_get_serialized_context_string](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_serialized_context_string.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_get_tex_level_parameter](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_get_tex_level_parameter.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_CHROMIUM_lose_context](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_lose_context.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_lossy_etc_decode](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_lossy_etc_decode.txt) | | | | | | | >+| [GL_ANGLE_memory_object_flags](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_object_flags.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_memory_object_fuchsia](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_object_fuchsia.txt) | | | | | | | >+| [GL_ANGLE_memory_size](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_memory_size.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_multi_draw](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_multi_draw.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_multiview_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_multiview_multisample.txt) | | | | | | | >+| [GL_ANGLE_program_binary](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_program_binary.txt) | | | | | | | >+| [GL_ANGLE_program_cache_control](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_program_cache_control.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_provoking_vertex](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_provoking_vertex.txt) | | | | | | | >+| [GL_ANGLE_relaxed_vertex_attribute_type](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_relaxed_vertex_attribute_type.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_request_extension](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_request_extension.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_rgbx_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_rgbx_internal_format.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_robust_client_memory](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_client_memory.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_robust_fragment_shader_output](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_fragment_shader_output.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_robust_resource_initialization](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_resource_initialization.txt) | | | | | | | >+| [GL_ANGLE_semaphore_fuchsia](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_semaphore_fuchsia.txt) | | | | | | | >+| [GL_CHROMIUM_sync_query](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_sync_query.txt) | | | | | | | >+| [GL_ANGLE_texture_compression_dxt3](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_compression_dxt3.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_ANGLE_texture_compression_dxt5](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_compression_dxt5.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | | >+| [GL_ANGLE_texture_external_update](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_external_update.txt) | | | | | | | >+| [GL_CHROMIUM_texture_filtering_hint](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/CHROMIUM_texture_filtering_hint.txt) | | | | | ✔ | | >+| [GL_ANGLE_texture_multisample](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_multisample.txt) | | | | | | | >+| [GL_ANGLE_texture_rectangle](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_texture_rectangle.txt) | | | | | | | >+| [GL_ANGLE_vulkan_image](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_vulkan_image.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | >+| [GL_ANGLE_webgl_compatibility](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_webgl_compatibility.txt) | | | | | | | >+| [GL_ANGLE_yuv_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_yuv_internal_format.txt) | ✔ | | ✔ | ✔ | ✔ | ✔ | > > ## GLES 1.0 and 1.1 extension support > > | Extension Name | SwiftShader Win10 | > | -------------- | :---------------: | >-| [GL_OES_draw_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_texture.txt) | ✔ | >-| [GL_OES_framebuffer_object](https://khronos.org/registry/OpenGL/extensions/OES/OES_framebuffer_object.txt) | ✔ | >-| [GL_OES_matrix_palette](https://khronos.org/registry/OpenGL/extensions/OES/OES_matrix_palette.txt) | ❌ | >-| [GL_OES_point_size_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_point_size_array.txt) | ✔ | >-| [GL_OES_point_sprite](https://khronos.org/registry/OpenGL/extensions/OES/OES_point_sprite.txt) | ✔ | >-| [GL_OES_query_matrix](https://khronos.org/registry/OpenGL/extensions/OES/OES_query_matrix.txt) | ❌ | >-| [GL_OES_texture_cube_map](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_cube_map.txt) | ✔ | >+| [GL_OES_draw_texture](https://khronos.org/registry/OpenGL/extensions/OES/OES_draw_texture.txt) | ✔ | >+| [GL_OES_framebuffer_object](https://khronos.org/registry/OpenGL/extensions/OES/OES_framebuffer_object.txt) | ✔ | >+| [GL_OES_matrix_palette](https://khronos.org/registry/OpenGL/extensions/OES/OES_matrix_palette.txt) | | >+| [GL_OES_point_size_array](https://khronos.org/registry/OpenGL/extensions/OES/OES_point_size_array.txt) | ✔ | >+| [GL_OES_point_sprite](https://khronos.org/registry/OpenGL/extensions/OES/OES_point_sprite.txt) | ✔ | >+| [GL_OES_query_matrix](https://khronos.org/registry/OpenGL/extensions/OES/OES_query_matrix.txt) | | >+| [GL_OES_texture_cube_map](https://khronos.org/registry/OpenGL/extensions/OES/OES_texture_cube_map.txt) | ✔ | > > ## EGL extension support > >@@ -246,69 +248,71 @@ list of supported EGL extensions in ANGLE's front-end see > > ## Configuration information > >-NVIDIA P400 Win10: >+NVIDIA 1660 Win10: > >- * `GL_RENDERER` is `ANGLE (NVIDIA, Vulkan 1.2.133 (NVIDIA Quadro P400 (0x00001CB3)), NVIDIA-451.48.0.0)` >+ * `GL_RENDERER` is `ANGLE (NVIDIA, Vulkan 1.2.142 (NVIDIA GeForce GTX 1660 (0x00002184)), NVIDIA-456.38.0.0)` > * `GL_VENDOR` is `Google Inc. (NVIDIA)` >- * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)` >- * Data updated October 1, 2021 >+ * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)` >+ * Data updated December 28, 2021 > > Intel 630 Win10: > > * `GL_RENDERER` is `ANGLE (Intel, Vulkan 1.2.135 (Intel(R) HD Graphics 630 (0x00005912)), Intel Corporation-100.100.)` > * `GL_VENDOR` is `Google Inc. (Intel)` >- * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.16846 git hash: 22d8115a208b)` >- * Data updated October 1, 2021 >+ * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)` >+ * Data updated December 28, 2021 > >-NVIDIA P400 Linux: >+NVIDIA 1660 Linux: > >- * `GL_RENDERER` is `ANGLE (NVIDIA, Vulkan 1.1.95 (NVIDIA Quadro P400 (0x00001CB3)), NVIDIA-418.56.0.0)` >+ * `GL_RENDERER` is `ANGLE (NVIDIA, Vulkan 1.1.119 (NVIDIA GeForce GTX 1660 (0x00002184)), NVIDIA-440.100.0.0)` > * `GL_VENDOR` is `Google Inc. (NVIDIA)` >- * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)` >- * Data updated October 1, 2021 >+ * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)` >+ * Data updated December 28, 2021 > > Intel 630 Linux: > > * `GL_RENDERER` is `ANGLE (Intel, Vulkan 1.1.96 (Intel(R) HD Graphics 630 (Kaby Lake GT2) (0x00005912)), Intel open-source Mesa driver-19.0.2)` > * `GL_VENDOR` is `Google Inc. (Intel)` >- * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)` >- * Data updated October 1, 2021 >+ * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)` >+ * Data updated December 28, 2021 > > SwiftShader Win10: > > * `GL_RENDERER` is `ANGLE (Google, Vulkan 1.2.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver-5.0.0)` > * `GL_VENDOR` is `Google Inc. (Google)` >- * `GL_VERSION` is `OpenGL ES 3.1.0 (ANGLE 2.1.16782 git hash: 368c0ce94472)` >- * Data updated September 23, 2021 >+ * `GL_VERSION` is `OpenGL ES 3.1.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)` >+ * Data updated December 28, 2021 > > Pixel 4 Android 11: > > * `GL_RENDERER` is `ANGLE (Qualcomm, Vulkan 1.1.128 (Adreno (TM) 640 (0x06040001)), Qualcomm Technologies Inc. Adreno Vulkan Driver-512.490.0)` > * `GL_VENDOR` is `Google Inc. (Qualcomm)` >- * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)` >- * Data updated October 1, 2021 >+ * `GL_VERSION` is `OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)` >+ * Data updated December 28, 2021 > > ## How to update supported extension data > > Supported extension data is stored in the ANGLE repo as JSON files in > [`scripts/extension_data`](../scripts/extension_data). The JSON data is > sourced from public ANGLE test runs. Look for `angle_end2end_tests` in a bot >-run: [example link](https://ci.chromium.org/ui/p/angle/builders/ci/win-clang-x64-rel/8183/overview). >+run: [example link](https://ci.chromium.org/ui/p/angle/builders/ci/win-test/520/overview). > Search for "`angle_end2end_tests`", then click on the "cas output" and find >-`GLinfo_ES3_2_Vulkan.json`. >+`GLinfo_ES3_2_Vulkan.json` or `GLinfo_ES3_1_Vulkan_SwiftShader.json` for >+SwiftShader. > >-The Pixel 4 and GLES 3 NVIDIA and Intel data is automatically updated using >+All data except for GLES 1 is automatically updated using > the [`update_extension_data.py`](../scripts/update_extension_data.py) script. > To use it first authenticate to the `bb` and `luci-go` tools by running `bb > auth-login` and `./tools/luci-go/swarming login`. Then run the script and > re-run [code generation][CodeGen]. > >-The GLES 1 and SwiftShader data is currently manually updated. Find the relevant >+The GLES 1 data is currently manually updated. Find the relevant > file from the task output (see above) and overwrite the correspoding file. > Re-run [code generation][CodeGen] and create a CL as per our normal process. > > To add a new configuration, first retrieve the JSON data, modify > [`gen_extensions.py`](../src/libANGLE/gen_extensions.py) as necessary, then > run [`scripts/run_code_generation.py`][CodeGen] to refresh generated files. >+Also update `update_extension_data.py` as necessary. > > [CodeGen]: ../scripts/run_code_generation.py >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_device_id.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_device_id.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..1d3ec2b9cb3540ce837c5e193dfe9caaf2b9405c >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_platform_angle_device_id.txt >@@ -0,0 +1,84 @@ >+Name >+ >+ ANGLE_platform_angle_device_id >+ >+Name Strings >+ >+ EGL_ANGLE_platform_angle_device_id >+ >+Contributors >+ >+ Jonah Ryan-Davis, Google >+ >+Contacts >+ >+ Jonah Ryan-Davis, Google (jonahr 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, 2021-12-14 >+ >+Number >+ >+ EGL Extension XXX >+ >+Extension Type >+ >+ EGL client extension >+ >+Dependencies >+ >+ Requires ANGLE_platform_angle. >+ >+Overview >+ >+ This extension enables the selection of a graphics device to back >+ an ANGLE EGLDisplay. >+ >+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_DEVICE_ID_HIGH_ANGLE 0x34D6 >+ EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE 0x34D7 >+ >+Additions to the EGL Specification >+ >+ None >+ >+New Behavior >+ >+ To request a display that is backed by a specific graphics device, >+ EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE and/or >+ EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE should be set to the high part and >+ low part of the device's ID. If only one attribute is specified, the other >+ is assumed to be zero. The device's ID is specific to the platform that >+ ANGLE is running on, but should fit into one 64-bit value. >+ >+ If the high part and low part combined is zero, an EGL_BAD_ATTRIBUTE error >+ is generated and EGL_NO_DISPLAY is returned. >+ >+ If the ID specified doesn't match any devices on the system, the default >+ device is used. >+ >+Issues >+ >+ None >+ >+Revision History >+ >+ Version 1, 2021-12-14 (Jonah Ryan-Davis) >+ - Initial draft, based on EGL_ANGLE_platform_angle_d3d_luid >diff --git a/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_prepare_swap_buffers.txt b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_prepare_swap_buffers.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..9c571e27e0b85a99f765a114755ffae4c083857d >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/extensions/EGL_ANGLE_prepare_swap_buffers.txt >@@ -0,0 +1,86 @@ >+Name >+ >+ ANGLE_prepare_swap_buffers >+ >+Name Strings >+ >+ EGL_ANGLE_prepare_swap_buffers >+ >+Contributors >+ >+ Jamie Madill >+ Shahbaz Youssefi >+ Lingfeng Yang >+ >+Contacts >+ >+ Jamie Madill, Google Inc. (jmadill 'at' google.com) >+ Shahbaz Youssefi, Google Inc. (syoussefi 'at' google.com) >+ Lingfeng Yang, Google Inc. (lfy 'at' google.com) >+ >+Status >+ >+ Draft >+ >+Version >+ >+ Version 1, January 10, 2022 >+ >+Number >+ >+ EGL Extension #?? >+ >+Dependencies >+ >+ This extension is written against the wording of the EGL 1.5 >+ Specification. >+ >+Overview >+ >+ The EGL implementation often relies on a swapchain to present backbuffer >+ rendering results. Images are dequeued from the swapchain, then written in >+ the course of rendering, and then queued back to the swapchain for >+ presentation. It can be advantageous to provide a hint API that performs >+ the dequeue operation and other operations necessary to prepare the >+ swapchain image for rendering, without also queueing it for present, >+ especially if there is going to be a long or variable wait associated with >+ the dequeue. This extension provides that api, eglPrepareSwapBuffers. >+ >+New Types >+ >+ None. >+ >+New Procedures and Functions >+ >+ EGLBoolean eglPrepareSwapBuffersANGLE( >+ EGLDisplay dpy, >+ EGLSurface surface); >+ >+New Tokens >+ >+ None >+ >+Additions to the EGL 1.5 Specification >+ >+ Add the following to section 3.10.1 "Posting to a Window": >+ >+ An application can encourage the EGL implementation to dequeue and >+ otherwise prepare a swapchain image earlier before presenting via calling >+ >+ EGLBoolean eglPrepareSwapBuffersANGLE( >+ EGLDisplay dpy, >+ EGLSurface surface); >+ >+ The behaviour of eglPrepareSwapBuffers can be a no-op. It is not necessary >+ to call eglSwapBuffers after calling. Conversely, it's also not necessary >+ to call eglPrepareSwapBuffersANGLE for eglSwapBuffers to work. >+ >+Issues >+ >+ None yet. >+ >+Revision History >+ >+ Rev. Date Author Changes >+ ---- ------------- --------- ---------------------------------------- >+ 1 Jan 10, 2022 lfy Initial version >diff --git a/Source/ThirdParty/ANGLE/gni/angle.gni b/Source/ThirdParty/ANGLE/gni/angle.gni >index ca1c4598c3268f22cf4ff4aeb0952b1b78078f65..90ac0793610c99c858fe5d2c7fb8fc03d05ff540 100644 >--- a/Source/ThirdParty/ANGLE/gni/angle.gni >+++ b/Source/ThirdParty/ANGLE/gni/angle.gni >@@ -316,6 +316,10 @@ template("angle_executable") { > if (angle_has_build && is_win) { > data_deps += [ "//build/win:runtime_libs" ] > } >+ >+ if (is_ios) { >+ check_includes = false >+ } > } > } > >@@ -536,17 +540,12 @@ template("angle_trace_fixture") { > } > > template("angle_trace") { >- _trace_prefix = invoker.trace_prefix > angle_shared_library(target_name) { > testonly = true > > # Similar to capture replay sample, use the file index for sources >- sources = [ >- "${_trace_prefix}.cpp", >- "${_trace_prefix}.h", >- ] + invoker.sources >+ sources = invoker.sources > >- # TODO(http://anglebug.com/5133): Revert back to non-autogen'ed data. > data = invoker.data > defines = [ "ANGLE_REPLAY_IMPLEMENTATION" ] > suppressed_configs += [ "$angle_root:constructor_and_destructor_warnings" ] >@@ -577,8 +576,60 @@ template("angle_trace") { > output_name = invoker.output_name > } > } >+} >+ >+set_defaults("angle_trace_library") { >+ # Uses a short name to work around file path limits on Windows. >+ short_names = false >+} >+ >+template("angle_trace_library") { >+ _trace_json = read_file(invoker.json_path, "json") >+ _trace_targets = [] >+ >+ if (invoker.short_names) { >+ _trace_counter = 1 >+ } >+ >+ foreach(_trace_and_version, _trace_json.traces) { >+ _trace_and_version_arr = [] >+ _trace_and_version_arr = string_split(_trace_and_version) >+ _trace = _trace_and_version_arr[0] >+ if (defined(invoker.trace_dir)) { >+ _trace_dir = invoker.trace_dir >+ } else { >+ _trace_dir = _trace >+ } >+ _trace_json_path = "$_trace_dir/$_trace.json" >+ _trace_data = [] >+ _trace_data = read_file(_trace_json_path, "json") >+ >+ if (invoker.short_names) { >+ _target = "cr_trace_${_trace_counter}" >+ _trace_counter += 1 >+ } else { >+ _target = "${target_name}_$_trace" >+ } >+ angle_trace(_target) { >+ sources = rebase_path(_trace_data.TraceFiles, ".", _trace_dir) >+ >+ data = [ >+ "$_trace_dir/$_trace.json", >+ "$_trace_dir/$_trace.angledata.gz", >+ ] >+ fixture = invoker.trace_fixture >+ >+ if (invoker.short_names) { >+ output_name = _trace >+ } >+ } >+ >+ _trace_targets += [ ":$_target" ] >+ } > >- angle_source_set(target_name + "_headers") { >- sources = [ "${_trace_prefix}.h" ] >+ group(target_name) { >+ testonly = true >+ data = [ invoker.json_path ] >+ data_deps = _trace_targets > } > } >diff --git a/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h b/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h >index ff156849d030862f4004528ce488383a325cbc99..5f8caa86bb013240266061dad3b2d586ebcf0f5a 100644 >--- a/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h >+++ b/Source/ThirdParty/ANGLE/include/EGL/eglext_angle.h >@@ -130,6 +130,12 @@ > #define EGL_PLATFORM_ANGLE_DEVICE_CONTEXT_VOLATILE_CGL_ANGLE 0x34A3 > #endif /* EGL_ANGLE_platform_angle_device_context_volatile_cgl */ > >+#ifndef EGL_ANGLE_platform_angle_device_id >+#define EGL_ANGLE_platform_angle_device_id >+#define EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE 0x34D6 >+#define EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE 0x34D7 >+#endif /* EGL_ANGLE_platform_angle_device_id */ >+ > #ifndef EGL_ANGLE_x11_visual > #define EGL_ANGLE_x11_visual > #define EGL_X11_VISUAL_ID_ANGLE 0x33A3 >@@ -333,6 +339,14 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithFrameTokenANGLE(EGLDisplay dpy, > #endif > #endif /* EGL_ANGLE_swap_with_frame_token */ > >+#ifndef EGL_ANGLE_prepare_swap_buffers >+#define EGL_ANGLE_prepare_swap_buffers 1 >+typedef EGLBoolean (EGLAPIENTRYP PFNEGLPREPARESWAPBUFFERSANGLEPROC)(EGLDisplay dpy, EGLSurface surface); >+#ifdef EGL_EGLEXT_PROTOTYPES >+EGLAPI EGLBoolean EGLAPIENTRY eglPrepareSwapBuffersANGLE(EGLDisplay dpy, EGLSurface surface); >+#endif >+#endif /* EGL_ANGLE_prepare_swap_buffers */ >+ > #ifndef EGL_ANGLE_device_eagl > #define EGL_ANGLE_device_eagl 1 > #define EGL_EAGL_CONTEXT_ANGLE 0x348C >diff --git a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h >index d5003e4e1b323d85bf032c840a94390239f9c2b8..83389153a3bca1e6b5ccaab1f89b1d5610f88aa7 100644 >--- a/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h >+++ b/Source/ThirdParty/ANGLE/include/GLSLANG/ShaderLang.h >@@ -26,7 +26,7 @@ > > // Version number for shader translation API. > // It is incremented every time the API changes. >-#define ANGLE_SH_VERSION 268 >+#define ANGLE_SH_VERSION 269 > > enum ShShaderSpec > { >@@ -416,6 +416,7 @@ struct ShBuiltInResources > int EXT_clip_cull_distance; > int EXT_primitive_bounding_box; > int ANGLE_base_vertex_base_instance_shader_builtin; >+ int ANDROID_extension_pack_es31a; > > // 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 >@@ -894,6 +895,9 @@ extern const char kCoverageMaskEnabledConstName[]; > > // Specialization constant to emulate rasterizer discard. > extern const char kRasterizerDiscardEnabledConstName[]; >+ >+// Specialization constant to enable depth write in fragment shaders. >+extern const char kDepthWriteEnabledConstName[]; > } // namespace mtl > > // For backends that use glslang (the Vulkan shader compiler), i.e. Vulkan and Metal, call these to >diff --git a/Source/ThirdParty/ANGLE/include/platform/FeaturesVk.h b/Source/ThirdParty/ANGLE/include/platform/FeaturesVk.h >index 8eaca0f706597d498b455eddf2ce1fa22afdef1a..7a9eb9aa0eae809d47b4d9cb0cf75aea24e80440 100644 >--- a/Source/ThirdParty/ANGLE/include/platform/FeaturesVk.h >+++ b/Source/ThirdParty/ANGLE/include/platform/FeaturesVk.h >@@ -188,8 +188,8 @@ struct FeaturesVk : FeatureSetBase > > // Whether the VkDevice supports the VK_EXT_custom_border_color extension > // http://anglebug.com/3577 >- Feature supportsCustomBorderColorEXT = { >- "supports_custom_border_color", FeatureCategory::VulkanFeatures, >+ Feature supportsCustomBorderColor = { >+ "supportsCustomBorderColor", FeatureCategory::VulkanFeatures, > "VkDevice supports the VK_EXT_custom_border_color extension", &members, > "http://anglebug.com/3577"}; > >@@ -559,7 +559,7 @@ struct FeaturesVk : FeatureSetBase > "http://anglebug.com/6141"}; > > // Whether the VkDevice can support Protected Memory. >- Feature supportsProtectedMemory = {"supports_protected_memory", FeatureCategory::VulkanFeatures, >+ Feature supportsProtectedMemory = {"supportsProtectedMemory", FeatureCategory::VulkanFeatures, > "VkDevice supports protected memory", &members, > "http://anglebug.com/3965"}; > >@@ -594,6 +594,23 @@ struct FeaturesVk : FeatureSetBase > Feature supportsSharedPresentableImageExtension = { > "supportsSharedPresentableImageExtension", FeatureCategory::VulkanFeatures, > "VkSurface supports the VK_KHR_shared_presentable_images extension", &members}; >+ >+ // Feature to control whether the Vulkan backend can support >+ // GL_EXT_shader_framebuffer_fetch >+ Feature supportsShaderFramebufferFetch = { >+ "supportsShaderFramebufferFetch", FeatureCategory::VulkanFeatures, >+ "Whether the Vulkan backend supports coherent framebuffer fetch", &members}; >+ >+ // Feature to control whether the Vulkan backend can support >+ // GL_EXT_shader_framebuffer_fetch_non_coherent >+ Feature supportsShaderFramebufferFetchNonCoherent = { >+ "supportsShaderFramebufferFetchNonCoherent", FeatureCategory::VulkanFeatures, >+ "Whether the Vulkan backend supports non-coherent framebuffer fetch", &members}; >+ >+ // Whether the Surface supports EGL_KHR_lock_surface3. >+ Feature supportsLockSurfaceExtension = { >+ "supportsLockSurfaceExtension", FeatureCategory::VulkanFeatures, >+ "Surface supports the EGL_KHR_lock_surface3 extension", &members}; > }; > > inline FeaturesVk::FeaturesVk() = default; >diff --git a/Source/ThirdParty/ANGLE/infra/config/generated/commit-queue.cfg b/Source/ThirdParty/ANGLE/infra/config/generated/commit-queue.cfg >index 6e5990d59dafcc3493053c1ae24ed0d6fd96def7..1abf283731759a9a716485168bbb0e870d1bcaac 100644 >--- a/Source/ThirdParty/ANGLE/infra/config/generated/commit-queue.cfg >+++ b/Source/ThirdParty/ANGLE/infra/config/generated/commit-queue.cfg >@@ -50,10 +50,17 @@ config_groups { > builders { > name: "angle/try/linux-trace" > location_regexp: ".+/[+]/src/libANGLE/capture/.+" >+ location_regexp: ".+/[+]/src/tests/angle_end2end_tests_expectations.txt" > location_regexp: ".+/[+]/src/tests/capture.+" > location_regexp: ".+/[+]/src/tests/egl_tests/.+" > location_regexp: ".+/[+]/src/tests/gl_tests/.+" > } >+ builders { >+ name: "angle/try/linux-tsan-test" >+ } >+ builders { >+ name: "angle/try/linux-ubsan-test" >+ } > builders { > name: "angle/try/mac-dbg-compile" > } >@@ -88,6 +95,7 @@ config_groups { > builders { > name: "angle/try/win-trace" > location_regexp: ".+/[+]/src/libANGLE/capture/.+" >+ location_regexp: ".+/[+]/src/tests/angle_end2end_tests_expectations.txt" > location_regexp: ".+/[+]/src/tests/capture.+" > location_regexp: ".+/[+]/src/tests/egl_tests/.+" > location_regexp: ".+/[+]/src/tests/gl_tests/.+" >diff --git a/Source/ThirdParty/ANGLE/infra/config/generated/cr-buildbucket.cfg b/Source/ThirdParty/ANGLE/infra/config/generated/cr-buildbucket.cfg >index a8b11651b796b9d1a6a618f394162fb3018f72b7..f9247fc899689e691da0b5699fbeba5278779961 100644 >--- a/Source/ThirdParty/ANGLE/infra/config/generated/cr-buildbucket.cfg >+++ b/Source/ThirdParty/ANGLE/infra/config/generated/cr-buildbucket.cfg >@@ -122,6 +122,42 @@ buckets { > enable: true > } > } >+ builders { >+ name: "android-arm64-exp-test" >+ swarming_host: "chromium-swarm.appspot.com" >+ dimensions: "os:Ubuntu" >+ exe { >+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" >+ cipd_version: "refs/heads/main" >+ cmd: "luciexe" >+ } >+ properties: >+ '{' >+ ' "$build/goma": {' >+ ' "rpc_extra_params": "?prod",' >+ ' "server_host": "goma.chromium.org"' >+ ' },' >+ ' "$recipe_engine/resultdb/test_presentation": {' >+ ' "column_keys": [' >+ ' "v.gpu"' >+ ' ],' >+ ' "grouping_keys": [' >+ ' "status",' >+ ' "v.test_suite"' >+ ' ]' >+ ' },' >+ ' "builder_group": "angle",' >+ ' "platform": "android",' >+ ' "recipe": "angle",' >+ ' "test_mode": "compile_and_test",' >+ ' "toolchain": "clang"' >+ '}' >+ build_numbers: YES >+ service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com" >+ resultdb { >+ enable: true >+ } >+ } > builders { > name: "android-arm64-test" > swarming_host: "chromium-swarm.appspot.com" >@@ -534,6 +570,42 @@ buckets { > enable: true > } > } >+ builders { >+ name: "mac-exp-test" >+ swarming_host: "chromium-swarm.appspot.com" >+ dimensions: "os:Mac" >+ exe { >+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" >+ cipd_version: "refs/heads/main" >+ cmd: "luciexe" >+ } >+ properties: >+ '{' >+ ' "$build/goma": {' >+ ' "rpc_extra_params": "?prod",' >+ ' "server_host": "goma.chromium.org"' >+ ' },' >+ ' "$recipe_engine/resultdb/test_presentation": {' >+ ' "column_keys": [' >+ ' "v.gpu"' >+ ' ],' >+ ' "grouping_keys": [' >+ ' "status",' >+ ' "v.test_suite"' >+ ' ]' >+ ' },' >+ ' "builder_group": "angle",' >+ ' "platform": "mac",' >+ ' "recipe": "angle",' >+ ' "test_mode": "compile_and_test",' >+ ' "toolchain": "clang"' >+ '}' >+ build_numbers: YES >+ service_account: "angle-ci-builder@chops-service-accounts.iam.gserviceaccount.com" >+ resultdb { >+ enable: true >+ } >+ } > builders { > name: "mac-test" > swarming_host: "chromium-swarm.appspot.com" >@@ -1226,6 +1298,42 @@ buckets { > enable: true > } > } >+ builders { >+ name: "android-arm64-exp-test" >+ swarming_host: "chromium-swarm.appspot.com" >+ dimensions: "os:Ubuntu" >+ exe { >+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" >+ cipd_version: "refs/heads/main" >+ cmd: "luciexe" >+ } >+ properties: >+ '{' >+ ' "$build/goma": {' >+ ' "rpc_extra_params": "?prod",' >+ ' "server_host": "goma.chromium.org"' >+ ' },' >+ ' "$recipe_engine/resultdb/test_presentation": {' >+ ' "column_keys": [' >+ ' "v.gpu"' >+ ' ],' >+ ' "grouping_keys": [' >+ ' "status",' >+ ' "v.test_suite"' >+ ' ]' >+ ' },' >+ ' "builder_group": "angle",' >+ ' "platform": "android",' >+ ' "recipe": "angle",' >+ ' "test_mode": "compile_and_test",' >+ ' "toolchain": "clang"' >+ '}' >+ build_numbers: YES >+ service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com" >+ resultdb { >+ enable: true >+ } >+ } > builders { > name: "android-arm64-test" > swarming_host: "chromium-swarm.appspot.com" >@@ -1526,6 +1634,42 @@ buckets { > enable: true > } > } >+ builders { >+ name: "mac-exp-test" >+ swarming_host: "chromium-swarm.appspot.com" >+ dimensions: "os:Mac" >+ exe { >+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" >+ cipd_version: "refs/heads/main" >+ cmd: "luciexe" >+ } >+ properties: >+ '{' >+ ' "$build/goma": {' >+ ' "rpc_extra_params": "?prod",' >+ ' "server_host": "goma.chromium.org"' >+ ' },' >+ ' "$recipe_engine/resultdb/test_presentation": {' >+ ' "column_keys": [' >+ ' "v.gpu"' >+ ' ],' >+ ' "grouping_keys": [' >+ ' "status",' >+ ' "v.test_suite"' >+ ' ]' >+ ' },' >+ ' "builder_group": "angle",' >+ ' "platform": "mac",' >+ ' "recipe": "angle",' >+ ' "test_mode": "compile_and_test",' >+ ' "toolchain": "clang"' >+ '}' >+ build_numbers: YES >+ service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com" >+ resultdb { >+ enable: true >+ } >+ } > builders { > name: "mac-test" > swarming_host: "chromium-swarm.appspot.com" >@@ -1588,6 +1732,10 @@ buckets { > '}' > build_numbers: YES > service_account: "angle-try-builder@chops-service-accounts.iam.gserviceaccount.com" >+ experiments { >+ key: "luci.recipes.use_python3" >+ value: 100 >+ } > resultdb { > enable: true > } >diff --git a/Source/ThirdParty/ANGLE/infra/config/generated/luci-milo.cfg b/Source/ThirdParty/ANGLE/infra/config/generated/luci-milo.cfg >index fc897a027daf3da328c6c0ea6f6d4d47797165ae..21e9c7f20fa94c72ce828ded97271f8c66ade361 100644 >--- a/Source/ThirdParty/ANGLE/infra/config/generated/luci-milo.cfg >+++ b/Source/ThirdParty/ANGLE/infra/config/generated/luci-milo.cfg >@@ -25,6 +25,11 @@ consoles { > category: "compile|android|clang|arm64" > short_name: "dbg" > } >+ builders { >+ name: "buildbucket/luci.angle.ci/android-arm64-exp-test" >+ category: "test|android|clang|arm64" >+ short_name: "exp" >+ } > builders { > name: "buildbucket/luci.angle.ci/android-arm64-test" > category: "test|android|clang|arm64" >@@ -60,6 +65,11 @@ consoles { > category: "compile|mac|clang|x64" > short_name: "dbg" > } >+ builders { >+ name: "buildbucket/luci.angle.ci/mac-exp-test" >+ category: "test|mac|clang|x64" >+ short_name: "exp" >+ } > builders { > name: "buildbucket/luci.angle.ci/mac-test" > category: "test|mac|clang|x64" >@@ -168,6 +178,9 @@ consoles { > builders { > name: "buildbucket/luci.angle.try/android-arm64-dbg-compile" > } >+ builders { >+ name: "buildbucket/luci.angle.try/android-arm64-exp-test" >+ } > builders { > name: "buildbucket/luci.angle.try/android-arm64-test" > } >@@ -189,6 +202,9 @@ consoles { > builders { > name: "buildbucket/luci.angle.try/mac-dbg-compile" > } >+ builders { >+ name: "buildbucket/luci.angle.try/mac-exp-test" >+ } > builders { > name: "buildbucket/luci.angle.try/mac-test" > } >diff --git a/Source/ThirdParty/ANGLE/infra/config/generated/luci-scheduler.cfg b/Source/ThirdParty/ANGLE/infra/config/generated/luci-scheduler.cfg >index 1eac92bcfcfa37bdbb78cdde76582761f30731e7..7f06613312a6a241073d70eaa1684075dc7e0768 100644 >--- a/Source/ThirdParty/ANGLE/infra/config/generated/luci-scheduler.cfg >+++ b/Source/ThirdParty/ANGLE/infra/config/generated/luci-scheduler.cfg >@@ -34,6 +34,16 @@ job { > builder: "android-arm64-dbg-compile" > } > } >+job { >+ id: "android-arm64-exp-test" >+ realm: "ci" >+ acl_sets: "ci" >+ buildbucket { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "android-arm64-exp-test" >+ } >+} > job { > id: "android-arm64-test" > realm: "ci" >@@ -144,6 +154,16 @@ job { > builder: "mac-dbg-compile" > } > } >+job { >+ id: "mac-exp-test" >+ realm: "ci" >+ acl_sets: "ci" >+ buildbucket { >+ server: "cr-buildbucket.appspot.com" >+ bucket: "luci.angle.ci" >+ builder: "mac-exp-test" >+ } >+} > job { > id: "mac-test" > realm: "ci" >@@ -302,6 +322,7 @@ trigger { > triggers: "android-arm-compile" > triggers: "android-arm-dbg-compile" > triggers: "android-arm64-dbg-compile" >+ triggers: "android-arm64-exp-test" > triggers: "android-arm64-test" > triggers: "android-pixel4-perf" > triggers: "linux-asan-test" >@@ -313,6 +334,7 @@ trigger { > triggers: "linux-tsan-test" > triggers: "linux-ubsan-test" > triggers: "mac-dbg-compile" >+ triggers: "mac-exp-test" > triggers: "mac-test" > triggers: "win-asan-test" > triggers: "win-dbg-compile" >diff --git a/Source/ThirdParty/ANGLE/infra/config/generated/project.cfg b/Source/ThirdParty/ANGLE/infra/config/generated/project.cfg >index 3e5903acc28d6c441c78419d7af6c889b3bb82e4..c64502c8f1dc28ad26bd8341946688f145e98ad6 100644 >--- a/Source/ThirdParty/ANGLE/infra/config/generated/project.cfg >+++ b/Source/ThirdParty/ANGLE/infra/config/generated/project.cfg >@@ -7,7 +7,7 @@ > name: "angle" > access: "group:all" > lucicfg { >- version: "1.30.4" >+ version: "1.30.5" > package_dir: ".." > config_dir: "generated" > entry_point: "main.star" >diff --git a/Source/ThirdParty/ANGLE/infra/config/main.star b/Source/ThirdParty/ANGLE/infra/config/main.star >index 2299489a4380fb7dfbdf6d244773d26654ed6bb7..ec9e11c43635009104975470e013e0a28f38b13e 100755 >--- a/Source/ThirdParty/ANGLE/infra/config/main.star >+++ b/Source/ThirdParty/ANGLE/infra/config/main.star >@@ -137,7 +137,7 @@ _GOMA_RBE_PROD = { > } > > def _recipe_for_package(cipd_package): >- def recipe(*, name, cipd_version = None, recipe = None): >+ def recipe(*, name, cipd_version = None, recipe = None, use_python3 = False): > # Force the caller to put the recipe prefix rather than adding it > # programatically to make the string greppable > if not name.startswith(_RECIPE_NAME_PREFIX): >@@ -151,6 +151,7 @@ def _recipe_for_package(cipd_package): > cipd_version = cipd_version, > recipe = recipe, > use_bbagent = True, >+ use_python3 = use_python3, > ) > > return recipe >@@ -165,6 +166,7 @@ build_recipe( > > build_recipe( > name = "recipe:run_presubmit", >+ use_python3 = True, > ) > > def get_os_from_name(name): >@@ -198,6 +200,7 @@ def angle_builder(name, cpu): > is_tsan = "-tsan" in name > is_ubsan = "-ubsan" in name > is_debug = "-dbg" in name >+ is_exp = "-exp" in name > is_perf = name.endswith("-perf") > is_trace = name.endswith("-trace") > is_uwp = "winuwp" in name >@@ -218,6 +221,7 @@ def angle_builder(name, cpu): > # Trace tests are only run on CQ if files in the capture folders change. > location_regexp = [ > ".+/[+]/src/libANGLE/capture/.+", >+ ".+/[+]/src/tests/angle_end2end_tests_expectations.txt", > ".+/[+]/src/tests/capture.+", > ".+/[+]/src/tests/egl_tests/.+", > ".+/[+]/src/tests/gl_tests/.+", >@@ -248,6 +252,8 @@ def angle_builder(name, cpu): > short_name = "ubsan" > elif is_debug: > short_name = "dbg" >+ elif is_exp: >+ short_name = "exp" > else: > short_name = "rel" > >@@ -304,8 +310,8 @@ def angle_builder(name, cpu): > ), > ) > >- # Don't add TSAN/UBSAN to CQ (yet). http://anglebug.com/5795 >- if not is_tsan and not is_ubsan: >+ # Don't add experimental bots to CQ. >+ if not is_exp: > luci.cq_tryjob_verifier( > cq_group = "main", > builder = "angle:try/" + name, >@@ -371,6 +377,7 @@ luci.gitiles_poller( > angle_builder("android-arm-compile", cpu = "arm") > angle_builder("android-arm-dbg-compile", cpu = "arm") > angle_builder("android-arm64-dbg-compile", cpu = "arm64") >+angle_builder("android-arm64-exp-test", cpu = "arm64") > angle_builder("android-arm64-test", cpu = "arm64") > angle_builder("linux-asan-test", cpu = "x64") > angle_builder("linux-tsan-test", cpu = "x64") >@@ -378,6 +385,7 @@ angle_builder("linux-ubsan-test", cpu = "x64") > angle_builder("linux-dbg-compile", cpu = "x64") > angle_builder("linux-test", cpu = "x64") > angle_builder("mac-dbg-compile", cpu = "x64") >+angle_builder("mac-exp-test", cpu = "x64") > angle_builder("mac-test", cpu = "x64") > angle_builder("win-asan-test", cpu = "x64") > angle_builder("win-dbg-compile", cpu = "x64") >diff --git a/Source/ThirdParty/ANGLE/infra/specs/angle.json b/Source/ThirdParty/ANGLE/infra/specs/angle.json >index 566f3c7c57aab66b3f3174677b682a23cf9f74f6..6859a21037c7c4bbcd05325c849fe47344947b2a 100644 >--- a/Source/ThirdParty/ANGLE/infra/specs/angle.json >+++ b/Source/ThirdParty/ANGLE/infra/specs/angle.json >@@ -600,6 +600,386 @@ > } > ] > }, >+ "android-arm64-pixel6": { >+ "gtest_tests": [ >+ { >+ "args": [ >+ "angle_deqp_egl_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_egl_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 4 >+ }, >+ "test": "angle_deqp_egl_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_egl_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_gles2_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_gles2_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 4 >+ }, >+ "test": "angle_deqp_gles2_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_gles31_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_gles31_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 20 >+ }, >+ "test": "angle_deqp_gles31_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_gles31_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_gles3_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_gles3_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 12 >+ }, >+ "test": "angle_deqp_gles3_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_khr_gles2_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_khr_gles2_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_deqp_khr_gles2_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles2_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_khr_gles31_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_khr_gles31_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 2 >+ }, >+ "test": "angle_deqp_khr_gles31_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles31_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_khr_gles32_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_khr_gles32_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_deqp_khr_gles32_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles32_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_khr_gles3_tests", >+ "--use-angle=vulkan", >+ "-v", >+ "--shard-timeout=500" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_khr_gles3_vulkan_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 2 >+ }, >+ "test": "angle_deqp_khr_gles3_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_khr_gles3_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_end2end_tests", >+ "--gtest_filter=*Vulkan*:-*Vulkan_SwiftShader*", >+ "--shard-timeout=300", >+ "-v", >+ "--render-test-output-dir=${ISOLATED_OUTDIR}" >+ ], >+ "merge": { >+ "args": [], >+ "script": "//testing/merge_scripts/standard_isolated_script_merge.py" >+ }, >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 4 >+ }, >+ "test": "angle_end2end_tests", >+ "test_id_prefix": "ninja://src/tests:angle_end2end_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_unittests", >+ "-v" >+ ], >+ "merge": { >+ "args": [], >+ "script": "//testing/merge_scripts/standard_isolated_script_merge.py" >+ }, >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "cipd_packages": [ >+ { >+ "cipd_package": "infra/tools/luci/logdog/butler/${platform}", >+ "location": "bin", >+ "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" >+ } >+ ], >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "device_os": "S", >+ "device_os_type": "userdebug", >+ "device_type": "oriole", >+ "os": "Android", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "expiration": 21600, >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_unittests", >+ "test_id_prefix": "ninja://src/tests:angle_unittests/", >+ "use_isolated_scripts_api": true >+ } >+ ] >+ }, > "linux-intel": { > "gtest_tests": [ > { >@@ -3215,7 +3595,247 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_deqp_egl_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_egl_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_egl_tests", >+ "--use-angle=metal", >+ "--bot-mode" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_egl_metal_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_deqp_egl_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_egl_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_gles2_tests", >+ "--use-angle=gl", >+ "--bot-mode" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_gles2_gl_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_deqp_gles2_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_gles2_tests", >+ "--use-angle=metal", >+ "--bot-mode" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_gles2_metal_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_deqp_gles2_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_gles2_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_gles3_tests", >+ "--use-angle=gl", >+ "--bot-mode" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_gles3_gl_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 2 >+ }, >+ "test": "angle_deqp_gles3_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_deqp_gles3_tests", >+ "--use-angle=metal", >+ "--flaky-retries=2", >+ "--bot-mode" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_gles3_metal_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 2 >+ }, >+ "test": "angle_deqp_gles3_tests", >+ "test_id_prefix": "ninja://src/tests:angle_deqp_gles3_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_end2end_tests", >+ "--gtest_filter=-*Vulkan_SwiftShader*", >+ "--bot-mode", >+ "--flaky-retries=2" >+ ], >+ "merge": { >+ "args": [], >+ "script": "//testing/merge_scripts/standard_isolated_script_merge.py" >+ }, >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", >+ "shards": 2 >+ }, >+ "test": "angle_end2end_tests", >+ "test_id_prefix": "ninja://src/tests:angle_end2end_tests/", >+ "use_isolated_scripts_api": true >+ }, >+ { >+ "args": [ >+ "angle_unittests" >+ ], >+ "merge": { >+ "args": [], >+ "script": "//testing/merge_scripts/standard_isolated_script_merge.py" >+ }, >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-11.4|Mac-12.1", >+ "pool": "chromium.tests.gpu" >+ } >+ ], >+ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" >+ }, >+ "test": "angle_unittests", >+ "test_id_prefix": "ninja://src/tests:angle_unittests/", >+ "use_isolated_scripts_api": true >+ } >+ ] >+ }, >+ "mac-exp-amd": { >+ "gtest_tests": [ >+ { >+ "args": [ >+ "angle_deqp_egl_tests", >+ "--use-angle=gl", >+ "--bot-mode", >+ "--max-processes=1" >+ ], >+ "merge": { >+ "script": "//scripts/angle_deqp_test_merge.py" >+ }, >+ "name": "angle_deqp_egl_gl_tests", >+ "swarming": { >+ "can_use_on_swarming_builders": true, >+ "containment_type": "AUTO", >+ "dimension_sets": [ >+ { >+ "cpu": "x86-64", >+ "display_attached": "1", >+ "gpu": "1002:6821", >+ "hidpi": "1", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >@@ -3244,7 +3864,7 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >@@ -3273,7 +3893,7 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >@@ -3302,7 +3922,7 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >@@ -3331,7 +3951,7 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >@@ -3362,7 +3982,7 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >@@ -3393,7 +4013,7 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >@@ -3421,7 +4041,7 @@ > "display_attached": "1", > "gpu": "1002:6821", > "hidpi": "1", >- "os": "Mac-11.4", >+ "os": "Mac-12.0|Mac-12.1", > "pool": "chromium.tests.gpu" > } > ], >diff --git a/Source/ThirdParty/ANGLE/infra/specs/angle_mb_config.pyl b/Source/ThirdParty/ANGLE/infra/specs/angle_mb_config.pyl >index 17f43200c36ad256544ebbc6c66e832dcc21f984..12c60e25e9bee8b2c4ffbd9eb54352820031005f 100644 >--- a/Source/ThirdParty/ANGLE/infra/specs/angle_mb_config.pyl >+++ b/Source/ThirdParty/ANGLE/infra/specs/angle_mb_config.pyl >@@ -17,6 +17,7 @@ > 'android-arm-compile': 'angle_goma_android_arm_release_bot', > 'android-arm-dbg-compile': 'angle_goma_android_arm_debug_bot', > 'android-arm64-dbg-compile': 'angle_goma_android_arm64_debug_bot', >+ 'android-arm64-exp-test': 'angle_goma_android_arm64_release_bot', > 'android-arm64-test': 'angle_goma_android_arm64_release_bot', > 'android-pixel4-perf': 'angle_goma_android_perf_bot', > 'linux-asan-test': 'angle_asan_bot', >@@ -27,6 +28,7 @@ > 'linux-tsan-test': 'angle_tsan_bot', > 'linux-ubsan-test': 'angle_ubsan_bot', > 'mac-dbg-compile': 'angle_goma_debug_bot', >+ 'mac-exp-test': 'angle_goma_release_bot', > 'mac-test': 'angle_goma_release_bot', > 'win-asan-test': 'angle_asan_bot', > 'win-dbg-compile': 'angle_goma_debug_bot', >diff --git a/Source/ThirdParty/ANGLE/infra/specs/mixins.pyl b/Source/ThirdParty/ANGLE/infra/specs/mixins.pyl >index cb388196bf62d2eb087c584c0a95303e3b9f02db..1db4da206aac16a52b0963a1d24b570d7b59c4ca 100644 >--- a/Source/ThirdParty/ANGLE/infra/specs/mixins.pyl >+++ b/Source/ThirdParty/ANGLE/infra/specs/mixins.pyl >@@ -14,6 +14,7 @@ > # For more info see Chromium's mixins.pyl in testing/buildbot. > > { 'android_r': { 'swarming': { 'dimensions': { 'device_os': 'R'}}}, >+ 'android_s': { 'swarming': { 'dimensions': { 'device_os': 'S'}}}, > 'angle_linux_nvidia_gtx_1660_stable': { 'swarming': { 'dimensions': { 'gpu': '10de:2184-440.100', > 'os': 'Ubuntu-18.04.5|Ubuntu-18.04.6', > 'pool': 'chromium.tests.gpu'}}}, >@@ -29,6 +30,7 @@ > 'flame': { 'swarming': { 'dimensions': { 'device_type': 'flame', > 'os': 'Android'}}}, > 'gpu-swarming-pool': { 'swarming': { 'dimensions': { 'pool': 'chromium.tests.gpu'}}}, >+ 'limited_capacity_bot': { 'swarming': { 'expiration': 21600}}, > 'linux-bionic': { 'swarming': { 'dimensions': { 'os': 'Ubuntu-18.04'}}}, > 'linux_intel_hd_630_stable': { 'swarming': { 'dimensions': { 'gpu': '8086:5912-19.0.2', > 'os': 'Ubuntu-19.04', >@@ -37,11 +39,17 @@ > 'display_attached': '1', > 'gpu': '8086:3e9b', > 'os': 'Mac-11.5.2'}}}, >+ 'mac_retina_amd_gpu_experimental': { 'swarming': { 'dimensions': { 'cpu': 'x86-64', >+ 'display_attached': '1', >+ 'gpu': '1002:6821', >+ 'hidpi': '1', >+ 'os': 'Mac-12.0|Mac-12.1', >+ 'pool': 'chromium.tests.gpu'}}}, > 'mac_retina_amd_gpu_stable': { 'swarming': { 'dimensions': { 'cpu': 'x86-64', > 'display_attached': '1', > 'gpu': '1002:6821', > 'hidpi': '1', >- 'os': 'Mac-11.4', >+ 'os': 'Mac-11.4|Mac-12.1', > 'pool': 'chromium.tests.gpu'}}}, > 'mac_retina_nvidia_gpu_stable': { 'swarming': { 'dimensions': { 'cpu': 'x86-64', > 'display_attached': '1', >@@ -50,6 +58,8 @@ > 'os': 'Mac-10.14.6', > 'pool': 'chromium.tests.gpu'}}}, > 'no_gpu': { 'swarming': { 'dimensions': { 'gpu': 'none'}}}, >+ 'oriole': { 'swarming': { 'dimensions': { 'device_type': 'oriole', >+ 'os': 'Android'}}}, > 'swarming_containment_auto': { 'swarming': { 'containment_type': 'AUTO'}}, > 'timeout_15m': { 'swarming': { 'hard_timeout': 900, 'io_timeout': 900}}, > 'win10_gce_gpu_pool': { 'swarming': { 'dimensions': { 'cpu': 'x86-64', >diff --git a/Source/ThirdParty/ANGLE/infra/specs/test_suites.pyl b/Source/ThirdParty/ANGLE/infra/specs/test_suites.pyl >index 051e02951150da9e877917719d58db2f14947698..dbce37f989795f0db6d3a52362fd9bb79cfd60e2 100644 >--- a/Source/ThirdParty/ANGLE/infra/specs/test_suites.pyl >+++ b/Source/ThirdParty/ANGLE/infra/specs/test_suites.pyl >@@ -607,6 +607,35 @@ > }, > }, > >+ 'angle_end2end_vulkan_gtests': { >+ 'angle_end2end_tests': { >+ 'android_args': [ >+ '--shard-timeout=300', >+ '-v', >+ # We use this argument to save test artifacts. >+ '--render-test-output-dir=${ISOLATED_OUTDIR}', >+ ], >+ 'android_swarming': { >+ 'shards': 4, >+ }, >+ 'args': [ >+ 'angle_end2end_tests', >+ '--gtest_filter=*Vulkan*:-*Vulkan_SwiftShader*', >+ ], >+ 'desktop_args': [ >+ '--bot-mode', >+ ], >+ # Linux has issues with creating too many windows at once. >+ 'linux_args': [ >+ '--max-processes=4', >+ ], >+ 'swarming': { >+ 'shards': 2, >+ }, >+ 'use_isolated_scripts_api': True, >+ }, >+ }, >+ > 'angle_end2end_with_retry_gtests': { > 'angle_end2end_tests': { > 'args': [ >@@ -1058,6 +1087,19 @@ > 'angle_unit_gtests', > ], > >+ 'android_vulkan_gtests': [ >+ 'angle_deqp_egl_vulkan_gtests', >+ 'angle_deqp_gles2_vulkan_gtests', >+ 'angle_deqp_gles31_vulkan_gtests', >+ 'angle_deqp_gles3_vulkan_gtests', >+ 'angle_deqp_khr_gles2_vulkan_gtests', >+ 'angle_deqp_khr_gles31_vulkan_gtests', >+ 'angle_deqp_khr_gles32_vulkan_gtests', >+ 'angle_deqp_khr_gles3_vulkan_gtests', >+ 'angle_end2end_vulkan_gtests', >+ 'angle_unit_gtests', >+ ], >+ > 'common_isolated_scripts': [ > 'angle_perf_smoke_isolated_scripts', > 'angle_restricted_trace_gold_isolated_scripts', >diff --git a/Source/ThirdParty/ANGLE/infra/specs/waterfalls.pyl b/Source/ThirdParty/ANGLE/infra/specs/waterfalls.pyl >index 072a747609793184f9e480a92a92040c1ffa166f..eebbac0784a189452a85443824ff6a1a4dd41702 100644 >--- a/Source/ThirdParty/ANGLE/infra/specs/waterfalls.pyl >+++ b/Source/ThirdParty/ANGLE/infra/specs/waterfalls.pyl >@@ -42,6 +42,18 @@ > 'isolated_scripts': 'angle_perf_isolated_scripts', > }, > }, >+ 'android-arm64-pixel6': { >+ 'os_type': 'android', >+ 'mixins': [ >+ 'android_s', >+ 'oriole', >+ 'gpu-swarming-pool', >+ 'limited_capacity_bot', >+ ], >+ 'test_suites': { >+ 'gtest_tests': 'android_vulkan_gtests', >+ }, >+ }, > 'linux-intel': { > 'os_type': 'linux', > 'mixins': [ >@@ -142,6 +154,15 @@ > 'gtest_tests': 'mac_amd_and_intel_gtests', > }, > }, >+ 'mac-exp-amd': { >+ 'os_type': 'mac', >+ 'mixins': [ >+ 'mac_retina_amd_gpu_experimental', >+ ], >+ 'test_suites': { >+ 'gtest_tests': 'mac_amd_and_intel_gtests', >+ }, >+ }, > 'mac-intel': { > 'os_type': 'mac', > 'mixins': [ >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_format.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_format.json >index e3b828f6872e6038df71cf303002df7f4e93e14b..bcdafe03a0a3ec4da531fd26e6ffe400f7279f7e 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_format.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_format.json >@@ -4,7 +4,7 @@ > "src/libANGLE/renderer/Format_table_autogen.cpp": > "afe82012cba43b1bab4b40f890b1eb89", > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/angle_format_data.json": > "bad90135a5d792928071aacdf80219c9", > "src/libANGLE/renderer/angle_format_map.json": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_functions_table.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_functions_table.json >index f599b3bc1edf44611d25a61bdf1c4b3d9ed658c5..b955e2aced17b1ca22bed494612dcba743a7748b 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_functions_table.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_functions_table.json >@@ -1,6 +1,6 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/gen_load_functions_table.py": > "c131c494e7e0b35b65a8a097b4b8e5ce", > "src/libANGLE/renderer/load_functions_data.json": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_texture_border_functions_table.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_texture_border_functions_table.json >index a4a918553f738bf6c78ad73031f1d248ea837676..6a69fe7764fc64423775bf12182f3aaa5338ffd3 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_texture_border_functions_table.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/ANGLE_load_texture_border_functions_table.json >@@ -1,6 +1,6 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/gen_load_texture_border_functions_table.py": > "77210fd59d00504369691ce2107c1598", > "src/libANGLE/renderer/load_texture_border_functions_data.json": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/D3D11_format.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/D3D11_format.json >index 093e745cbdb3df53fcb773815c073b63043cbc70..62b7fae7add6bd9365a511d58fa6a5c8fc811d50 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/D3D11_format.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/D3D11_format.json >@@ -1,6 +1,6 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py": > "2b34c48ecd50e81b4938e0788407a6ce", > "src/libANGLE/renderer/d3d/d3d11/texture_format_data.json": >@@ -8,5 +8,5 @@ > "src/libANGLE/renderer/d3d/d3d11/texture_format_map.json": > "c2019facd60d49228232b0e0b5e5048b", > "src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp": >- "2479ac57d25ded7eec0fa4aecd300f91" >+ "85307e3ecf179bfe3ffc42513f1b361e" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/DXGI_format.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/DXGI_format.json >index 4f5be57d154d227a8380b7554d9c25cd7e6f9e45..3bf197dd4004824f3279c710e5445edc14098f43 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/DXGI_format.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/DXGI_format.json >@@ -1,6 +1,6 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/angle_format_map.json": > "951e1bceaba86eecb5c23173e897d092", > "src/libANGLE/renderer/dxgi_format_data.json": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Extension_files.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Extension_files.json >index 63e587c13df844009bfcb6bf6f88c71978b464aa..29073b801fd2f191de90b3a2dcd9a70ffe4e582e 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Extension_files.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Extension_files.json >@@ -1,24 +1,24 @@ > { > "doc/ExtensionSupport.md": >- "23b3eee41ecb931f736e9a78e03c9741", >+ "29902812db94a55b4067fb526ce36be6", > "scripts/cl.xml": > "f923201d4ea3e1130763b19fa7faa7a2", > "scripts/egl.xml": > "013c552e6c523abdcf268268ea47e9fe", > "scripts/egl_angle_ext.xml": >- "bd57943b71217a962e6049a74bb64e0e", >+ "72bf10ed3d23d5cdfa49934a0393b30d", > "scripts/extension_data/intel_630_linux.json": >- "dbcae14638684f9c094c216110fd4fa3", >+ "513dabe561b92b577ec8433d263f8ba6", > "scripts/extension_data/intel_630_win10.json": >- "4cf6bfad658bb2f0a818bed648042c23", >- "scripts/extension_data/nvidia_p400_linux.json": >- "b9e39094658cf0378b0b6ca1fd69b32a", >- "scripts/extension_data/nvidia_p400_win10.json": >- "476eca14731550002205aef95c8ce3f6", >+ "2354046e6ff686fe76b4ef17f66b828b", >+ "scripts/extension_data/nvidia_1660_linux.json": >+ "bfc36f66492c756b1dbaf0f3e7f1275a", >+ "scripts/extension_data/nvidia_1660_win10.json": >+ "c1c2bca14bf14b8c620230ed511b6794", > "scripts/extension_data/pixel_4_android_11.json": >- "3e482d5647efe6e938101584885a1994", >+ "131fef2b47370087081b96bc909d335c", > "scripts/extension_data/swiftshader_win10.json": >- "6eac00fc10d4130e73323a048c92fca7", >+ "e772ccd83cf144a2931294523b0069a9", > "scripts/extension_data/swiftshader_win10_gles1.json": > "fbf1c3dc83570c1e3fffdbee313bca30", > "scripts/gl.xml": >@@ -26,13 +26,13 @@ > "scripts/gl_angle_ext.xml": > "474989440f980a079935dff3ab4d7b24", > "scripts/registry_xml.py": >- "b1893c003352dec25d4cd54e2b385925", >+ "c7e68268b6cfea2c705d273863ecce74", > "scripts/wgl.xml": > "c36001431919e1c435f1215a85f7e1db", > "src/libANGLE/gen_extensions.py": >- "db7ed1c2245bba536e074a1cf2bb2590", >+ "186e7b22cb560bf4f32e2b1b8a025dd8", > "src/libANGLE/gles_extensions_autogen.cpp": >- "6c765b092edffcda3a114e3fb587df3a", >+ "0ca4b30896452e67bd9faea06adb3695", > "src/libANGLE/gles_extensions_autogen.h": >- "8ca4513c8c187b2baa2872c7653c5086" >+ "c167818862bb1a2b1f4ae445926da6bc" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_WGL_loader.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_WGL_loader.json >index 019eca6ec52606b00ae42017b90039ee0ff2b453..e912b8770f801e06fa49bed48c5a748cfe0acdb5 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_WGL_loader.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_WGL_loader.json >@@ -4,7 +4,7 @@ > "scripts/egl.xml": > "013c552e6c523abdcf268268ea47e9fe", > "scripts/egl_angle_ext.xml": >- "bd57943b71217a962e6049a74bb64e0e", >+ "72bf10ed3d23d5cdfa49934a0393b30d", > "scripts/generate_loader.py": > "e67f4da64ba7f5cff39ba4e8926a05f8", > "scripts/gl.xml": >@@ -12,25 +12,25 @@ > "scripts/gl_angle_ext.xml": > "474989440f980a079935dff3ab4d7b24", > "scripts/registry_xml.py": >- "b1893c003352dec25d4cd54e2b385925", >+ "c7e68268b6cfea2c705d273863ecce74", > "scripts/wgl.xml": > "c36001431919e1c435f1215a85f7e1db", > "src/libEGL/egl_loader_autogen.cpp": >- "36e70c4f3d1720d2df468c3bf9f93058", >+ "91a125422858d73d9117b8d285230755", > "src/libEGL/egl_loader_autogen.h": >- "4321cb420c274ecf46c949e884df0c5c", >+ "8b8370dadba340e23f100ef5c12b79f8", > "src/tests/restricted_traces/trace_egl_loader_autogen.cpp": >- "23c0db76eaa7d3a58623d93851422598", >+ "64c99df8e412f116c0ac3be757b3ec1b", > "src/tests/restricted_traces/trace_egl_loader_autogen.h": >- "db5602df62ad6f6ccdbdef0f51aa005e", >+ "c8cd24ba72c3b97e3c3bf26706633cb5", > "src/tests/restricted_traces/trace_gles_loader_autogen.cpp": > "2a39be3002376d4672a5f2322d5a1382", > "src/tests/restricted_traces/trace_gles_loader_autogen.h": > "2cbce653f1b93a749fb7fe1d457a6607", > "util/egl_loader_autogen.cpp": >- "b17e2dbe04c275d69cb09ad861150197", >+ "810270957c4be76aa096da0d14e3ffa4", > "util/egl_loader_autogen.h": >- "b298c1d5d60990304ee37070e2b94efa", >+ "5f2da822e16e064f8ecda9c04a7bcd65", > "util/gles_loader_autogen.cpp": > "971c0a0eabe01472e4e95d9fdbe0f7cd", > "util/gles_loader_autogen.h": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_entry_points.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_entry_points.json >index 59bbd44776df4b54be3138a9e6b9183da6422325..2bc8cd0b394c0cebc798eea032b0ea805e56cb96 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_entry_points.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_EGL_entry_points.json >@@ -4,25 +4,25 @@ > "scripts/egl.xml": > "013c552e6c523abdcf268268ea47e9fe", > "scripts/egl_angle_ext.xml": >- "bd57943b71217a962e6049a74bb64e0e", >+ "72bf10ed3d23d5cdfa49934a0393b30d", > "scripts/entry_point_packed_egl_enums.json": > "a72ae855c6b403912103b519139951a1", > "scripts/entry_point_packed_gl_enums.json": > "a1cdd1545d3095f977b9869df5513071", > "scripts/generate_entry_points.py": >- "36e40f66e33d0a04355b732862b548eb", >+ "dc4f7fe8f44c62113afa343c2e569ade", > "scripts/gl.xml": > "467556b6f73fd024b08b703d0be83999", > "scripts/gl_angle_ext.xml": > "474989440f980a079935dff3ab4d7b24", > "scripts/registry_xml.py": >- "b1893c003352dec25d4cd54e2b385925", >+ "c7e68268b6cfea2c705d273863ecce74", > "scripts/wgl.xml": > "c36001431919e1c435f1215a85f7e1db", > "src/common/entry_points_enum_autogen.cpp": >- "79aaf8dd14efcaf4f9b81a5915f27188", >+ "fd08edc9fcf1bcc1422464c9048bdcab", > "src/common/entry_points_enum_autogen.h": >- "6706cd1dd07e754ddac2a697872ca4b7", >+ "2c88b6607e90f7cd1c8fcf674745c9ac", > "src/libANGLE/Context_gl_1_autogen.h": > "115d224fd28b0bc2b2800354bb57fcf3", > "src/libANGLE/Context_gl_2_autogen.h": >@@ -42,7 +42,7 @@ > "src/libANGLE/Context_gles_3_2_autogen.h": > "48567dca16fd881dfe6d61fee0e3106f", > "src/libANGLE/Context_gles_ext_autogen.h": >- "bb334a7c8dc400c87a95757d39ad8e44", >+ "4f435eb90e92ae5f84778353489c24f3", > "src/libANGLE/capture/capture_gles_1_0_autogen.cpp": > "7ec7ef8f779b809a45d74b97502c419b", > "src/libANGLE/capture/capture_gles_1_0_autogen.h": >@@ -66,7 +66,7 @@ > "src/libANGLE/capture/capture_gles_ext_autogen.cpp": > "77f385678e62ecfe5a5faea3cc8ce2a6", > "src/libANGLE/capture/capture_gles_ext_autogen.h": >- "90ed0249a727cd0196a1b9249f99b903", >+ "3ca406b8b1522a83a586dfcebbab4494", > "src/libANGLE/capture/frame_capture_replay_autogen.cpp": > "e2e6419d43bc96a65b8a8e94222a910a", > "src/libANGLE/capture/frame_capture_utils_autogen.cpp": >@@ -76,7 +76,7 @@ > "src/libANGLE/validationCL_autogen.h": > "0022d0cdb6a9e2ef4a59b71164f62333", > "src/libANGLE/validationEGL_autogen.h": >- "6104236e7d7eaf00cbe89b17d188d6a6", >+ "de6d1f73563b4265fe0b8f3ebf3293bb", > "src/libANGLE/validationES1_autogen.h": > "99af5e328690ae78d7724a80e94cfac5", > "src/libANGLE/validationES2_autogen.h": >@@ -88,7 +88,7 @@ > "src/libANGLE/validationES3_autogen.h": > "0147506ce91c68d8ccbca9688c7251ba", > "src/libANGLE/validationESEXT_autogen.h": >- "955d0e186f65b97f4e593909d389ee26", >+ "e961fe18f50b1dfc825fff2d3030a91f", > "src/libANGLE/validationGL1_autogen.h": > "a247dddc40418180d4b2dbefeb75f233", > "src/libANGLE/validationGL2_autogen.h": >@@ -98,9 +98,9 @@ > "src/libANGLE/validationGL4_autogen.h": > "0477150779497ad894973f0e4b830d6b", > "src/libEGL/libEGL_autogen.cpp": >- "15355e8f54c128b47b8f321b93f11d0b", >+ "59bf8adce41d6bbc96919e55406d5c96", > "src/libEGL/libEGL_autogen.def": >- "4bf5271f414e7b5e062a301bf3c9df78", >+ "1820da14dcee391bbe3510a5ec8a6820", > "src/libGL/entry_points_gl_1_autogen.cpp": > "8148ccb597c5c77db7d5e532c7152243", > "src/libGL/entry_points_gl_1_autogen.h": >@@ -124,7 +124,7 @@ > "src/libGLESv2/cl_stubs_autogen.h": > "6d880c6b65284192b5842f0e42ad2741", > "src/libGLESv2/egl_ext_stubs_autogen.h": >- "9b23ccf8b66b7006e3bc69117f0b0784", >+ "b3513ee664368b056590f6c3d35e79dc", > "src/libGLESv2/egl_get_labeled_object_data.json": > "2f4148b2ddf34e62670e32c5e6da4937", > "src/libGLESv2/egl_stubs_autogen.h": >@@ -134,13 +134,13 @@ > "src/libGLESv2/entry_points_cl_autogen.h": > "dde2f94c3004874a7da995dae69da811", > "src/libGLESv2/entry_points_egl_autogen.cpp": >- "e7b708af1c8de435532058eb165d421e", >+ "03779202479ef4063616c9dbe253788d", > "src/libGLESv2/entry_points_egl_autogen.h": > "3bc7a8df9deadd7cfd615d0cfad0c6a8", > "src/libGLESv2/entry_points_egl_ext_autogen.cpp": >- "2bebd91dd2b256a9ddfd79b2b388453c", >+ "5c8c7e9a0e16e37d008583b793ec187b", > "src/libGLESv2/entry_points_egl_ext_autogen.h": >- "3e1c2214810cb6b3f4820dc1d0563492", >+ "ec40eebb1a329e484fba84f37fef30d2", > "src/libGLESv2/entry_points_gles_1_0_autogen.cpp": > "4cb9f5d56c003d1627365cfa34470edc", > "src/libGLESv2/entry_points_gles_1_0_autogen.h": >@@ -162,17 +162,17 @@ > "src/libGLESv2/entry_points_gles_3_2_autogen.h": > "647f932a299cdb4726b60bbba059f0d2", > "src/libGLESv2/entry_points_gles_ext_autogen.cpp": >- "f40315fd6e5ae4a33cc33aab92e9742d", >+ "03b4cd7d24b85cc74eacd49c89575abe", > "src/libGLESv2/entry_points_gles_ext_autogen.h": >- "eeca97c43f58cecb4485ad9ea8471313", >+ "d4c6ff6c8b1931581e3134606c2d9108", > "src/libGLESv2/libGLESv2_autogen.cpp": >- "274118dfcaff2bc6a56257785bd9024a", >+ "4ab4913d56589003a5a5c970c7e5158e", > "src/libGLESv2/libGLESv2_autogen.def": >- "0ff77db18d01af91013253fd128e0c8a", >+ "df38a627a47cd517f32f6bf96f4c957b", > "src/libGLESv2/libGLESv2_no_capture_autogen.def": >- "845055f21771e1e356225cae49dbf039", >+ "b3f4b764d65a571d8d9d4e926d55f4f2", > "src/libGLESv2/libGLESv2_with_capture_autogen.def": >- "8b4b2cbf5b033051d45730ac9e9e6a1a", >+ "884836485f319c79075d10ab5687e0c2", > "src/libOpenCL/libOpenCL_autogen.cpp": > "10849978c910dc1af5dd4f0c815d1581" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_copy_conversion_table.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_copy_conversion_table.json >index fb5334ecade6164ea2a1d258e2282a8584bbff27..e6d72e41e9a2af95b5e6f181b307536aec5d1a88 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_copy_conversion_table.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_copy_conversion_table.json >@@ -6,5 +6,5 @@ > "src/libANGLE/gen_copy_conversion_table.py": > "0a73b7580342b9e27d4c71ade3af55e5", > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a" >+ "2f8fa768088e22b0963bbdf842d3e725" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_format_map.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_format_map.json >index 37cf547a1ad23f3a300d3dd4713ea6dd396b3c14..42e51ec2376c75e2613b04d3031968217bb19fd8 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_format_map.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GL_format_map.json >@@ -8,5 +8,5 @@ > "src/libANGLE/gen_format_map.py": > "2421e2cfb4e074ae3fa6baa031c6394e", > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a" >+ "2f8fa768088e22b0963bbdf842d3e725" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GLenum_value_to_string_map.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GLenum_value_to_string_map.json >index ef29fd7e53b1fcc192556b146d0172a8c3b36960..2c4ff6f2e05c9322c588c6c8d85cd14858285dde 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GLenum_value_to_string_map.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/GLenum_value_to_string_map.json >@@ -6,7 +6,7 @@ > "scripts/gl_angle_ext.xml": > "474989440f980a079935dff3ab4d7b24", > "scripts/registry_xml.py": >- "b1893c003352dec25d4cd54e2b385925", >+ "c7e68268b6cfea2c705d273863ecce74", > "src/libANGLE/capture/gl_enum_utils_autogen.cpp": > "45a1968f41cfe2d3ac0de7f1678e03dc", > "src/libANGLE/capture/gl_enum_utils_autogen.h": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_default_shaders.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_default_shaders.json >index 0fa736185be12aff8bb312c60633c3c0e0f48cd6..6b592049045880c1b8380c23ee9a15365386c9ba 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_default_shaders.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_default_shaders.json >@@ -1,6 +1,6 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/angle_format_map.json": > "951e1bceaba86eecb5c23173e897d092", > "src/libANGLE/renderer/gen_angle_format_table.py": >@@ -18,15 +18,15 @@ > "src/libANGLE/renderer/metal/shaders/format_autogen.h": > "097b3499f82c7359437a5a58e498e604", > "src/libANGLE/renderer/metal/shaders/gen_indices.metal": >- "5a1d954ea793bf4888d3d0d95c276208", >+ "b46a137083fb55a3dd2a392494dcf972", > "src/libANGLE/renderer/metal/shaders/gen_mipmap.metal": > "fab35deec42fd89ae7a11d2f87b6e0b4", > "src/libANGLE/renderer/metal/shaders/gen_mtl_internal_shaders.py": > "f6f2e180f73efd8f2ee3aaaaf34a71e4", > "src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc": >- "ca7a7ecfab09e017f40dd8b51d95ecb8", >+ "359e1851406a4cb84195e7e584d00e31", > "src/libANGLE/renderer/metal/shaders/rewrite_indices.metal": >- "f8998cc5c4b078e3f7a995edf7026f13", >+ "a29210b023ed3393e1342d94e338d449", > "src/libANGLE/renderer/metal/shaders/visibility.metal": > "b82aa740cf4b0aed606aacef1024beea" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_format_table.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_format_table.json >index 617342968d78ff98927012b2e63edd1f71d84998..88da14f1f7442f9996f97a7f592304590ae2acbe 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_format_table.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_format_table.json >@@ -1,12 +1,12 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/angle_format_map.json": > "951e1bceaba86eecb5c23173e897d092", > "src/libANGLE/renderer/metal/gen_mtl_format_table.py": >- "7915e5a079e7307ba046136857878a6f", >+ "abb2300e5d9d70931e2497f820f64bd5", > "src/libANGLE/renderer/metal/mtl_format_map.json": >- "04a80596b75c287f525dac9769219cb2", >+ "8ee95dde69a2f04973ea19434e4f9f3e", > "src/libANGLE/renderer/metal/mtl_format_table_autogen.mm": >- "76319586335e93f945f99f9fecb03b0f" >+ "dc15669905799afab8b22bdf400417ca" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_format_table.json.orig b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_format_table.json.orig >new file mode 100644 >index 0000000000000000000000000000000000000000..88da14f1f7442f9996f97a7f592304590ae2acbe >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Metal_format_table.json.orig >@@ -0,0 +1,12 @@ >+{ >+ "src/libANGLE/renderer/angle_format.py": >+ "2f8fa768088e22b0963bbdf842d3e725", >+ "src/libANGLE/renderer/angle_format_map.json": >+ "951e1bceaba86eecb5c23173e897d092", >+ "src/libANGLE/renderer/metal/gen_mtl_format_table.py": >+ "abb2300e5d9d70931e2497f820f64bd5", >+ "src/libANGLE/renderer/metal/mtl_format_map.json": >+ "8ee95dde69a2f04973ea19434e4f9f3e", >+ "src/libANGLE/renderer/metal/mtl_format_table_autogen.mm": >+ "dc15669905799afab8b22bdf400417ca" >+} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/OpenGL_dispatch_table.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/OpenGL_dispatch_table.json >index bffd72c2639cd14456cdaa2c997b0984d7543e0b..dc67b43af37ba69432cf0e963a566cb5b015e84f 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/OpenGL_dispatch_table.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/OpenGL_dispatch_table.json >@@ -2,7 +2,7 @@ > "scripts/gl.xml": > "467556b6f73fd024b08b703d0be83999", > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp": > "f0d5c792843c9d7d9c06fd7b9b20724c", > "src/libANGLE/renderer/gl/DispatchTableGL_autogen.h": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Static_builtins.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Static_builtins.json >index 35a921ffdfbf93b5e677ebd7b05bd48e51bfd3c1..d58b17c12450bc62d9ab58319ec753e300b264a7 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Static_builtins.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Static_builtins.json >@@ -6,19 +6,19 @@ > "src/compiler/translator/Operator_autogen.h": > "cdaafd06e84ef6a8e4721678d622d844", > "src/compiler/translator/SymbolTable_ESSL_autogen.cpp": >- "3dd0c9b8e03b010e9644e5574480158f", >+ "4af5d2482277e1932c7d95de4376973a", > "src/compiler/translator/SymbolTable_autogen.cpp": >- "2a521e5bcffe7bf36b60de5307688fdb", >+ "f037573079c304dff2399b726710391d", > "src/compiler/translator/SymbolTable_autogen.h": > "291eba34a070f5fddbf2827a1577c598", > "src/compiler/translator/builtin_function_declarations.txt": >- "cd5f022686be7e13174b672d6b32fc6d", >+ "3d3c7d686313cd09a8e3bcae4a638ec3", > "src/compiler/translator/builtin_variables.json": > "de6accceb23ac374122a14dd80584eaa", > "src/compiler/translator/gen_builtin_symbols.py": > "74ac1eb203c04abfbb81174c5fdb257d", > "src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h": >- "40adb165c1aee8c596aa8a77354da1d0", >+ "a5a963d58561a1635c9f0609c6f5449c", > "src/compiler/translator/tree_util/BuiltIn_complete_autogen.h": > "1eb560d091163f776b743149c66ff045", > "src/tests/compiler_tests/ImmutableString_test_ESSL_autogen.cpp": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Test_spec_JSON.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Test_spec_JSON.json >index bc4d50816bb626a71fc191b949075a5ad3146a54..d30387d7c02522ed4913419e7ff52f295819aa37 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Test_spec_JSON.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Test_spec_JSON.json >@@ -1,20 +1,20 @@ > { > "infra/specs/angle.json": >- "b5bf94e7c39709830cdb50daf754a664", >+ "94ff00b4758d1cdcb0a2f9472a80d4ca", > "infra/specs/generate_test_spec_json.py": > "4be9deb362129fb37eb0ad76ed2d8c11", > "infra/specs/mixins.pyl": >- "7b0d2e728eadddd2e2041a0a16d4cfcc", >+ "69ae4f86bedbb469bc13c330a007bd89", > "infra/specs/test_suite_exceptions.pyl": > "723460da84a90884a9668c07a0893390", > "infra/specs/test_suites.pyl": >- "cc93c033a302a86feb4203122631b5a5", >+ "a04f97cc6c461372dbeefe041be58d12", > "infra/specs/variants.pyl": > "8cfcaa99fa07ad2a2d5d14f220fd5037", > "infra/specs/waterfalls.pyl": >- "a04eb0f0e8876da962cf118bf6ec17d9", >+ "d0ec078ceb322231beb013707b754dd6", > "testing/buildbot/generate_buildbot_json.py": >- "12b9379b94950f40a2279da05059a086", >+ "5763d784daa2ce2738e7fdb56623230c", > "testing/buildbot/mixins.pyl": >- "f25c4910bd9371f30298f0cb10abe084" >+ "65dc51b541da8cf365065d7533deaab4" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_format.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_format.json >index 8ca00120eb4d1c6ab5a1d5f7cb41022cd9c06d22..c8a417f32bf06e5ec4ae74ea7b88a9d392773821 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_format.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_format.json >@@ -1,6 +1,6 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/angle_format_map.json": > "951e1bceaba86eecb5c23173e897d092", > "src/libANGLE/renderer/vulkan/gen_vk_format_table.py": >@@ -8,5 +8,5 @@ > "src/libANGLE/renderer/vulkan/vk_format_map.json": > "39f2bdd9574a0f1b6666862ef104297f", > "src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp": >- "4bd34086514c7cecc764a8f7c8b50d48" >+ "f012e32acb32d14edf565aedddcbd47b" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json >index f47152ab7cc3f3b85117a215beefec3e8d4cd3c3..c53c64d9c7330b20c4580869bf3d2ca777d72093 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_internal_shader_programs.json >@@ -262,21 +262,17 @@ > "src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000002A.inc": > "15689fb00c6bf4d2d828898d043cdd8a", > "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc": >- "4b21cfe1dc25ef1fd0c41d9f6971094a", >+ "fa10ef402adc71581c4d714c58652a32", > "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc": >- "c0334a7da459bba7918bd95260ec4471", >+ "0018b426777cd6db138de5c4b80273d7", > "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc": >- "35fbd6fa0dcd2cd0acb7056531906dc1", >- "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000003.inc": >- "d90a95c616f06e7b96dc7897db232703", >- "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000004.inc": >- "8a6a0b78d9de1ba16945097fb33e1119", >- "src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000005.inc": >- "83626be8291a8a4364076cf82e714507", >+ "b9ac0e39e37268050f211873d84914e0", > "src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000000.inc": > "cccfaa2f3f70dfb8d204689a4a17e355", > "src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000001.inc": > "e3d99398731135cd072661d5789ba7d1", >+ "src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000002.inc": >+ "29dc972627bb50044e03ca5e33c25ee6", > "src/libANGLE/renderer/vulkan/shaders/src/BlitResolve.frag": > "0b16d3ad95d7dbc2ce7175462152e4f9", > "src/libANGLE/renderer/vulkan/shaders/src/BlitResolve.frag.json": >@@ -316,17 +312,17 @@ > "src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag.json": > "f6b69ba316a5565400c2875e5da14b73", > "src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp": >- "c89a0d185f7723e0c221c135aa4f48a3", >+ "6b16ef622984f8d503f6729c9d20feab", > "src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json": >- "e5fd5bb63707753601e197635316430e", >+ "5bac01970db6744980d66099a1c4d79d", > "src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp": >- "e3e098b2349352c9e12ab34bc5f0a53c", >+ "2d0f9a267e36269145c8ab837236386e", > "src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json": >- "af79e5153c99cdb1e6b551b11bbf7f6b", >+ "16aecad24235b7cc6b0567e489bb5f6f", > "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp": >- "190b5413334a960ab072609fec1adbff", >+ "8ac4245138c5c6f7b15fb943d234c867", > "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h": >- "5815a3b35ba80dded6396055281bb674", >+ "dec165c3c32735e14f51ef47851d8b96", > "tools/glslang/glslang_validator.exe.sha1": > "17e862cc6f462fecbf50b24ed6544a27", > "tools/glslang/glslang_validator.sha1": >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json >index aa537b5e7d1691c6fc9a984eecb281bfdb3971f8..3247feb214839d07cb787542c07efcd5a823a7a1 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/Vulkan_mandatory_format_support_table.json >@@ -1,6 +1,6 @@ > { > "src/libANGLE/renderer/angle_format.py": >- "74d6c9842128293118ccf128aeae896a", >+ "2f8fa768088e22b0963bbdf842d3e725", > "src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py": > "3e2b8cd80373275e862bb7c8ba20a745", > "src/libANGLE/renderer/vulkan/vk_format_map.json": >@@ -10,5 +10,5 @@ > "src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp": > "e9cc42ed8f28f5b86999ead2e033916a", > "third_party/vulkan-deps/vulkan-headers/src/registry/vk.xml": >- "55549a670b0e9507d0751a41c2af9ce5" >+ "d4aedd82856b0935ee9a9b02abd35757" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/overlay_fonts.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/overlay_fonts.json >index 3071d7b81d2dd0008df4850ad9e0435c1d6d6189..56a9992ffc3261e96721536ac58acdc65338d327 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/overlay_fonts.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/overlay_fonts.json >@@ -4,5 +4,5 @@ > "src/libANGLE/Overlay_font_autogen.h": > "2eae247cebb716c4f591de8a251b4a8e", > "src/libANGLE/gen_overlay_fonts.py": >- "9bbc8527ae797254884e9e17d49dacd1" >+ "391c86c46633c5478158b9fcfb98cdc5" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/proc_table.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/proc_table.json >index 8c6f6c57e3471d2a86f2ea4b73cc9d56a72b14b4..21fbd2f8194ae341c9e6358c7b9ee7636fe1956d 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/proc_table.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/proc_table.json >@@ -4,7 +4,7 @@ > "scripts/egl.xml": > "013c552e6c523abdcf268268ea47e9fe", > "scripts/egl_angle_ext.xml": >- "bd57943b71217a962e6049a74bb64e0e", >+ "72bf10ed3d23d5cdfa49934a0393b30d", > "scripts/gen_proc_table.py": > "8336449da7e36f45dd6d70c44add2ebf", > "scripts/gl.xml": >@@ -12,7 +12,7 @@ > "scripts/gl_angle_ext.xml": > "474989440f980a079935dff3ab4d7b24", > "scripts/registry_xml.py": >- "b1893c003352dec25d4cd54e2b385925", >+ "c7e68268b6cfea2c705d273863ecce74", > "scripts/wgl.xml": > "c36001431919e1c435f1215a85f7e1db", > "src/libGL/proc_table_wgl_autogen.cpp": >@@ -20,7 +20,7 @@ > "src/libGLESv2/proc_table_cl_autogen.cpp": > "ed003b0f041aaaa35b67d3fe07e61f91", > "src/libGLESv2/proc_table_egl_autogen.cpp": >- "2a115ccf76672824e1a8bd2845529f48", >+ "90692aa4f06a996d58404131f64530d7", > "src/libOpenCL/libOpenCL_autogen.map": > "bc5f5cf48227149ed321258a16eff1d7" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/restricted_traces.json b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/restricted_traces.json >index 856ac2b1fe8e859ab48fea7c3621da5f9ce63de9..6e46d5aed99bb07b510fea8b8e09282eee5cfa5a 100644 >--- a/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/restricted_traces.json >+++ b/Source/ThirdParty/ANGLE/scripts/code_generation_hashes/restricted_traces.json >@@ -1,14 +1,8 @@ > { > "src/tests/restricted_traces/.gitignore": >- "f9c1b1aed4e36a56ba9827b0c240ec7d", >+ "371f3b4bd514af95e67a73f82116d4b6", > "src/tests/restricted_traces/gen_restricted_traces.py": >- "241d7eb3d8322ff67f44b84f8a06a4cf", >+ "7780405f8e0d92fa87a772dd64c62efb", > "src/tests/restricted_traces/restricted_traces.json": >- "d9a8e33a5b39a5856837ff85ab1bd700", >- "src/tests/restricted_traces/restricted_traces_autogen.cpp": >- "fd600710381f4ced03888b28e5d4baa5", >- "src/tests/restricted_traces/restricted_traces_autogen.gni": >- "50cbab7c052f3e3adc569f6fa106bdda", >- "src/tests/restricted_traces/restricted_traces_autogen.h": >- "77a97c4bb042e28be314bf45e915e013" >+ "cb4610110aa90ccc2eeff166f9c09841" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/egl_angle_ext.xml b/Source/ThirdParty/ANGLE/scripts/egl_angle_ext.xml >index fadef173a6c10303ebc02babf7ed0274cd5b7d94..37b3ebafdf54cad7a47edff898d0ed1c06763c23 100644 >--- a/Source/ThirdParty/ANGLE/scripts/egl_angle_ext.xml >+++ b/Source/ThirdParty/ANGLE/scripts/egl_angle_ext.xml >@@ -94,6 +94,11 @@ > <param><ptype>EGLSurface</ptype> <name>surface</name></param> > <param><ptype>EGLFrameTokenANGLE</ptype> <name>frametoken</name></param> > </command> >+ <command> >+ <proto><pytpe>EGLBoolean</pytpe> <name>eglPrepareSwapBuffersANGLE</name></proto> >+ <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >+ <param><ptype>EGLSurface</ptype> <name>surface</name></param> >+ </command> > <command> > <proto><pytpe>void</pytpe> <name>eglReleaseHighPowerGPUANGLE</name></proto> > <param><ptype>EGLDisplay</ptype> <name>dpy</name></param> >@@ -165,6 +170,11 @@ > <command name="eglSwapBuffersWithFrameTokenANGLE"/> > </require> > </extension> >+ <extension name="EGL_ANGLE_prepare_swap_buffers" supported="egl"> >+ <require> >+ <command name="eglPrepareSwapBuffersANGLE"/> >+ </require> >+ </extension> > <extension name="EGL_ANGLE_power_preference" supported="egl"> > <require> > <command name="eglReleaseHighPowerGPUANGLE"/> >diff --git a/Source/ThirdParty/ANGLE/scripts/export_targets.py b/Source/ThirdParty/ANGLE/scripts/export_targets.py >index d4c19b5c8244823612f21108abc900af724f797b..6117a26c736df298e0661b49dadd149bfb41ac85 100755 >--- a/Source/ThirdParty/ANGLE/scripts/export_targets.py >+++ b/Source/ThirdParty/ANGLE/scripts/export_targets.py >@@ -211,6 +211,7 @@ IGNORED_INCLUDES = { > b'libANGLE/renderer/vulkan/win32/DisplayVkWin32.h', > b'libANGLE/renderer/vulkan/xcb/DisplayVkXcb.h', > b'loader_cmake_config.h', >+ b'loader_linux.h', > b'loader_windows.h', > b'optick.h', > b'spirv-tools/libspirv.h', >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_linux.json b/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_linux.json >index 21c03b19b5778e3e903669bf8c9148dc69f62f98..d21964f6026f8677cc1c778354fd1693221b5650 100644 >--- a/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_linux.json >+++ b/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_linux.json >@@ -1,8 +1,8 @@ > { > "Vendor": "Google Inc. (Intel)", >- "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >+ "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Renderer": "ANGLE (Intel, Vulkan 1.1.96 (Intel(R) HD Graphics 630 (Kaby Lake GT2) (0x00005912)), Intel open-source Mesa driver-19.0.2)", >- "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >+ "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Extensions": [ > "GL_ANGLE_base_vertex_base_instance", > "GL_ANGLE_base_vertex_base_instance_shader_builtin", >@@ -22,9 +22,13 @@ > "GL_ANGLE_program_cache_control", > "GL_ANGLE_relaxed_vertex_attribute_type", > "GL_ANGLE_request_extension", >+ "GL_ANGLE_rgbx_internal_format", > "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_robust_fragment_shader_output", > "GL_ANGLE_texture_compression_dxt3", > "GL_ANGLE_texture_compression_dxt5", >+ "GL_ANGLE_texture_usage", >+ "GL_ANGLE_vulkan_image", > "GL_ANGLE_yuv_internal_format", > "GL_APPLE_clip_distance", > "GL_CHROMIUM_bind_generates_resource", >@@ -57,6 +61,7 @@ > "GL_EXT_map_buffer_range", > "GL_EXT_memory_object", > "GL_EXT_memory_object_fd", >+ "GL_EXT_multi_draw_indirect", > "GL_EXT_multisampled_render_to_texture", > "GL_EXT_multisampled_render_to_texture2", > "GL_EXT_occlusion_query_boolean", >@@ -147,5 +152,5 @@ > "GL_OES_vertex_half_float", > "GL_OES_vertex_type_10_10_10_2" > ], >- "DateRecorded": "October 1, 2021" >+ "DateRecorded": "December 28, 2021" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_win10.json b/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_win10.json >index de28299d2a44ff1761868d1bfa22d00f039fbf17..b325939020db38be33e3b651b54f19e674a70311 100644 >--- a/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_win10.json >+++ b/Source/ThirdParty/ANGLE/scripts/extension_data/intel_630_win10.json >@@ -1,8 +1,8 @@ > { > "Vendor": "Google Inc. (Intel)", >- "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.16846 git hash: 22d8115a208b)", >+ "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Renderer": "ANGLE (Intel, Vulkan 1.2.135 (Intel(R) HD Graphics 630 (0x00005912)), Intel Corporation-100.100.)", >- "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.16846 git hash: 22d8115a208b)", >+ "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Extensions": [ > "GL_ANGLE_base_vertex_base_instance", > "GL_ANGLE_base_vertex_base_instance_shader_builtin", >@@ -22,9 +22,13 @@ > "GL_ANGLE_program_cache_control", > "GL_ANGLE_relaxed_vertex_attribute_type", > "GL_ANGLE_request_extension", >+ "GL_ANGLE_rgbx_internal_format", > "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_robust_fragment_shader_output", > "GL_ANGLE_texture_compression_dxt3", > "GL_ANGLE_texture_compression_dxt5", >+ "GL_ANGLE_texture_usage", >+ "GL_ANGLE_vulkan_image", > "GL_APPLE_clip_distance", > "GL_CHROMIUM_bind_generates_resource", > "GL_CHROMIUM_bind_uniform_location", >@@ -56,6 +60,7 @@ > "GL_EXT_instanced_arrays", > "GL_EXT_map_buffer_range", > "GL_EXT_memory_object", >+ "GL_EXT_multi_draw_indirect", > "GL_EXT_occlusion_query_boolean", > "GL_EXT_primitive_bounding_box", > "GL_EXT_read_format_bgra", >@@ -145,5 +150,5 @@ > "GL_OVR_multiview", > "GL_OVR_multiview2" > ], >- "DateRecorded": "October 1, 2021" >+ "DateRecorded": "December 28, 2021" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_1660_linux.json b/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_1660_linux.json >new file mode 100644 >index 0000000000000000000000000000000000000000..339b54567a18d8d54da0698a77cb5709a437c9c5 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_1660_linux.json >@@ -0,0 +1,158 @@ >+{ >+ "Vendor": "Google Inc. (NVIDIA)", >+ "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", >+ "Renderer": "ANGLE (NVIDIA, Vulkan 1.1.119 (NVIDIA GeForce GTX 1660 (0x00002184)), NVIDIA-440.100.0.0)", >+ "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", >+ "Extensions": [ >+ "GL_ANGLE_base_vertex_base_instance", >+ "GL_ANGLE_base_vertex_base_instance_shader_builtin", >+ "GL_ANGLE_client_arrays", >+ "GL_ANGLE_copy_texture_3d", >+ "GL_ANGLE_depth_texture", >+ "GL_ANGLE_framebuffer_blit", >+ "GL_ANGLE_framebuffer_multisample", >+ "GL_ANGLE_get_image", >+ "GL_ANGLE_get_serialized_context_string", >+ "GL_ANGLE_get_tex_level_parameter", >+ "GL_ANGLE_instanced_arrays", >+ "GL_ANGLE_memory_object_flags", >+ "GL_ANGLE_memory_size", >+ "GL_ANGLE_multi_draw", >+ "GL_ANGLE_program_cache_control", >+ "GL_ANGLE_relaxed_vertex_attribute_type", >+ "GL_ANGLE_request_extension", >+ "GL_ANGLE_rgbx_internal_format", >+ "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_robust_fragment_shader_output", >+ "GL_ANGLE_texture_compression_dxt3", >+ "GL_ANGLE_texture_compression_dxt5", >+ "GL_ANGLE_texture_usage", >+ "GL_ANGLE_vulkan_image", >+ "GL_ANGLE_yuv_internal_format", >+ "GL_APPLE_clip_distance", >+ "GL_CHROMIUM_bind_generates_resource", >+ "GL_CHROMIUM_bind_uniform_location", >+ "GL_CHROMIUM_copy_compressed_texture", >+ "GL_CHROMIUM_copy_texture", >+ "GL_CHROMIUM_lose_context", >+ "GL_EXT_EGL_image_array", >+ "GL_EXT_EGL_image_external_wrap_modes", >+ "GL_EXT_blend_func_extended", >+ "GL_EXT_blend_minmax", >+ "GL_EXT_buffer_storage", >+ "GL_EXT_clip_control", >+ "GL_EXT_clip_cull_distance", >+ "GL_EXT_color_buffer_float", >+ "GL_EXT_color_buffer_half_float", >+ "GL_EXT_compressed_ETC1_RGB8_sub_texture", >+ "GL_EXT_copy_image", >+ "GL_EXT_debug_label", >+ "GL_EXT_debug_marker", >+ "GL_EXT_discard_framebuffer", >+ "GL_EXT_disjoint_timer_query", >+ "GL_EXT_draw_buffers", >+ "GL_EXT_draw_buffers_indexed", >+ "GL_EXT_draw_elements_base_vertex", >+ "GL_EXT_float_blend", >+ "GL_EXT_frag_depth", >+ "GL_EXT_geometry_shader", >+ "GL_EXT_gpu_shader5", >+ "GL_EXT_instanced_arrays", >+ "GL_EXT_map_buffer_range", >+ "GL_EXT_memory_object", >+ "GL_EXT_memory_object_fd", >+ "GL_EXT_multi_draw_indirect", >+ "GL_EXT_multisampled_render_to_texture", >+ "GL_EXT_multisampled_render_to_texture2", >+ "GL_EXT_occlusion_query_boolean", >+ "GL_EXT_primitive_bounding_box", >+ "GL_EXT_read_format_bgra", >+ "GL_EXT_robustness", >+ "GL_EXT_sRGB", >+ "GL_EXT_sRGB_write_control", >+ "GL_EXT_semaphore", >+ "GL_EXT_semaphore_fd", >+ "GL_EXT_separate_shader_objects", >+ "GL_EXT_shader_framebuffer_fetch_non_coherent", >+ "GL_EXT_shader_io_blocks", >+ "GL_EXT_shader_non_constant_global_initializers", >+ "GL_EXT_shader_texture_lod", >+ "GL_EXT_shadow_samplers", >+ "GL_EXT_tessellation_shader", >+ "GL_EXT_texture_buffer", >+ "GL_EXT_texture_compression_bptc", >+ "GL_EXT_texture_compression_dxt1", >+ "GL_EXT_texture_compression_rgtc", >+ "GL_EXT_texture_compression_s3tc_srgb", >+ "GL_EXT_texture_cube_map_array", >+ "GL_EXT_texture_filter_anisotropic", >+ "GL_EXT_texture_format_BGRA8888", >+ "GL_EXT_texture_rg", >+ "GL_EXT_texture_sRGB_R8", >+ "GL_EXT_texture_sRGB_decode", >+ "GL_EXT_texture_storage", >+ "GL_EXT_texture_type_2_10_10_10_REV", >+ "GL_EXT_unpack_subimage", >+ "GL_KHR_debug", >+ "GL_KHR_parallel_shader_compile", >+ "GL_NV_depth_buffer_float2", >+ "GL_NV_fence", >+ "GL_NV_framebuffer_blit", >+ "GL_NV_pack_subimage", >+ "GL_NV_pixel_buffer_object", >+ "GL_NV_read_depth", >+ "GL_NV_read_stencil", >+ "GL_NV_shader_noperspective_interpolation", >+ "GL_OES_EGL_image", >+ "GL_OES_EGL_image_external", >+ "GL_OES_EGL_image_external_essl3", >+ "GL_OES_EGL_sync", >+ "GL_OES_compressed_EAC_R11_signed_texture", >+ "GL_OES_compressed_EAC_R11_unsigned_texture", >+ "GL_OES_compressed_EAC_RG11_signed_texture", >+ "GL_OES_compressed_EAC_RG11_unsigned_texture", >+ "GL_OES_compressed_ETC1_RGB8_texture", >+ "GL_OES_compressed_ETC2_RGB8_texture", >+ "GL_OES_compressed_ETC2_RGBA8_texture", >+ "GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture", >+ "GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture", >+ "GL_OES_compressed_ETC2_sRGB8_alpha8_texture", >+ "GL_OES_compressed_ETC2_sRGB8_texture", >+ "GL_OES_depth24", >+ "GL_OES_depth32", >+ "GL_OES_depth_texture", >+ "GL_OES_depth_texture_cube_map", >+ "GL_OES_draw_buffers_indexed", >+ "GL_OES_draw_elements_base_vertex", >+ "GL_OES_element_index_uint", >+ "GL_OES_fbo_render_mipmap", >+ "GL_OES_geometry_shader", >+ "GL_OES_get_program_binary", >+ "GL_OES_mapbuffer", >+ "GL_OES_packed_depth_stencil", >+ "GL_OES_rgb8_rgba8", >+ "GL_OES_sample_shading", >+ "GL_OES_sample_variables", >+ "GL_OES_shader_image_atomic", >+ "GL_OES_shader_io_blocks", >+ "GL_OES_shader_multisample_interpolation", >+ "GL_OES_standard_derivatives", >+ "GL_OES_surfaceless_context", >+ "GL_OES_texture_3D", >+ "GL_OES_texture_buffer", >+ "GL_OES_texture_cube_map_array", >+ "GL_OES_texture_float", >+ "GL_OES_texture_float_linear", >+ "GL_OES_texture_half_float", >+ "GL_OES_texture_half_float_linear", >+ "GL_OES_texture_npot", >+ "GL_OES_texture_stencil8", >+ "GL_OES_texture_storage_multisample_2d_array", >+ "GL_OES_vertex_array_object", >+ "GL_OES_vertex_half_float", >+ "GL_OES_vertex_type_10_10_10_2", >+ "GL_OVR_multiview", >+ "GL_OVR_multiview2" >+ ], >+ "DateRecorded": "December 28, 2021" >+} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_1660_win10.json b/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_1660_win10.json >new file mode 100644 >index 0000000000000000000000000000000000000000..7b42433956481688a066aa50da545030b98e0efa >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_1660_win10.json >@@ -0,0 +1,158 @@ >+{ >+ "Vendor": "Google Inc. (NVIDIA)", >+ "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", >+ "Renderer": "ANGLE (NVIDIA, Vulkan 1.2.142 (NVIDIA GeForce GTX 1660 (0x00002184)), NVIDIA-456.38.0.0)", >+ "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", >+ "Extensions": [ >+ "GL_ANGLE_base_vertex_base_instance", >+ "GL_ANGLE_base_vertex_base_instance_shader_builtin", >+ "GL_ANGLE_client_arrays", >+ "GL_ANGLE_copy_texture_3d", >+ "GL_ANGLE_depth_texture", >+ "GL_ANGLE_framebuffer_blit", >+ "GL_ANGLE_framebuffer_multisample", >+ "GL_ANGLE_get_image", >+ "GL_ANGLE_get_serialized_context_string", >+ "GL_ANGLE_get_tex_level_parameter", >+ "GL_ANGLE_instanced_arrays", >+ "GL_ANGLE_memory_object_flags", >+ "GL_ANGLE_memory_size", >+ "GL_ANGLE_multi_draw", >+ "GL_ANGLE_program_cache_control", >+ "GL_ANGLE_relaxed_vertex_attribute_type", >+ "GL_ANGLE_request_extension", >+ "GL_ANGLE_rgbx_internal_format", >+ "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_robust_fragment_shader_output", >+ "GL_ANGLE_texture_compression_dxt3", >+ "GL_ANGLE_texture_compression_dxt5", >+ "GL_ANGLE_texture_usage", >+ "GL_ANGLE_vulkan_image", >+ "GL_ANGLE_yuv_internal_format", >+ "GL_APPLE_clip_distance", >+ "GL_CHROMIUM_bind_generates_resource", >+ "GL_CHROMIUM_bind_uniform_location", >+ "GL_CHROMIUM_copy_compressed_texture", >+ "GL_CHROMIUM_copy_texture", >+ "GL_CHROMIUM_lose_context", >+ "GL_EXT_EGL_image_array", >+ "GL_EXT_EGL_image_external_wrap_modes", >+ "GL_EXT_blend_func_extended", >+ "GL_EXT_blend_minmax", >+ "GL_EXT_buffer_storage", >+ "GL_EXT_clip_control", >+ "GL_EXT_clip_cull_distance", >+ "GL_EXT_color_buffer_float", >+ "GL_EXT_color_buffer_half_float", >+ "GL_EXT_compressed_ETC1_RGB8_sub_texture", >+ "GL_EXT_copy_image", >+ "GL_EXT_debug_label", >+ "GL_EXT_debug_marker", >+ "GL_EXT_discard_framebuffer", >+ "GL_EXT_disjoint_timer_query", >+ "GL_EXT_draw_buffers", >+ "GL_EXT_draw_buffers_indexed", >+ "GL_EXT_draw_elements_base_vertex", >+ "GL_EXT_float_blend", >+ "GL_EXT_frag_depth", >+ "GL_EXT_geometry_shader", >+ "GL_EXT_gpu_shader5", >+ "GL_EXT_instanced_arrays", >+ "GL_EXT_map_buffer_range", >+ "GL_EXT_memory_object", >+ "GL_EXT_multi_draw_indirect", >+ "GL_EXT_multisampled_render_to_texture", >+ "GL_EXT_multisampled_render_to_texture2", >+ "GL_EXT_occlusion_query_boolean", >+ "GL_EXT_primitive_bounding_box", >+ "GL_EXT_read_format_bgra", >+ "GL_EXT_robustness", >+ "GL_EXT_sRGB", >+ "GL_EXT_sRGB_write_control", >+ "GL_EXT_semaphore", >+ "GL_EXT_separate_shader_objects", >+ "GL_EXT_shader_framebuffer_fetch_non_coherent", >+ "GL_EXT_shader_io_blocks", >+ "GL_EXT_shader_non_constant_global_initializers", >+ "GL_EXT_shader_texture_lod", >+ "GL_EXT_shadow_samplers", >+ "GL_EXT_tessellation_shader", >+ "GL_EXT_texture_border_clamp", >+ "GL_EXT_texture_buffer", >+ "GL_EXT_texture_compression_bptc", >+ "GL_EXT_texture_compression_dxt1", >+ "GL_EXT_texture_compression_rgtc", >+ "GL_EXT_texture_compression_s3tc_srgb", >+ "GL_EXT_texture_cube_map_array", >+ "GL_EXT_texture_filter_anisotropic", >+ "GL_EXT_texture_format_BGRA8888", >+ "GL_EXT_texture_rg", >+ "GL_EXT_texture_sRGB_R8", >+ "GL_EXT_texture_sRGB_decode", >+ "GL_EXT_texture_storage", >+ "GL_EXT_texture_type_2_10_10_10_REV", >+ "GL_EXT_unpack_subimage", >+ "GL_KHR_debug", >+ "GL_KHR_parallel_shader_compile", >+ "GL_NV_depth_buffer_float2", >+ "GL_NV_fence", >+ "GL_NV_framebuffer_blit", >+ "GL_NV_pack_subimage", >+ "GL_NV_pixel_buffer_object", >+ "GL_NV_read_depth", >+ "GL_NV_read_stencil", >+ "GL_NV_shader_noperspective_interpolation", >+ "GL_OES_EGL_image", >+ "GL_OES_EGL_image_external", >+ "GL_OES_EGL_image_external_essl3", >+ "GL_OES_EGL_sync", >+ "GL_OES_compressed_EAC_R11_signed_texture", >+ "GL_OES_compressed_EAC_R11_unsigned_texture", >+ "GL_OES_compressed_EAC_RG11_signed_texture", >+ "GL_OES_compressed_EAC_RG11_unsigned_texture", >+ "GL_OES_compressed_ETC1_RGB8_texture", >+ "GL_OES_compressed_ETC2_RGB8_texture", >+ "GL_OES_compressed_ETC2_RGBA8_texture", >+ "GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture", >+ "GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture", >+ "GL_OES_compressed_ETC2_sRGB8_alpha8_texture", >+ "GL_OES_compressed_ETC2_sRGB8_texture", >+ "GL_OES_depth24", >+ "GL_OES_depth32", >+ "GL_OES_depth_texture", >+ "GL_OES_depth_texture_cube_map", >+ "GL_OES_draw_buffers_indexed", >+ "GL_OES_draw_elements_base_vertex", >+ "GL_OES_element_index_uint", >+ "GL_OES_fbo_render_mipmap", >+ "GL_OES_geometry_shader", >+ "GL_OES_get_program_binary", >+ "GL_OES_mapbuffer", >+ "GL_OES_packed_depth_stencil", >+ "GL_OES_rgb8_rgba8", >+ "GL_OES_sample_shading", >+ "GL_OES_sample_variables", >+ "GL_OES_shader_image_atomic", >+ "GL_OES_shader_io_blocks", >+ "GL_OES_shader_multisample_interpolation", >+ "GL_OES_standard_derivatives", >+ "GL_OES_surfaceless_context", >+ "GL_OES_texture_3D", >+ "GL_OES_texture_border_clamp", >+ "GL_OES_texture_buffer", >+ "GL_OES_texture_cube_map_array", >+ "GL_OES_texture_float", >+ "GL_OES_texture_float_linear", >+ "GL_OES_texture_half_float", >+ "GL_OES_texture_half_float_linear", >+ "GL_OES_texture_npot", >+ "GL_OES_texture_stencil8", >+ "GL_OES_texture_storage_multisample_2d_array", >+ "GL_OES_vertex_array_object", >+ "GL_OES_vertex_half_float", >+ "GL_OES_vertex_type_10_10_10_2", >+ "GL_OVR_multiview", >+ "GL_OVR_multiview2" >+ ], >+ "DateRecorded": "December 28, 2021" >+} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_p400_linux.json b/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_p400_linux.json >deleted file mode 100644 >index 11c0b54bebf2eac01b4d179952aa361597c59d97..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_p400_linux.json >+++ /dev/null >@@ -1,148 +0,0 @@ >-{ >- "Vendor": "Google Inc. (NVIDIA)", >- "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >- "Renderer": "ANGLE (NVIDIA, Vulkan 1.1.95 (NVIDIA Quadro P400 (0x00001CB3)), NVIDIA-418.56.0.0)", >- "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >- "Extensions": [ >- "GL_ANGLE_base_vertex_base_instance", >- "GL_ANGLE_base_vertex_base_instance_shader_builtin", >- "GL_ANGLE_client_arrays", >- "GL_ANGLE_copy_texture_3d", >- "GL_ANGLE_depth_texture", >- "GL_ANGLE_framebuffer_blit", >- "GL_ANGLE_framebuffer_multisample", >- "GL_ANGLE_get_image", >- "GL_ANGLE_get_serialized_context_string", >- "GL_ANGLE_get_tex_level_parameter", >- "GL_ANGLE_instanced_arrays", >- "GL_ANGLE_memory_object_flags", >- "GL_ANGLE_memory_size", >- "GL_ANGLE_multi_draw", >- "GL_ANGLE_program_cache_control", >- "GL_ANGLE_relaxed_vertex_attribute_type", >- "GL_ANGLE_request_extension", >- "GL_ANGLE_robust_client_memory", >- "GL_ANGLE_texture_compression_dxt3", >- "GL_ANGLE_texture_compression_dxt5", >- "GL_ANGLE_yuv_internal_format", >- "GL_APPLE_clip_distance", >- "GL_CHROMIUM_bind_generates_resource", >- "GL_CHROMIUM_bind_uniform_location", >- "GL_CHROMIUM_copy_compressed_texture", >- "GL_CHROMIUM_copy_texture", >- "GL_CHROMIUM_lose_context", >- "GL_EXT_EGL_image_array", >- "GL_EXT_EGL_image_external_wrap_modes", >- "GL_EXT_blend_func_extended", >- "GL_EXT_blend_minmax", >- "GL_EXT_buffer_storage", >- "GL_EXT_clip_control", >- "GL_EXT_clip_cull_distance", >- "GL_EXT_color_buffer_float", >- "GL_EXT_color_buffer_half_float", >- "GL_EXT_compressed_ETC1_RGB8_sub_texture", >- "GL_EXT_copy_image", >- "GL_EXT_debug_label", >- "GL_EXT_debug_marker", >- "GL_EXT_discard_framebuffer", >- "GL_EXT_disjoint_timer_query", >- "GL_EXT_draw_buffers", >- "GL_EXT_draw_buffers_indexed", >- "GL_EXT_draw_elements_base_vertex", >- "GL_EXT_float_blend", >- "GL_EXT_frag_depth", >- "GL_EXT_gpu_shader5", >- "GL_EXT_instanced_arrays", >- "GL_EXT_map_buffer_range", >- "GL_EXT_memory_object", >- "GL_EXT_memory_object_fd", >- "GL_EXT_multisampled_render_to_texture", >- "GL_EXT_multisampled_render_to_texture2", >- "GL_EXT_occlusion_query_boolean", >- "GL_EXT_primitive_bounding_box", >- "GL_EXT_read_format_bgra", >- "GL_EXT_robustness", >- "GL_EXT_sRGB", >- "GL_EXT_sRGB_write_control", >- "GL_EXT_semaphore", >- "GL_EXT_semaphore_fd", >- "GL_EXT_separate_shader_objects", >- "GL_EXT_shader_framebuffer_fetch_non_coherent", >- "GL_EXT_shader_io_blocks", >- "GL_EXT_shader_non_constant_global_initializers", >- "GL_EXT_shader_texture_lod", >- "GL_EXT_shadow_samplers", >- "GL_EXT_texture_buffer", >- "GL_EXT_texture_compression_bptc", >- "GL_EXT_texture_compression_dxt1", >- "GL_EXT_texture_compression_rgtc", >- "GL_EXT_texture_compression_s3tc_srgb", >- "GL_EXT_texture_cube_map_array", >- "GL_EXT_texture_filter_anisotropic", >- "GL_EXT_texture_format_BGRA8888", >- "GL_EXT_texture_rg", >- "GL_EXT_texture_sRGB_R8", >- "GL_EXT_texture_sRGB_decode", >- "GL_EXT_texture_storage", >- "GL_EXT_texture_type_2_10_10_10_REV", >- "GL_EXT_unpack_subimage", >- "GL_KHR_debug", >- "GL_KHR_parallel_shader_compile", >- "GL_NV_depth_buffer_float2", >- "GL_NV_fence", >- "GL_NV_framebuffer_blit", >- "GL_NV_pack_subimage", >- "GL_NV_pixel_buffer_object", >- "GL_NV_read_depth", >- "GL_NV_read_stencil", >- "GL_NV_shader_noperspective_interpolation", >- "GL_OES_EGL_image", >- "GL_OES_EGL_image_external", >- "GL_OES_EGL_image_external_essl3", >- "GL_OES_EGL_sync", >- "GL_OES_compressed_EAC_R11_signed_texture", >- "GL_OES_compressed_EAC_R11_unsigned_texture", >- "GL_OES_compressed_EAC_RG11_signed_texture", >- "GL_OES_compressed_EAC_RG11_unsigned_texture", >- "GL_OES_compressed_ETC1_RGB8_texture", >- "GL_OES_compressed_ETC2_RGB8_texture", >- "GL_OES_compressed_ETC2_RGBA8_texture", >- "GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture", >- "GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture", >- "GL_OES_compressed_ETC2_sRGB8_alpha8_texture", >- "GL_OES_compressed_ETC2_sRGB8_texture", >- "GL_OES_depth24", >- "GL_OES_depth32", >- "GL_OES_depth_texture", >- "GL_OES_depth_texture_cube_map", >- "GL_OES_draw_buffers_indexed", >- "GL_OES_draw_elements_base_vertex", >- "GL_OES_element_index_uint", >- "GL_OES_fbo_render_mipmap", >- "GL_OES_get_program_binary", >- "GL_OES_mapbuffer", >- "GL_OES_packed_depth_stencil", >- "GL_OES_rgb8_rgba8", >- "GL_OES_sample_shading", >- "GL_OES_sample_variables", >- "GL_OES_shader_image_atomic", >- "GL_OES_shader_io_blocks", >- "GL_OES_shader_multisample_interpolation", >- "GL_OES_standard_derivatives", >- "GL_OES_surfaceless_context", >- "GL_OES_texture_3D", >- "GL_OES_texture_buffer", >- "GL_OES_texture_cube_map_array", >- "GL_OES_texture_float", >- "GL_OES_texture_float_linear", >- "GL_OES_texture_half_float", >- "GL_OES_texture_half_float_linear", >- "GL_OES_texture_npot", >- "GL_OES_texture_stencil8", >- "GL_OES_texture_storage_multisample_2d_array", >- "GL_OES_vertex_array_object", >- "GL_OES_vertex_half_float", >- "GL_OES_vertex_type_10_10_10_2" >- ], >- "DateRecorded": "October 1, 2021" >-} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_p400_win10.json b/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_p400_win10.json >deleted file mode 100644 >index e0d7ce732894f0093892c8c10126adbf71addb2f..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/scripts/extension_data/nvidia_p400_win10.json >+++ /dev/null >@@ -1,153 +0,0 @@ >-{ >- "Vendor": "Google Inc. (NVIDIA)", >- "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >- "Renderer": "ANGLE (NVIDIA, Vulkan 1.2.133 (NVIDIA Quadro P400 (0x00001CB3)), NVIDIA-451.48.0.0)", >- "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >- "Extensions": [ >- "GL_ANGLE_base_vertex_base_instance", >- "GL_ANGLE_base_vertex_base_instance_shader_builtin", >- "GL_ANGLE_client_arrays", >- "GL_ANGLE_copy_texture_3d", >- "GL_ANGLE_depth_texture", >- "GL_ANGLE_framebuffer_blit", >- "GL_ANGLE_framebuffer_multisample", >- "GL_ANGLE_get_image", >- "GL_ANGLE_get_serialized_context_string", >- "GL_ANGLE_get_tex_level_parameter", >- "GL_ANGLE_instanced_arrays", >- "GL_ANGLE_memory_object_flags", >- "GL_ANGLE_memory_size", >- "GL_ANGLE_multi_draw", >- "GL_ANGLE_program_cache_control", >- "GL_ANGLE_relaxed_vertex_attribute_type", >- "GL_ANGLE_request_extension", >- "GL_ANGLE_robust_client_memory", >- "GL_ANGLE_texture_compression_dxt3", >- "GL_ANGLE_texture_compression_dxt5", >- "GL_ANGLE_yuv_internal_format", >- "GL_APPLE_clip_distance", >- "GL_CHROMIUM_bind_generates_resource", >- "GL_CHROMIUM_bind_uniform_location", >- "GL_CHROMIUM_copy_compressed_texture", >- "GL_CHROMIUM_copy_texture", >- "GL_CHROMIUM_lose_context", >- "GL_EXT_EGL_image_array", >- "GL_EXT_EGL_image_external_wrap_modes", >- "GL_EXT_blend_func_extended", >- "GL_EXT_blend_minmax", >- "GL_EXT_buffer_storage", >- "GL_EXT_clip_control", >- "GL_EXT_clip_cull_distance", >- "GL_EXT_color_buffer_float", >- "GL_EXT_color_buffer_half_float", >- "GL_EXT_compressed_ETC1_RGB8_sub_texture", >- "GL_EXT_copy_image", >- "GL_EXT_debug_label", >- "GL_EXT_debug_marker", >- "GL_EXT_discard_framebuffer", >- "GL_EXT_disjoint_timer_query", >- "GL_EXT_draw_buffers", >- "GL_EXT_draw_buffers_indexed", >- "GL_EXT_draw_elements_base_vertex", >- "GL_EXT_float_blend", >- "GL_EXT_frag_depth", >- "GL_EXT_geometry_shader", >- "GL_EXT_gpu_shader5", >- "GL_EXT_instanced_arrays", >- "GL_EXT_map_buffer_range", >- "GL_EXT_memory_object", >- "GL_EXT_multisampled_render_to_texture", >- "GL_EXT_multisampled_render_to_texture2", >- "GL_EXT_occlusion_query_boolean", >- "GL_EXT_primitive_bounding_box", >- "GL_EXT_read_format_bgra", >- "GL_EXT_robustness", >- "GL_EXT_sRGB", >- "GL_EXT_sRGB_write_control", >- "GL_EXT_semaphore", >- "GL_EXT_separate_shader_objects", >- "GL_EXT_shader_framebuffer_fetch_non_coherent", >- "GL_EXT_shader_io_blocks", >- "GL_EXT_shader_non_constant_global_initializers", >- "GL_EXT_shader_texture_lod", >- "GL_EXT_shadow_samplers", >- "GL_EXT_tessellation_shader", >- "GL_EXT_texture_border_clamp", >- "GL_EXT_texture_buffer", >- "GL_EXT_texture_compression_bptc", >- "GL_EXT_texture_compression_dxt1", >- "GL_EXT_texture_compression_rgtc", >- "GL_EXT_texture_compression_s3tc_srgb", >- "GL_EXT_texture_cube_map_array", >- "GL_EXT_texture_filter_anisotropic", >- "GL_EXT_texture_format_BGRA8888", >- "GL_EXT_texture_rg", >- "GL_EXT_texture_sRGB_R8", >- "GL_EXT_texture_sRGB_decode", >- "GL_EXT_texture_storage", >- "GL_EXT_texture_type_2_10_10_10_REV", >- "GL_EXT_unpack_subimage", >- "GL_KHR_debug", >- "GL_KHR_parallel_shader_compile", >- "GL_NV_depth_buffer_float2", >- "GL_NV_fence", >- "GL_NV_framebuffer_blit", >- "GL_NV_pack_subimage", >- "GL_NV_pixel_buffer_object", >- "GL_NV_read_depth", >- "GL_NV_read_stencil", >- "GL_NV_shader_noperspective_interpolation", >- "GL_OES_EGL_image", >- "GL_OES_EGL_image_external", >- "GL_OES_EGL_image_external_essl3", >- "GL_OES_EGL_sync", >- "GL_OES_compressed_EAC_R11_signed_texture", >- "GL_OES_compressed_EAC_R11_unsigned_texture", >- "GL_OES_compressed_EAC_RG11_signed_texture", >- "GL_OES_compressed_EAC_RG11_unsigned_texture", >- "GL_OES_compressed_ETC1_RGB8_texture", >- "GL_OES_compressed_ETC2_RGB8_texture", >- "GL_OES_compressed_ETC2_RGBA8_texture", >- "GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture", >- "GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture", >- "GL_OES_compressed_ETC2_sRGB8_alpha8_texture", >- "GL_OES_compressed_ETC2_sRGB8_texture", >- "GL_OES_depth24", >- "GL_OES_depth32", >- "GL_OES_depth_texture", >- "GL_OES_depth_texture_cube_map", >- "GL_OES_draw_buffers_indexed", >- "GL_OES_draw_elements_base_vertex", >- "GL_OES_element_index_uint", >- "GL_OES_fbo_render_mipmap", >- "GL_OES_geometry_shader", >- "GL_OES_get_program_binary", >- "GL_OES_mapbuffer", >- "GL_OES_packed_depth_stencil", >- "GL_OES_rgb8_rgba8", >- "GL_OES_sample_shading", >- "GL_OES_sample_variables", >- "GL_OES_shader_image_atomic", >- "GL_OES_shader_io_blocks", >- "GL_OES_shader_multisample_interpolation", >- "GL_OES_standard_derivatives", >- "GL_OES_surfaceless_context", >- "GL_OES_texture_3D", >- "GL_OES_texture_border_clamp", >- "GL_OES_texture_buffer", >- "GL_OES_texture_cube_map_array", >- "GL_OES_texture_float", >- "GL_OES_texture_float_linear", >- "GL_OES_texture_half_float", >- "GL_OES_texture_half_float_linear", >- "GL_OES_texture_npot", >- "GL_OES_texture_stencil8", >- "GL_OES_texture_storage_multisample_2d_array", >- "GL_OES_vertex_array_object", >- "GL_OES_vertex_half_float", >- "GL_OES_vertex_type_10_10_10_2", >- "GL_OVR_multiview", >- "GL_OVR_multiview2" >- ], >- "DateRecorded": "October 1, 2021" >-} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/pixel_4_android_11.json b/Source/ThirdParty/ANGLE/scripts/extension_data/pixel_4_android_11.json >index cf73aee0e2adbfe2f56f59828889fa9bc47ed944..bfc04aa61e9be56163225f4160e30ecf108e400a 100644 >--- a/Source/ThirdParty/ANGLE/scripts/extension_data/pixel_4_android_11.json >+++ b/Source/ThirdParty/ANGLE/scripts/extension_data/pixel_4_android_11.json >@@ -1,8 +1,8 @@ > { > "Vendor": "Google Inc. (Qualcomm)", >- "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >+ "Version": "OpenGL ES 3.2.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Renderer": "ANGLE (Qualcomm, Vulkan 1.1.128 (Adreno (TM) 640 (0x06040001)), Qualcomm Technologies Inc. Adreno Vulkan Driver-512.490.0)", >- "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.16847 git hash: a097ee2ea7a9)", >+ "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.20 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Extensions": [ > "GL_ANGLE_base_vertex_base_instance", > "GL_ANGLE_base_vertex_base_instance_shader_builtin", >@@ -22,7 +22,11 @@ > "GL_ANGLE_program_cache_control", > "GL_ANGLE_relaxed_vertex_attribute_type", > "GL_ANGLE_request_extension", >+ "GL_ANGLE_rgbx_internal_format", > "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_robust_fragment_shader_output", >+ "GL_ANGLE_texture_usage", >+ "GL_ANGLE_vulkan_image", > "GL_ANGLE_yuv_internal_format", > "GL_APPLE_clip_distance", > "GL_CHROMIUM_bind_generates_resource", >@@ -56,6 +60,7 @@ > "GL_EXT_map_buffer_range", > "GL_EXT_memory_object", > "GL_EXT_memory_object_fd", >+ "GL_EXT_multi_draw_indirect", > "GL_EXT_multisampled_render_to_texture", > "GL_EXT_multisampled_render_to_texture2", > "GL_EXT_occlusion_query_boolean", >@@ -143,5 +148,5 @@ > "GL_OVR_multiview", > "GL_OVR_multiview2" > ], >- "DateRecorded": "October 1, 2021" >+ "DateRecorded": "December 28, 2021" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/swiftshader_linux.json b/Source/ThirdParty/ANGLE/scripts/extension_data/swiftshader_linux.json >new file mode 100644 >index 0000000000000000000000000000000000000000..2f3cc00d3e2c5d2a07b3d2568936cfe84ea6e0fe >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/scripts/extension_data/swiftshader_linux.json >@@ -0,0 +1,154 @@ >+{ >+ "Vendor": "Google Inc. (Google)", >+ "Version": "OpenGL ES 3.1.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", >+ "Renderer": "ANGLE (Google, Vulkan 1.2.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver-5.0.0)", >+ "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.10 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", >+ "Extensions": [ >+ "GL_ANGLE_base_vertex_base_instance", >+ "GL_ANGLE_base_vertex_base_instance_shader_builtin", >+ "GL_ANGLE_client_arrays", >+ "GL_ANGLE_compressed_texture_etc", >+ "GL_ANGLE_copy_texture_3d", >+ "GL_ANGLE_depth_texture", >+ "GL_ANGLE_framebuffer_blit", >+ "GL_ANGLE_framebuffer_multisample", >+ "GL_ANGLE_get_image", >+ "GL_ANGLE_get_serialized_context_string", >+ "GL_ANGLE_get_tex_level_parameter", >+ "GL_ANGLE_instanced_arrays", >+ "GL_ANGLE_memory_object_flags", >+ "GL_ANGLE_memory_size", >+ "GL_ANGLE_multi_draw", >+ "GL_ANGLE_program_cache_control", >+ "GL_ANGLE_relaxed_vertex_attribute_type", >+ "GL_ANGLE_request_extension", >+ "GL_ANGLE_rgbx_internal_format", >+ "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_robust_fragment_shader_output", >+ "GL_ANGLE_texture_compression_dxt3", >+ "GL_ANGLE_texture_compression_dxt5", >+ "GL_ANGLE_texture_usage", >+ "GL_ANGLE_vulkan_image", >+ "GL_ANGLE_yuv_internal_format", >+ "GL_APPLE_clip_distance", >+ "GL_CHROMIUM_bind_generates_resource", >+ "GL_CHROMIUM_bind_uniform_location", >+ "GL_CHROMIUM_copy_compressed_texture", >+ "GL_CHROMIUM_copy_texture", >+ "GL_CHROMIUM_lose_context", >+ "GL_CHROMIUM_texture_filtering_hint", >+ "GL_EXT_EGL_image_array", >+ "GL_EXT_EGL_image_external_wrap_modes", >+ "GL_EXT_blend_minmax", >+ "GL_EXT_buffer_storage", >+ "GL_EXT_clip_control", >+ "GL_EXT_clip_cull_distance", >+ "GL_EXT_color_buffer_float", >+ "GL_EXT_color_buffer_half_float", >+ "GL_EXT_compressed_ETC1_RGB8_sub_texture", >+ "GL_EXT_copy_image", >+ "GL_EXT_debug_label", >+ "GL_EXT_debug_marker", >+ "GL_EXT_discard_framebuffer", >+ "GL_EXT_disjoint_timer_query", >+ "GL_EXT_draw_buffers", >+ "GL_EXT_draw_buffers_indexed", >+ "GL_EXT_draw_elements_base_vertex", >+ "GL_EXT_float_blend", >+ "GL_EXT_frag_depth", >+ "GL_EXT_instanced_arrays", >+ "GL_EXT_map_buffer_range", >+ "GL_EXT_memory_object", >+ "GL_EXT_memory_object_fd", >+ "GL_EXT_multi_draw_indirect", >+ "GL_EXT_occlusion_query_boolean", >+ "GL_EXT_primitive_bounding_box", >+ "GL_EXT_read_format_bgra", >+ "GL_EXT_sRGB", >+ "GL_EXT_sRGB_write_control", >+ "GL_EXT_semaphore", >+ "GL_EXT_semaphore_fd", >+ "GL_EXT_separate_shader_objects", >+ "GL_EXT_shader_framebuffer_fetch_non_coherent", >+ "GL_EXT_shader_io_blocks", >+ "GL_EXT_shader_non_constant_global_initializers", >+ "GL_EXT_shader_texture_lod", >+ "GL_EXT_shadow_samplers", >+ "GL_EXT_texture_buffer", >+ "GL_EXT_texture_compression_bptc", >+ "GL_EXT_texture_compression_dxt1", >+ "GL_EXT_texture_compression_rgtc", >+ "GL_EXT_texture_compression_s3tc_srgb", >+ "GL_EXT_texture_cube_map_array", >+ "GL_EXT_texture_filter_anisotropic", >+ "GL_EXT_texture_format_BGRA8888", >+ "GL_EXT_texture_rg", >+ "GL_EXT_texture_sRGB_R8", >+ "GL_EXT_texture_sRGB_RG8", >+ "GL_EXT_texture_sRGB_decode", >+ "GL_EXT_texture_storage", >+ "GL_EXT_texture_type_2_10_10_10_REV", >+ "GL_EXT_unpack_subimage", >+ "GL_KHR_debug", >+ "GL_KHR_parallel_shader_compile", >+ "GL_KHR_texture_compression_astc_ldr", >+ "GL_NV_depth_buffer_float2", >+ "GL_NV_fence", >+ "GL_NV_framebuffer_blit", >+ "GL_NV_pack_subimage", >+ "GL_NV_pixel_buffer_object", >+ "GL_NV_read_depth", >+ "GL_NV_read_stencil", >+ "GL_NV_shader_noperspective_interpolation", >+ "GL_OES_EGL_image", >+ "GL_OES_EGL_image_external", >+ "GL_OES_EGL_image_external_essl3", >+ "GL_OES_EGL_sync", >+ "GL_OES_compressed_EAC_R11_signed_texture", >+ "GL_OES_compressed_EAC_R11_unsigned_texture", >+ "GL_OES_compressed_EAC_RG11_signed_texture", >+ "GL_OES_compressed_EAC_RG11_unsigned_texture", >+ "GL_OES_compressed_ETC1_RGB8_texture", >+ "GL_OES_compressed_ETC2_RGB8_texture", >+ "GL_OES_compressed_ETC2_RGBA8_texture", >+ "GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture", >+ "GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture", >+ "GL_OES_compressed_ETC2_sRGB8_alpha8_texture", >+ "GL_OES_compressed_ETC2_sRGB8_texture", >+ "GL_OES_depth24", >+ "GL_OES_depth32", >+ "GL_OES_depth_texture", >+ "GL_OES_depth_texture_cube_map", >+ "GL_OES_draw_buffers_indexed", >+ "GL_OES_draw_elements_base_vertex", >+ "GL_OES_element_index_uint", >+ "GL_OES_fbo_render_mipmap", >+ "GL_OES_get_program_binary", >+ "GL_OES_mapbuffer", >+ "GL_OES_packed_depth_stencil", >+ "GL_OES_rgb8_rgba8", >+ "GL_OES_sample_shading", >+ "GL_OES_sample_variables", >+ "GL_OES_shader_image_atomic", >+ "GL_OES_shader_io_blocks", >+ "GL_OES_shader_multisample_interpolation", >+ "GL_OES_standard_derivatives", >+ "GL_OES_surfaceless_context", >+ "GL_OES_texture_3D", >+ "GL_OES_texture_buffer", >+ "GL_OES_texture_cube_map_array", >+ "GL_OES_texture_float", >+ "GL_OES_texture_float_linear", >+ "GL_OES_texture_half_float", >+ "GL_OES_texture_half_float_linear", >+ "GL_OES_texture_npot", >+ "GL_OES_texture_stencil8", >+ "GL_OES_texture_storage_multisample_2d_array", >+ "GL_OES_vertex_array_object", >+ "GL_OES_vertex_half_float", >+ "GL_OES_vertex_type_10_10_10_2", >+ "GL_OVR_multiview", >+ "GL_OVR_multiview2" >+ ], >+ "DateRecorded": "December 28, 2021" >+} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/extension_data/swiftshader_win10.json b/Source/ThirdParty/ANGLE/scripts/extension_data/swiftshader_win10.json >index 8cd8746fc8405087ecb03fc3697e04fd63794a85..50fd85490212c6ec87de3b1eb7ebb37791a96d0c 100644 >--- a/Source/ThirdParty/ANGLE/scripts/extension_data/swiftshader_win10.json >+++ b/Source/ThirdParty/ANGLE/scripts/extension_data/swiftshader_win10.json >@@ -1,8 +1,8 @@ > { > "Vendor": "Google Inc. (Google)", >- "Version": "OpenGL ES 3.1.0 (ANGLE 2.1.16782 git hash: 368c0ce94472)", >+ "Version": "OpenGL ES 3.1.0 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Renderer": "ANGLE (Google, Vulkan 1.2.0 (SwiftShader Device (Subzero) (0x0000C0DE)), SwiftShader driver-5.0.0)", >- "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.10 (ANGLE 2.1.16782 git hash: 368c0ce94472)", >+ "ShaderLanguageVersion": "OpenGL ES GLSL ES 3.10 (ANGLE 2.1.17589 git hash: 6f1c39b52b4f)", > "Extensions": [ > "GL_ANGLE_base_vertex_base_instance", > "GL_ANGLE_base_vertex_base_instance_shader_builtin", >@@ -22,9 +22,13 @@ > "GL_ANGLE_program_cache_control", > "GL_ANGLE_relaxed_vertex_attribute_type", > "GL_ANGLE_request_extension", >+ "GL_ANGLE_rgbx_internal_format", > "GL_ANGLE_robust_client_memory", >+ "GL_ANGLE_robust_fragment_shader_output", > "GL_ANGLE_texture_compression_dxt3", > "GL_ANGLE_texture_compression_dxt5", >+ "GL_ANGLE_texture_usage", >+ "GL_ANGLE_vulkan_image", > "GL_ANGLE_yuv_internal_format", > "GL_APPLE_clip_distance", > "GL_CHROMIUM_bind_generates_resource", >@@ -55,12 +59,12 @@ > "GL_EXT_instanced_arrays", > "GL_EXT_map_buffer_range", > "GL_EXT_memory_object", >- "GL_EXT_multisampled_render_to_texture", >- "GL_EXT_multisampled_render_to_texture2", >+ "GL_EXT_multi_draw_indirect", > "GL_EXT_occlusion_query_boolean", > "GL_EXT_primitive_bounding_box", > "GL_EXT_read_format_bgra", > "GL_EXT_sRGB", >+ "GL_EXT_sRGB_write_control", > "GL_EXT_semaphore", > "GL_EXT_separate_shader_objects", > "GL_EXT_shader_framebuffer_fetch_non_coherent", >@@ -144,5 +148,5 @@ > "GL_OVR_multiview", > "GL_OVR_multiview2" > ], >- "DateRecorded": "September 23, 2021" >+ "DateRecorded": "December 28, 2021" > } >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/scripts/generate_entry_points.py b/Source/ThirdParty/ANGLE/scripts/generate_entry_points.py >index 2fded3e10c769404f0b128a1afc5081d76777f44..7bd564a3114f3fea29d1ddde2f66b79e8e0766ce 100755 >--- a/Source/ThirdParty/ANGLE/scripts/generate_entry_points.py >+++ b/Source/ThirdParty/ANGLE/scripts/generate_entry_points.py >@@ -224,7 +224,8 @@ TEMPLATE_GLES_ENTRY_POINT_WITH_RETURN = """\ > TEMPLATE_EGL_ENTRY_POINT_NO_RETURN = """\ > void EGLAPIENTRY EGL_{name}({params}) > {{ >- ANGLE_SCOPED_GLOBAL_LOCK(); >+ {preamble} >+ {entry_point_locks} > EGL_EVENT({name}, "{format_params}"{comma_if_needed}{pass_params}); > > Thread *thread = egl::GetCurrentThread(); >@@ -237,10 +238,18 @@ void EGLAPIENTRY EGL_{name}({params}) > }} > """ > >+TEMPLATE_EGL_ENTRY_POINT_NO_RETURN_CUSTOM = """\ >+void EGLAPIENTRY EGL_{name}({params}) >+{{ >+ {name}({internal_params}); >+}} >+""" >+ > TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN = """\ > {return_type} EGLAPIENTRY EGL_{name}({params}) > {{ >- ANGLE_SCOPED_GLOBAL_LOCK(); >+ {preamble} >+ {entry_point_locks} > EGL_EVENT({name}, "{format_params}"{comma_if_needed}{pass_params}); > > Thread *thread = egl::GetCurrentThread(); >@@ -253,6 +262,13 @@ TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN = """\ > }} > """ > >+TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN_CUSTOM = """\ >+{return_type} EGLAPIENTRY EGL_{name}({params}) >+{{ >+ return {name}({internal_params}); >+}} >+""" >+ > TEMPLATE_CL_ENTRY_POINT_NO_RETURN = """\ > void CL_API_CALL cl{name}({params}) > {{ >@@ -862,6 +878,7 @@ EGL_SOURCE_INCLUDES = """\ > #include "libANGLE/entry_points_utils.h" > #include "libANGLE/validationEGL_autogen.h" > #include "libGLESv2/egl_stubs_autogen.h" >+#include "libGLESv2/egl_ext_stubs_autogen.h" > #include "libGLESv2/global_state.h" > > using namespace egl; >@@ -1484,9 +1501,14 @@ def get_packed_enums(api, cmd_packed_gl_enums, cmd_name, packed_param_types, par > return result > > >-def get_def_template(api, return_type, has_errcode_ret): >+CUSTOM_EGL_ENTRY_POINTS = ["eglPrepareSwapBuffersANGLE"] >+ >+ >+def get_def_template(api, cmd_name, return_type, has_errcode_ret): > if return_type == "void": > if api == apis.EGL: >+ if cmd_name in CUSTOM_EGL_ENTRY_POINTS: >+ return TEMPLATE_EGL_ENTRY_POINT_NO_RETURN_CUSTOM > return TEMPLATE_EGL_ENTRY_POINT_NO_RETURN > elif api == apis.CL: > return TEMPLATE_CL_ENTRY_POINT_NO_RETURN >@@ -1496,6 +1518,8 @@ def get_def_template(api, return_type, has_errcode_ret): > return TEMPLATE_CL_ENTRY_POINT_WITH_RETURN_ERROR > else: > if api == apis.EGL: >+ if cmd_name in CUSTOM_EGL_ENTRY_POINTS: >+ return TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN_CUSTOM > return TEMPLATE_EGL_ENTRY_POINT_WITH_RETURN > elif api == apis.CL: > if has_errcode_ret: >@@ -1509,15 +1533,21 @@ def get_def_template(api, return_type, has_errcode_ret): > def format_entry_point_def(api, command_node, cmd_name, proto, params, cmd_packed_enums, > packed_param_types, ep_to_object): > packed_enums = get_packed_enums(api, cmd_packed_enums, cmd_name, packed_param_types, params) >- internal_params = [just_the_name_packed(param, packed_enums) for param in params] >+ if cmd_name in CUSTOM_EGL_ENTRY_POINTS: >+ internal_params = [just_the_name(param) for param in params] >+ else: >+ internal_params = [just_the_name_packed(param, packed_enums) for param in params] > if internal_params and internal_params[-1] == "errcode_ret": > internal_params.pop() > has_errcode_ret = True > else: > has_errcode_ret = False >+ > packed_gl_enum_conversions = [] >+ > for param in params: > name = just_the_name(param) >+ > if name in packed_enums: > internal_name = name + "Packed" > internal_type = packed_enums[name] >@@ -1568,10 +1598,14 @@ def format_entry_point_def(api, command_node, cmd_name, proto, params, cmd_packe > "event_comment": > event_comment, > "labeled_object": >- get_egl_entry_point_labeled_object(ep_to_object, cmd_name, params, packed_enums) >+ get_egl_entry_point_labeled_object(ep_to_object, cmd_name, params, packed_enums), >+ "entry_point_locks": >+ get_locks(api, cmd_name, params), >+ "preamble": >+ get_preamble(api, cmd_name, params) > } > >- template = get_def_template(api, return_type, has_errcode_ret) >+ template = get_def_template(api, cmd_name, return_type, has_errcode_ret) > return template.format(**format_params) > > >@@ -2489,6 +2523,63 @@ def get_egl_entry_point_labeled_object(ep_to_object, cmd_stripped, params, packe > return "Get%sIfValid(%s, %s)" % (category, display_param, found_param) > > >+LOCK_GLOBAL_SURFACE = "ANGLE_SCOPED_GLOBAL_SURFACE_LOCK();" >+LOCK_GLOBAL = "ANGLE_SCOPED_GLOBAL_LOCK();" >+ >+LOCK_ORDERING = { >+ LOCK_GLOBAL_SURFACE: 0, >+ LOCK_GLOBAL: 1, >+} >+ >+ >+def ordered_lock_statements(*locks): >+ return "".join(sorted(locks, key=lambda lock: LOCK_ORDERING[lock])) >+ >+ >+def get_locks(api, cmd_name, params): >+ >+ if api != apis.EGL: >+ return ordered_lock_statements(LOCK_GLOBAL) >+ >+ has_surface = False >+ >+ for param in params: >+ param_type = just_the_type(param) >+ if param_type == "EGLSurface": >+ has_surface = True >+ >+ if has_surface: >+ return ordered_lock_statements(LOCK_GLOBAL_SURFACE, LOCK_GLOBAL) >+ >+ return ordered_lock_statements(LOCK_GLOBAL) >+ >+ >+def get_prepare_swap_buffers_call(api, cmd_name, params): >+ if cmd_name not in [ >+ "eglSwapBuffers", "eglSwapBuffersWithDamageKHR", "eglSwapBuffersWithFrameTokenANGLE" >+ ]: >+ return "" >+ >+ passed_params = [None, None] >+ >+ for param in params: >+ param_type = just_the_type(param) >+ if param_type == "EGLDisplay": >+ passed_params[0] = param >+ if param_type == "EGLSurface": >+ passed_params[1] = param >+ >+ return "ANGLE_EGLBOOLEAN_TRY(PrepareSwapBuffersANGLE(%s));" % (", ".join( >+ [just_the_name(param) for param in passed_params])) >+ >+ >+def get_preamble(api, cmd_name, params): >+ preamble = "" >+ preamble += get_prepare_swap_buffers_call(api, cmd_name, params) >+ # TODO: others? >+ return preamble >+ >+ > def write_stubs_header(api, annotation, title, data_source, out_file, all_commands, commands, > cmd_packed_egl_enums, packed_param_types): > >@@ -2502,16 +2593,24 @@ def write_stubs_header(api, annotation, title, data_source, out_file, all_comman > continue > > proto_text = "".join(proto.itertext()) >- params = [] if api == apis.CL else ["Thread *thread"] >+ >+ if cmd_name in CUSTOM_EGL_ENTRY_POINTS: >+ params = [] >+ else: >+ params = [] if api == apis.CL else ["Thread *thread"] >+ > params += ["".join(param.itertext()) for param in command.findall('param')] > if params and just_the_name(params[-1]) == "errcode_ret": > params[-1] = "cl_int &errorCode" > return_type = proto_text[:-len(cmd_name)].strip() > >- internal_params = get_internal_params(api, cmd_name, params, cmd_packed_egl_enums, >- packed_param_types) >- >- stubs.append("%s %s(%s);" % (return_type, strip_api_prefix(cmd_name), internal_params)) >+ if cmd_name in CUSTOM_EGL_ENTRY_POINTS: >+ stubs.append("%s %s(%s);" % >+ (return_type, strip_api_prefix(cmd_name), ", ".join(params))) >+ else: >+ internal_params = get_internal_params(api, cmd_name, params, cmd_packed_egl_enums, >+ packed_param_types) >+ stubs.append("%s %s(%s);" % (return_type, strip_api_prefix(cmd_name), internal_params)) > > args = { > "annotation_lower": annotation.lower(), >diff --git a/Source/ThirdParty/ANGLE/scripts/registry_xml.py b/Source/ThirdParty/ANGLE/scripts/registry_xml.py >index be50e37732c2676f5c3e7d3f50f03f4d1eabac9b..6234e1992d989c94249420ae59c153b8b5cc989f 100644 >--- a/Source/ThirdParty/ANGLE/scripts/registry_xml.py >+++ b/Source/ThirdParty/ANGLE/scripts/registry_xml.py >@@ -110,6 +110,7 @@ gles_requestable_extensions = [ > "GL_EXT_semaphore", > "GL_EXT_semaphore_fd", > "GL_EXT_separate_shader_objects", >+ "GL_EXT_shader_framebuffer_fetch", > "GL_EXT_shader_framebuffer_fetch_non_coherent", > "GL_EXT_shader_io_blocks", > "GL_EXT_shader_non_constant_global_initializers", >@@ -219,6 +220,7 @@ angle_es_only_extensions = [ > ] > > gles_es_only_extensions = [ >+ "GL_ANDROID_extension_pack_es31a", > "GL_ANGLE_depth_texture", > "GL_ANGLE_translated_shader_source", > "GL_EXT_debug_label", >@@ -292,6 +294,7 @@ supported_egl_extensions = [ > "EGL_ANGLE_ggp_stream_descriptor", > "EGL_ANGLE_metal_create_context_ownership_identity", > "EGL_ANGLE_power_preference", >+ "EGL_ANGLE_prepare_swap_buffers", > "EGL_ANGLE_program_cache_control", > "EGL_ANGLE_query_surface_pointer", > "EGL_ANGLE_stream_producer_d3d_texture", >diff --git a/Source/ThirdParty/ANGLE/scripts/roll_chromium_deps.py b/Source/ThirdParty/ANGLE/scripts/roll_chromium_deps.py >index 06bb5930777779c97fd386a46c296f0b2b1169c7..1b4442c065c3266bcac8cd11cf18efe28290d674 100755 >--- a/Source/ThirdParty/ANGLE/scripts/roll_chromium_deps.py >+++ b/Source/ThirdParty/ANGLE/scripts/roll_chromium_deps.py >@@ -85,7 +85,8 @@ ANGLE_CHROMIUM_DEPS = [ > 'tools/protoc_wrapper', > 'tools/python', > 'tools/skia_goldctl/linux', >- 'tools/skia_goldctl/mac', >+ 'tools/skia_goldctl/mac_amd64', >+ 'tools/skia_goldctl/mac_arm64', > 'tools/skia_goldctl/win', > 'tools/valgrind', > ] >diff --git a/Source/ThirdParty/ANGLE/scripts/run_code_generation.py b/Source/ThirdParty/ANGLE/scripts/run_code_generation.py >index c0a9a13093b80e95a9e161724d2c2d17bec6c604..adc9bd9ebc3e89366a35f657b794a1c9354f57f3 100755 >--- a/Source/ThirdParty/ANGLE/scripts/run_code_generation.py >+++ b/Source/ThirdParty/ANGLE/scripts/run_code_generation.py >@@ -7,13 +7,13 @@ > # run_code_generation.py: > # Runs ANGLE format table and other script code generation scripts. > >+import argparse > import hashlib > import json > import os > import subprocess > import sys > import platform >-import argparse > > script_dir = sys.path[0] > root_dir = os.path.abspath(os.path.join(script_dir, '..')) >@@ -220,24 +220,22 @@ def main(): > '-v', > '--verify-no-dirty', > dest='verify_only', >- type=bool, >+ action='store_true', > help='verify hashes are not dirty') > parser.add_argument( >- '-g', '--generator', action='append', nargs='*', type=str, dest='specifiedGenerators'), >+ '-g', '--generator', action='append', nargs='*', type=str, dest='specified_generators'), > > args = parser.parse_args() >- filteredGenerators = args.specifiedGenerators[0] >- verify_only = args.verify_only >- ranGenerators = {} > >- if (filteredGenerators): >- ranGenerators = {k: v for k, v in generators.items() if k in filteredGenerators} >- else: >- ranGenerators = generators >+ ranGenerators = generators >+ runningSingleGenerator = False >+ if (args.specified_generators): >+ ranGenerators = {k: v for k, v in generators.items() if k in args.specified_generators[0]} >+ runningSingleGenerator = True > >- if (len(ranGenerators) == 0): >+ if len(ranGenerators) == 0: > print("No valid generators specified.") >- return -1 >+ return 1 > > for name, script in sorted(ranGenerators.items()): > info = auto_script(script) >@@ -249,7 +247,7 @@ def main(): > if any_hash_dirty(name, filenames, new_hashes, all_old_hashes[fname]): > any_dirty = True > >- if not verify_only: >+ if not args.verify_only: > print('Running ' + name + ' code generator') > > # Set the CWD to the script directory. >@@ -264,10 +262,10 @@ def main(): > # Update the hash dictionary. > all_new_hashes[fname] = new_hashes > >- if any_old_hash_missing(all_new_hashes, all_old_hashes): >+ if not runningSingleGenerator and any_old_hash_missing(all_new_hashes, all_old_hashes): > any_dirty = True > >- if verify_only: >+ if args.verify_only: > sys.exit(any_dirty) > > if any_dirty: >diff --git a/Source/ThirdParty/ANGLE/scripts/run_gtest_angle_test.py b/Source/ThirdParty/ANGLE/scripts/run_gtest_angle_test.py >index a69e359a7568e24c86eee70779a5ca097675a976..f0b062e2a334f301933347da8c7263d613e4af44 100755 >--- a/Source/ThirdParty/ANGLE/scripts/run_gtest_angle_test.py >+++ b/Source/ThirdParty/ANGLE/scripts/run_gtest_angle_test.py >@@ -1,4 +1,4 @@ >-#!/usr/bin/env python >+#!/usr/bin/env vpython3 > # Copyright 2020 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. >diff --git a/Source/ThirdParty/ANGLE/scripts/update_chrome_angle.py b/Source/ThirdParty/ANGLE/scripts/update_chrome_angle.py >index 5fc58e669a9f352409f184072cba523b0c4a0013..ac0a0456c854da6ea7cdb5cc57e12cc0569c3a39 100755 >--- a/Source/ThirdParty/ANGLE/scripts/update_chrome_angle.py >+++ b/Source/ThirdParty/ANGLE/scripts/update_chrome_angle.py >@@ -5,15 +5,15 @@ > # found in the LICENSE file. > # > # update_chrome_angle.py: >-# Helper script that copies ANGLE libraries into the Chromium Canary (on Windows) or Dev (on >-# Linux) installed directory. Testing ANGLE this way is much faster than compiling Chromium from >-# source. The script checks for the most recent build in a set of search paths, and copies that >-# into: >+# Helper script that copies ANGLE libraries into the Chromium Canary (on Windows and macOS) >+# or Dev (on Linux) installed directory. Testing ANGLE this way is much faster than compiling >+# Chromium from source. The script checks for the most recent build in a set of search paths, >+# and copies that into: > # > # - /opt/google/chrome-unstable on Linux > # - the most recent Canary installation folder on Windows. >+# - /Applications/Google\ Chrome\ Canary.app on macOS > # >-# Only works on Linux and Windows. > > import glob, sys, os, shutil > >@@ -24,6 +24,7 @@ os.chdir(os.path.join(script_dir, "..")) > source_paths = glob.glob('out/*') > > is_windows = sys.platform == 'cygwin' or sys.platform.startswith('win') >+is_macos = sys.platform == 'darwin' > > if is_windows: > # Default Canary installation path. >@@ -31,6 +32,11 @@ if is_windows: > libs_to_copy = ['libGLESv2.dll', 'libEGL.dll'] > optional_libs_to_copy = [] > >+elif is_macos: >+ chrome_folder = '/Applications/Google Chrome Canary.app/Contents/Frameworks/Google Chrome Framework.framework/Libraries' >+ libs_to_copy = ['libGLESv2.dylib', 'libEGL.dylib'] >+ optional_libs_to_copy = [] >+ > else: > # Must be Linux > chrome_folder = '/opt/google/chrome-unstable' >@@ -74,6 +80,9 @@ print('Copying binaries from ' + source_folder + ' to ' + dest_folder + '.') > > def copy_file(src, dst): > print(' - ' + src + ' --> ' + dst) >+ if is_macos: >+ # For the codesign to work, the original file must be removed >+ os.remove(dst) > shutil.copyfile(src, dst) > > >@@ -96,3 +105,9 @@ for filename in libs_to_copy: > do_copy(filename, False) > for filename in optional_libs_to_copy: > do_copy(filename, True) >+ >+if is_macos: >+ # Clear all attributes, codesign doesn't work otherwise >+ os.system('xattr -cr /Applications/Google\ Chrome\ Canary.app') >+ # Re-sign the bundle >+ os.system('codesign --force --sign - --deep /Applications/Google\ Chrome\ Canary.app') >diff --git a/Source/ThirdParty/ANGLE/scripts/update_extension_data.py b/Source/ThirdParty/ANGLE/scripts/update_extension_data.py >index 8b3c39e0783a44e4f103754f619b9a6f9e4e77eb..1aaf084a790c9cb7cf25d9d74da4a90a0a84c661 100644 >--- a/Source/ThirdParty/ANGLE/scripts/update_extension_data.py >+++ b/Source/ThirdParty/ANGLE/scripts/update_extension_data.py >@@ -21,7 +21,10 @@ EXIT_SUCCESS = 0 > EXIT_FAILURE = 1 > > TEST_SUITE = 'angle_end2end_tests' >-BUILDERS = ['angle/ci/android-arm64-rel', 'angle/ci/win-clang-x64-rel', 'angle/ci/linux-clang-rel'] >+BUILDERS = [ >+ 'angle/ci/android-arm64-test', 'angle/ci/linux-test', 'angle/ci/win-test', >+ 'angle/ci/win-x86-test' >+] > SWARMING_SERVER = 'chromium-swarm.appspot.com' > > d = os.path.dirname >@@ -29,10 +32,15 @@ THIS_DIR = d(os.path.abspath(__file__)) > ANGLE_ROOT_DIR = d(THIS_DIR) > > # Host GPUs >-INTEL_630 = '8086:5912' >-NVIDIA_P400 = '10de:1cb3' >-GPUS = [INTEL_630, NVIDIA_P400] >-GPU_NAME_MAP = {INTEL_630: 'intel_630', NVIDIA_P400: 'nvidia_p400'} >+INTEL_HD630 = '8086:5912' >+NVIDIA_GTX1660 = '10de:2184' >+SWIFTSHADER = 'none' >+GPUS = [INTEL_HD630, NVIDIA_GTX1660, SWIFTSHADER] >+GPU_NAME_MAP = { >+ INTEL_HD630: 'intel_630', >+ NVIDIA_GTX1660: 'nvidia_1660', >+ SWIFTSHADER: 'swiftshader' >+} > > # OSes > LINUX = 'Linux' >@@ -53,7 +61,7 @@ DEVICE_OS_NAME_MAP = {ANDROID_11: 'android_11'} > # Result names > INFO_FILES = [ > 'GLinfo_ES3_2_Vulkan.json', >- 'GLinfo_ES3_1_Vulkan.json', >+ 'GLinfo_ES3_1_Vulkan_SwiftShader.json', > ] > > LOG_LEVELS = ['WARNING', 'INFO', 'DEBUG'] >@@ -116,7 +124,11 @@ def get_props_string(gpu, bot_os, device_os, device_type): > return ', '.join('%s %s' % (k, v) for (k, v) in d.items() if v) > > >-def collect_task_and_update_json(task_id, gpu, bot_os, device_os, device_type): >+def collect_task_and_update_json(task_id, found_dims): >+ gpu = found_dims.get('gpu', None) >+ bot_os = found_dims.get('os', None) >+ device_os = found_dims.get('device_os', None) >+ device_type = found_dims.get('device_type', None) > logging.info('Found task with ID: %s, %s' % > (task_id, get_props_string(gpu, bot_os, device_os, device_type))) > target_file_name = '%s_%s.json' % (name_device(gpu, device_type), name_os(bot_os, device_os)) >@@ -176,26 +188,27 @@ def main(): > > # Step 4: Download the extension data for each configuration we're monitoring. > # 'swarming collect' downloads test artifacts to a temporary directory. >+ dim_map = { >+ 'gpu': GPUS, >+ 'os': BOT_OSES, >+ 'device_os': DEVICE_OSES, >+ 'device_type': DEVICES_TYPES, >+ } >+ > for task in task_json: >- gpu = None >- bot_os = None >- device_os = None >- device_type = None >+ found_dims = {} > for bot_dim in task['bot_dimensions']: >- if bot_dim['key'] == 'gpu': >- logging.debug(bot_dim['value']) >- gpu = get_intersect_or_none(GPUS, bot_dim['value']) >- if bot_dim['key'] == 'os': >- logging.debug(bot_dim['value']) >- bot_os = get_intersect_or_none(BOT_OSES, bot_dim['value']) >- if bot_dim['key'] == 'device_os': >- logging.debug(bot_dim['value']) >- device_os = get_intersect_or_none(DEVICE_OSES, bot_dim['value']) >- if bot_dim['key'] == 'device_type': >- logging.debug(bot_dim['value']) >- device_type = get_intersect_or_none(DEVICES_TYPES, bot_dim['value']) >- if (gpu or device_type) and (bot_os or device_os): >- collect_task_and_update_json(task['task_id'], gpu, bot_os, device_os, device_type) >+ key, value = bot_dim['key'], bot_dim['value'] >+ if key in dim_map: >+ logging.debug('%s=%s' % (key, value)) >+ mapped_values = dim_map[key] >+ found_dim = get_intersect_or_none(mapped_values, value) >+ if found_dim: >+ found_dims[key] = found_dim >+ found_gpu_or_device = ('gpu' in found_dims or 'device_type' in found_dims) >+ found_os = ('os' in found_dims or 'device_os' in found_dims) >+ if found_gpu_or_device and found_os: >+ collect_task_and_update_json(task['task_id'], found_dims) > > return EXIT_SUCCESS > >diff --git a/Source/ThirdParty/ANGLE/src/angle_commit.h b/Source/ThirdParty/ANGLE/src/angle_commit.h >index b8be50de521f05833ee106a0fd4383093772471c..11c827080b8f422aeecc77bdf47a620cf332f442 100644 >--- a/Source/ThirdParty/ANGLE/src/angle_commit.h >+++ b/Source/ThirdParty/ANGLE/src/angle_commit.h >@@ -1,4 +1,4 @@ >-#define ANGLE_COMMIT_HASH "aabfe8747deb" >+#define ANGLE_COMMIT_HASH "c4a9d4169692" > #define ANGLE_COMMIT_HASH_SIZE 12 >-#define ANGLE_COMMIT_DATE "2021-12-20 17:05:22 +0000" >-#define ANGLE_COMMIT_POSITION 17555 >+#define ANGLE_COMMIT_DATE "2022-01-28 00:47:50 +0000" >+#define ANGLE_COMMIT_POSITION 17807 >diff --git a/Source/ThirdParty/ANGLE/src/common/android_util.cpp b/Source/ThirdParty/ANGLE/src/common/android_util.cpp >index 5b4f3568fb6bcb70cdbe1f5f656c8383e6000b32..26b026e22ba11d149c4b2e1e6f6aaf466acc3fea 100644 >--- a/Source/ThirdParty/ANGLE/src/common/android_util.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/android_util.cpp >@@ -193,6 +193,8 @@ enum { > AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 = 0x23, > > #endif // ANGLE_AHARDWARE_BUFFER_SUPPORT >+ >+ AHARDWAREBUFFER_FORMAT_YV12 = 0x32315659 > }; > // clang-format on > >@@ -257,6 +259,7 @@ GLenum getPixelFormatInfo(int pixelFormat, bool *isYUV) > case AHARDWAREBUFFER_FORMAT_S8_UINT: > return GL_STENCIL_INDEX8; > case AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420: >+ case AHARDWAREBUFFER_FORMAT_YV12: > *isYUV = true; > return GL_RGB8; > default: >diff --git a/Source/ThirdParty/ANGLE/src/common/angleutils.h b/Source/ThirdParty/ANGLE/src/common/angleutils.h >index 2a5ea27f6e4e8bd7b3501c36b0e9bf8b64f1931b..0501ff0781635184e723d636430553a948da416a 100644 >--- a/Source/ThirdParty/ANGLE/src/common/angleutils.h >+++ b/Source/ThirdParty/ANGLE/src/common/angleutils.h >@@ -24,6 +24,7 @@ > #include <cstdarg> > #include <cstddef> > #include <fstream> >+#include <mutex> > #include <set> > #include <sstream> > #include <string> >@@ -236,6 +237,32 @@ inline bool IsLittleEndian() > return isLittleEndian; > } > >+// Helper class to use a mutex with the control of boolean. >+class ConditionalMutex final : angle::NonCopyable >+{ >+ public: >+ ConditionalMutex() : mUseMutex(true) {} >+ void init(bool useMutex) { mUseMutex = useMutex; } >+ void lock() >+ { >+ if (mUseMutex) >+ { >+ mMutex.lock(); >+ } >+ } >+ void unlock() >+ { >+ if (mUseMutex) >+ { >+ mMutex.unlock(); >+ } >+ } >+ >+ private: >+ std::mutex mMutex; >+ bool mUseMutex; >+}; >+ > // snprintf is not defined with MSVC prior to to msvc14 > #if defined(_MSC_VER) && _MSC_VER < 1900 > # define snprintf _snprintf >@@ -393,7 +420,7 @@ inline bool IsLittleEndian() > # define ANGLE_FORMAT_PRINTF(fmt, args) > #endif > >-ANGLE_FORMAT_PRINTF(1,0) >+ANGLE_FORMAT_PRINTF(1, 0) > size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char> &buffer); > > // Format messes up the # inside the macro. >@@ -446,6 +473,15 @@ inline bool IsASan() > #endif // defined(ANGLE_WITH_ASAN) > } > >+inline bool IsMSan() >+{ >+#if defined(ANGLE_WITH_MSAN) >+ return true; >+#else >+ return false; >+#endif // defined(ANGLE_WITH_MSAN) >+} >+ > inline bool IsTSan() > { > #if defined(ANGLE_WITH_TSAN) >diff --git a/Source/ThirdParty/ANGLE/src/common/bitset_utils.h b/Source/ThirdParty/ANGLE/src/common/bitset_utils.h >index 79f77c63288f2a6af5e5a99fb63e1703e09b432b..c1e7d279ab7b278c36389958d8a94c13630168b6 100644 >--- a/Source/ThirdParty/ANGLE/src/common/bitset_utils.h >+++ b/Source/ThirdParty/ANGLE/src/common/bitset_utils.h >@@ -185,8 +185,9 @@ constexpr BitSetT<N, BitsT, ParamT>::BitSetT(std::initializer_list<ParamT> init) > { > for (ParamT element : init) > { >- mBits |= Bit<BitsT>(element) & Mask(N); >+ mBits |= Bit<BitsT>(element); > } >+ ASSERT(mBits == (mBits & Mask(N))); > } > > template <size_t N, typename BitsT, typename ParamT> >@@ -288,14 +289,16 @@ constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator&=(BitsT > template <size_t N, typename BitsT, typename ParamT> > constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator|=(BitsT value) > { >- mBits |= value & Mask(N); >+ mBits |= value; >+ ASSERT(mBits == (mBits & Mask(N))); > return *this; > } > > template <size_t N, typename BitsT, typename ParamT> > constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator^=(BitsT value) > { >- mBits ^= value & Mask(N); >+ mBits ^= value; >+ ASSERT(mBits == (mBits & Mask(N))); > return *this; > } > >@@ -308,7 +311,7 @@ constexpr BitSetT<N, BitsT, ParamT> BitSetT<N, BitsT, ParamT>::operator<<(std::s > template <size_t N, typename BitsT, typename ParamT> > constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator<<=(std::size_t pos) > { >- mBits = (mBits << pos & Mask(N)); >+ mBits = mBits << pos & Mask(N); > return *this; > } > >@@ -321,7 +324,7 @@ constexpr BitSetT<N, BitsT, ParamT> BitSetT<N, BitsT, ParamT>::operator>>(std::s > template <size_t N, typename BitsT, typename ParamT> > constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator>>=(std::size_t pos) > { >- mBits = ((mBits >> pos) & Mask(N)); >+ mBits = (mBits >> pos) & Mask(N); > return *this; > } > >@@ -336,15 +339,16 @@ constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set() > template <size_t N, typename BitsT, typename ParamT> > constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set(ParamT pos, bool value) > { >- ASSERT(mBits == (mBits & Mask(N))); >+ ASSERT(static_cast<size_t>(pos) < N); > if (value) > { >- mBits |= Bit<BitsT>(pos) & Mask(N); >+ mBits |= Bit<BitsT>(pos); > } > else > { > reset(pos); > } >+ ASSERT(mBits == (mBits & Mask(N))); > return *this; > } > >@@ -359,6 +363,7 @@ constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset() > template <size_t N, typename BitsT, typename ParamT> > constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::reset(ParamT pos) > { >+ ASSERT(static_cast<size_t>(pos) < N); > ASSERT(mBits == (mBits & Mask(N))); > mBits &= ~Bit<BitsT>(pos); > return *this; >@@ -375,8 +380,9 @@ constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip() > template <size_t N, typename BitsT, typename ParamT> > constexpr BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip(ParamT pos) > { >+ ASSERT(static_cast<size_t>(pos) < N); >+ mBits ^= Bit<BitsT>(pos); > ASSERT(mBits == (mBits & Mask(N))); >- mBits ^= Bit<BitsT>(pos) & Mask(N); > return *this; > } > >diff --git a/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp b/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp >index 23160177c9095c4ecb12f8efb2b8e2c1edd56744..24b0794c26b0f3ed6fe20ddf1ef3ab70dc7aa3af 100644 >--- a/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/bitset_utils_unittest.cpp >@@ -98,23 +98,15 @@ TYPED_TEST(BitSetTest, Basic) > 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); > } > > TYPED_TEST(BitSetTest, BitwiseOperators) > { > TypeParam mBits = this->mBits; >- // 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; >+ // Use a value that has a 1 in the 12th bit, to make sure masking to exactly 12 bits does not >+ // have an off-by-one error. >+ constexpr uint32_t kSelfValue = 0x9E4; >+ constexpr uint32_t kOtherValue = 0xC6A; > > constexpr uint32_t kMask = (1 << 12) - 1; > constexpr uint32_t kSelfMaskedValue = kSelfValue & kMask; >diff --git a/Source/ThirdParty/ANGLE/src/common/debug.cpp b/Source/ThirdParty/ANGLE/src/common/debug.cpp >index f16c96bdf583a28b011b926272c21fdf93ba2667..1114dd5a4e8fa1a094d535828806b4b20fc4170a 100644 >--- a/Source/ThirdParty/ANGLE/src/common/debug.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/debug.cpp >@@ -333,14 +333,14 @@ std::string LogMessage::getMessage() const > } > > #if defined(ANGLE_PLATFORM_WINDOWS) >-priv::FmtHexHelper<HRESULT> FmtHR(HRESULT value) >+priv::FmtHexHelper<HRESULT, char> FmtHR(HRESULT value) > { >- return priv::FmtHexHelper<HRESULT>("HRESULT: ", value); >+ return priv::FmtHexHelper<HRESULT, char>("HRESULT: ", value); > } > >-priv::FmtHexHelper<DWORD> FmtErr(DWORD value) >+priv::FmtHexHelper<DWORD, char> FmtErr(DWORD value) > { >- return priv::FmtHexHelper<DWORD>("error: ", value); >+ return priv::FmtHexHelper<DWORD, char>("error: ", value); > } > #endif // defined(ANGLE_PLATFORM_WINDOWS) > >diff --git a/Source/ThirdParty/ANGLE/src/common/debug.h b/Source/ThirdParty/ANGLE/src/common/debug.h >index 326021e3337c8bbd6bd950f3afea7d5abba3209d..133de73522e5811966c64032a43a7f97b382289b 100644 >--- a/Source/ThirdParty/ANGLE/src/common/debug.h >+++ b/Source/ThirdParty/ANGLE/src/common/debug.h >@@ -37,7 +37,7 @@ namespace gl > { > class Context; > >-// Pairs a D3D begin event with an end event. >+// Pairs a begin event with an end event. > class ScopedPerfEventHelper : angle::NonCopyable > { > public: >@@ -141,69 +141,80 @@ extern std::ostream *gSwallowStream; > // Used by ANGLE_LOG_IS_ON to lazy-evaluate stream arguments. > bool ShouldCreatePlatformLogMessage(LogSeverity severity); > >-template <int N, typename T> >-std::ostream &FmtHex(std::ostream &os, T value) >+// N is the width of the output to the stream. The output is padded with zeros >+// if value is less than N characters. >+// S is the stream type, either ostream for ANSI or wostream for wide character. >+// T is the type of the value to output to the stream. >+// C is the type of characters - either char for ANSI or wchar_t for wide char. >+template <int N, typename S, typename T, typename C> >+S &FmtHex(S &stream, T value, const C *zeroX, C zero) > { >- os << "0x"; >+ stream << zeroX; > >- std::ios_base::fmtflags oldFlags = os.flags(); >- std::streamsize oldWidth = os.width(); >- std::ostream::char_type oldFill = os.fill(); >+ std::ios_base::fmtflags oldFlags = stream.flags(); >+ std::streamsize oldWidth = stream.width(); >+ typename S::char_type oldFill = stream.fill(); > >- os << std::hex << std::uppercase << std::setw(N) << std::setfill('0') << value; >+ stream << std::hex << std::uppercase << std::setw(N) << std::setfill(zero) << value; > >- os.flags(oldFlags); >- os.width(oldWidth); >- os.fill(oldFill); >+ stream.flags(oldFlags); >+ stream.width(oldWidth); >+ stream.fill(oldFill); > >- return os; >+ return stream; > } > >-template <typename T> >-std::ostream &FmtHexAutoSized(std::ostream &os, T value) >+template <typename S, typename T, typename C> >+S &FmtHexAutoSized(S &stream, T value, const C *prefix, const C *zeroX, C zero) > { >+ if (prefix) >+ { >+ stream << prefix; >+ } >+ > constexpr int N = sizeof(T) * 2; >- return priv::FmtHex<N>(os, value); >+ return priv::FmtHex<N>(stream, value, zeroX, zero); > } > >-template <typename T> >+template <typename T, typename C> > class FmtHexHelper > { > public: >- FmtHexHelper(const char *prefix, T value) : mPrefix(prefix), mValue(value) {} >+ FmtHexHelper(const C *prefix, T value) : mPrefix(prefix), mValue(value) {} > explicit FmtHexHelper(T value) : mPrefix(nullptr), mValue(value) {} > > private: >- const char *mPrefix; >+ const C *mPrefix; > T mValue; > > friend std::ostream &operator<<(std::ostream &os, const FmtHexHelper &fmt) > { >- if (fmt.mPrefix) >- { >- os << fmt.mPrefix; >- } >- return FmtHexAutoSized(os, fmt.mValue); >+ return FmtHexAutoSized(os, fmt.mValue, fmt.mPrefix, "0x", '0'); >+ } >+ >+ friend std::wostream &operator<<(std::wostream &wos, const FmtHexHelper &fmt) >+ { >+ return FmtHexAutoSized(wos, fmt.mValue, fmt.mPrefix, L"0x", L'0'); > } > }; > > } // namespace priv > >-template <typename T> >-priv::FmtHexHelper<T> FmtHex(T value) >+template <typename T, typename C = char> >+priv::FmtHexHelper<T, C> FmtHex(T value) > { >- return priv::FmtHexHelper<T>(value); >+ return priv::FmtHexHelper<T, C>(value); > } > > #if defined(ANGLE_PLATFORM_WINDOWS) >-priv::FmtHexHelper<HRESULT> FmtHR(HRESULT value); >-priv::FmtHexHelper<DWORD> FmtErr(DWORD value); >+priv::FmtHexHelper<HRESULT, char> FmtHR(HRESULT value); >+priv::FmtHexHelper<DWORD, char> FmtErr(DWORD value); > #endif // defined(ANGLE_PLATFORM_WINDOWS) > > template <typename T> > std::ostream &FmtHex(std::ostream &os, T value) > { >- return priv::FmtHexAutoSized(os, value); >+ return priv::FmtHexAutoSized(os, value, "", "0x", '0'); > } > > // A few definitions of macros that don't generate much code. These are used >diff --git a/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.cpp b/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.cpp >index 9fff2c6df51a937fccc22750a0f338440cc4e0d2..0e95ad79ca97fc38c58427808f9d3455b14935fb 100644 >--- a/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.cpp >@@ -366,6 +366,8 @@ const char *GetEntryPointName(EntryPoint ep) > return "eglMakeCurrent"; > case EntryPoint::EGLPostSubBufferNV: > return "eglPostSubBufferNV"; >+ case EntryPoint::EGLPrepareSwapBuffersANGLE: >+ return "eglPrepareSwapBuffersANGLE"; > case EntryPoint::EGLPresentationTimeANDROID: > return "eglPresentationTimeANDROID"; > case EntryPoint::EGLProgramCacheGetAttribANGLE: >diff --git a/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.h b/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.h >index 53fd518483a0455859442e2e66b52e4eb4d1fb0f..dd1480c847f278667e7951e6140bacd6b305bd24 100644 >--- a/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/common/entry_points_enum_autogen.h >@@ -189,6 +189,7 @@ enum class EntryPoint > EGLLockSurfaceKHR, > EGLMakeCurrent, > EGLPostSubBufferNV, >+ EGLPrepareSwapBuffersANGLE, > EGLPresentationTimeANDROID, > EGLProgramCacheGetAttribANGLE, > EGLProgramCachePopulateANGLE, >diff --git a/Source/ThirdParty/ANGLE/src/common/platform.h b/Source/ThirdParty/ANGLE/src/common/platform.h >index ec60c1537543ac218da35a4f23ac1091c5ae08a4..c39c7e0405cdea9e348dc0498884c846e2a239ff 100644 >--- a/Source/ThirdParty/ANGLE/src/common/platform.h >+++ b/Source/ThirdParty/ANGLE/src/common/platform.h >@@ -168,6 +168,13 @@ > # endif > #endif > >+// Define ANGLE_WITH_MSAN macro. >+#if defined(__has_feature) >+# if __has_feature(memory_sanitizer) >+# define ANGLE_WITH_MSAN 1 >+# endif >+#endif >+ > // Define ANGLE_WITH_TSAN macro. > #if defined(__has_feature) > # if __has_feature(thread_sanitizer) >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils.cpp >index 6f0692041624576d6ea153134529402b79bc5a02..08f8ba9aa1f234194878139ee06959ea9c600600 100644 >--- a/Source/ThirdParty/ANGLE/src/common/system_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils.cpp >@@ -47,8 +47,8 @@ std::string GetEnvironmentVarOrAndroidProperty(const char *variableName, const c > return GetEnvironmentVarOrUnCachedAndroidProperty(variableName, propertyName); > } > >-// Call out to 'getprop' on a shell to get an Android property. If the value was set, set an >-// environment variable with that value. Return the value of the environment variable. >+// On Android call out to 'getprop' on a shell to get an Android property. On desktop, return >+// the value of the environment variable. > std::string GetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName, > const char *propertyName) > { >@@ -67,8 +67,6 @@ std::string GetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName, > &propertyValue); > } > >- // Set the environment variable with the value. >- SetEnvironmentVar(variableName, propertyValue.c_str()); > return propertyValue; > #else > // Return the environment variable's value. >@@ -76,6 +74,26 @@ std::string GetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName, > #endif // ANGLE_PLATFORM_ANDROID > } > >+// Look up a property and add it to the application's environment. >+// Adding to the env is a performance optimization, as getting properties is expensive. >+// This should only be used in non-Release paths, i.e. when using FrameCapture or DebugUtils. >+// It can cause race conditions in stress testing. See http://anglebug.com/6822 >+std::string GetAndSetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName, >+ const char *propertyName) >+{ >+ std::string value = GetEnvironmentVarOrUnCachedAndroidProperty(variableName, propertyName); >+ >+#if defined(ANGLE_PLATFORM_ANDROID) >+ if (!value.empty()) >+ { >+ // Set the environment variable with the value to improve future lookups (avoids >+ SetEnvironmentVar(variableName, value.c_str()); >+ } >+#endif >+ >+ return value; >+} >+ > bool GetBoolEnvironmentVar(const char *variableName) > { > std::string envVarString = GetEnvironmentVar(variableName); >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils.h b/Source/ThirdParty/ANGLE/src/common/system_utils.h >index 7bfaec7514cb7f8ff6240b923c8dacf892dbc645..ea0fab1bc7e84d7e31a8235a9ecd495c7beb9df2 100644 >--- a/Source/ThirdParty/ANGLE/src/common/system_utils.h >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils.h >@@ -32,6 +32,8 @@ bool GetBoolEnvironmentVar(const char *variableName); > std::string GetEnvironmentVar(const char *variableName); > std::string GetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName, > const char *propertyName); >+std::string GetAndSetEnvironmentVarOrUnCachedAndroidProperty(const char *variableName, >+ const char *propertyName); > std::string GetEnvironmentVarOrAndroidProperty(const char *variableName, const char *propertyName); > const char *GetPathSeparatorForEnvironmentVar(); > bool PrependPathToEnvironmentVar(const char *variableName, const char *path); >diff --git a/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp b/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp >index feb944518997ebc6d7ae47457e31eadf245d3400..36b712e7cec96b18201934171cda891920357d87 100644 >--- a/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/system_utils_posix.cpp >@@ -83,7 +83,7 @@ const char *GetPathSeparatorForEnvironmentVar() > return ":"; > } > >-std::string GetModuleDirectory() >+std::string GetModuleDirectoryAndGetError(std::string *errorOut) > { > std::string directory; > static int placeholderSymbol = 0; >@@ -94,14 +94,38 @@ std::string GetModuleDirectory() > } > > // Ensure we return the full path to the module, not the relative path >- Optional<std::string> cwd = GetCWD(); >- if (cwd.valid() && !IsFullPath(directory)) >+ if (!IsFullPath(directory)) > { >- directory = ConcatenatePath(cwd.value(), directory); >+ if (errorOut) >+ { >+ *errorOut += "Directory: '"; >+ *errorOut += directory; >+ *errorOut += "' is not full path"; >+ } >+ Optional<std::string> cwd = GetCWD(); >+ if (cwd.valid()) >+ { >+ directory = ConcatenatePath(cwd.value(), directory); >+ if (errorOut) >+ { >+ *errorOut += ", so it has been modified to: '"; >+ *errorOut += directory; >+ *errorOut += "'. "; >+ } >+ } >+ else if (errorOut) >+ { >+ *errorOut += " and getcwd was invalid. "; >+ } > } > return directory; > } > >+std::string GetModuleDirectory() >+{ >+ return GetModuleDirectoryAndGetError(nullptr); >+} >+ > class PosixLibrary : public Library > { > public: >@@ -217,7 +241,7 @@ Library *OpenSharedLibraryWithExtensionAndGetError(const char *libraryName, > // On iOS, shared libraries must be loaded from within the app bundle. > directory = GetExecutableDirectory() + "/Frameworks/"; > #else >- directory = GetModuleDirectory(); >+ directory = GetModuleDirectoryAndGetError(errorOut); > #endif > } > >diff --git a/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.cpp b/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.cpp >index b896a1f05ab8c772f951c126de9c75cbd0f4ba3e..88dbd06065f74f7147f76ab94d2b4dace7bb2801 100644 >--- a/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.cpp >+++ b/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.cpp >@@ -60,6 +60,7 @@ ANGLE_MAYBE_UNUSED constexpr char kLayerEnablesEnv[] = "VK_LAYER_ENABLES"; > constexpr char kLoaderICDFilenamesEnv[] = "VK_ICD_FILENAMES"; > constexpr char kANGLEPreferredDeviceEnv[] = "ANGLE_PREFERRED_DEVICE"; > constexpr char kValidationLayersCustomSTypeListEnv[] = "VK_LAYER_CUSTOM_STYPE_LIST"; >+constexpr char kNoDeviceSelect[] = "NODEVICE_SELECT"; > > constexpr uint32_t kMockVendorID = 0xba5eba11; > constexpr uint32_t kMockDeviceID = 0xf005ba11; >@@ -106,7 +107,8 @@ ScopedVkLoaderEnvironment::ScopedVkLoaderEnvironment(bool enableValidationLayers > : mEnableValidationLayers(enableValidationLayers), > mICD(icd), > mChangedCWD(false), >- mChangedICDEnv(false) >+ mChangedICDEnv(false), >+ mChangedNoDeviceSelect(false) > { > // Changing CWD and setting environment variables makes no sense on Android, > // since this code is a part of Java application there. >@@ -129,6 +131,7 @@ ScopedVkLoaderEnvironment::ScopedVkLoaderEnvironment(bool enableValidationLayers > } > # endif // defined(ANGLE_VK_SWIFTSHADER_ICD_JSON) > >+# if !defined(ANGLE_PLATFORM_MACOS) > if (mEnableValidationLayers || icd != vk::ICD::Default) > { > const auto &cwd = angle::GetCWD(); >@@ -151,6 +154,7 @@ ScopedVkLoaderEnvironment::ScopedVkLoaderEnvironment(bool enableValidationLayers > } > } > } >+# endif // defined(ANGLE_PLATFORM_MACOS) > > // Override environment variable to use the ANGLE layers. > if (mEnableValidationLayers) >@@ -177,6 +181,15 @@ ScopedVkLoaderEnvironment::ScopedVkLoaderEnvironment(bool enableValidationLayers > } > } > #endif // !defined(ANGLE_PLATFORM_ANDROID) >+ >+ if (IsMSan()) >+ { >+ // device select layer cause memory sanitizer false positive, so disable >+ // it for msan build. >+ mPreviousNoDeviceSelectEnv = angle::GetEnvironmentVar(kNoDeviceSelect); >+ angle::SetEnvironmentVar(kNoDeviceSelect, "1"); >+ mChangedNoDeviceSelect = true; >+ } > } > > ScopedVkLoaderEnvironment::~ScopedVkLoaderEnvironment() >@@ -194,6 +207,11 @@ ScopedVkLoaderEnvironment::~ScopedVkLoaderEnvironment() > } > > ResetEnvironmentVar(kValidationLayersCustomSTypeListEnv, mPreviousCustomExtensionsEnv); >+ >+ if (mChangedNoDeviceSelect) >+ { >+ ResetEnvironmentVar(kNoDeviceSelect, mPreviousNoDeviceSelectEnv); >+ } > } > > bool ScopedVkLoaderEnvironment::setICDEnvironment(const char *icd) >diff --git a/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.h b/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.h >index 06d2d6810304920093c3cc0ca33a343e88d64fe1..f8d09706d8f4a0bba4d5f0b1c0157f75ea7871eb 100644 >--- a/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.h >+++ b/Source/ThirdParty/ANGLE/src/common/vulkan/vulkan_icd.h >@@ -53,6 +53,8 @@ class ScopedVkLoaderEnvironment : angle::NonCopyable > bool mChangedICDEnv; > Optional<std::string> mPreviousICDEnv; > Optional<std::string> mPreviousCustomExtensionsEnv; >+ bool mChangedNoDeviceSelect; >+ Optional<std::string> mPreviousNoDeviceSelectEnv; > }; > > void ChoosePhysicalDevice(PFN_vkGetPhysicalDeviceProperties pGetPhysicalDeviceProperties, >diff --git a/Source/ThirdParty/ANGLE/src/compiler.gni b/Source/ThirdParty/ANGLE/src/compiler.gni >index 16531032709baf97b03ff3424ed3daafff4ddc7f..8f1127234b57607899e5a48acea24eca0c25aad9 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler.gni >+++ b/Source/ThirdParty/ANGLE/src/compiler.gni >@@ -368,6 +368,7 @@ angle_translator_glsl_symbol_table_sources = [ > angle_translator_lib_metal_sources = [ > "src/compiler/translator/DriverUniformMetal.cpp", > "src/compiler/translator/TranslatorMetal.cpp", >+ "src/compiler/translator/TranslatorMetalConstantNames.cpp", > "src/compiler/translator/TranslatorMetalDirect.cpp", > "src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.cpp", > "src/compiler/translator/TranslatorMetalDirect/AddExplicitTypeCasts.h", >@@ -382,6 +383,8 @@ angle_translator_lib_metal_sources = [ > "src/compiler/translator/TranslatorMetalDirect/EmitMetal.h", > "src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.cpp", > "src/compiler/translator/TranslatorMetalDirect/FixTypeConstructors.h", >+ "src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.cpp", >+ "src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.h", > "src/compiler/translator/TranslatorMetalDirect/HoistConstants.cpp", > "src/compiler/translator/TranslatorMetalDirect/HoistConstants.h", > "src/compiler/translator/TranslatorMetalDirect/IdGen.cpp", >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/BuildSPIRV.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/BuildSPIRV.cpp >index e8f185e6e8f517398a3e1d02f062a6e6e1a97e50..75d9584b86f3204b6e3d79d605f16247b1e366ca 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/BuildSPIRV.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/BuildSPIRV.cpp >@@ -524,8 +524,8 @@ SpirvType SPIRVBuilder::getSpirvType(const TType &type, const SpirvTypeSpec &typ > { > SpirvType spirvType; > spirvType.type = type.getBasicType(); >- spirvType.primarySize = static_cast<uint8_t>(type.getNominalSize()); >- spirvType.secondarySize = static_cast<uint8_t>(type.getSecondarySize()); >+ spirvType.primarySize = type.getNominalSize(); >+ spirvType.secondarySize = type.getSecondarySize(); > spirvType.arraySizes = type.getArraySizes(); > spirvType.imageInternalFormat = type.getLayoutQualifier().imageInternalFormat; > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp >index 618470cd86117ed872b8cdddb9b671dc6a1620f3..317eeb2ffa2081e25ecbeb11dc9c01f00649483f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/CollectVariables.cpp >@@ -147,6 +147,7 @@ class CollectVariablesTraverser : public TIntermTraverser > bool staticUse, > bool isShaderIOBlock, > bool isPatch, >+ SymbolType symbolType, > ShaderVariable *variableOut) const; > void setCommonVariableProperties(const TType &type, > const TVariable &variable, >@@ -752,25 +753,28 @@ void CollectVariablesTraverser::setFieldOrVariableProperties(const TType &type, > // ShaderVariable objects. > ShaderVariable fieldVariable; > setFieldProperties(*field->type(), field->name(), staticUse, isShaderIOBlock, isPatch, >- &fieldVariable); >+ field->symbolType(), &fieldVariable); > variableOut->fields.push_back(fieldVariable); > } > } > else if (interfaceBlock && isShaderIOBlock) > { >- variableOut->type = GL_NONE; >+ const bool isPerVertex = (interfaceBlock->name() == "gl_PerVertex"); >+ variableOut->type = GL_NONE; > if (interfaceBlock->symbolType() != SymbolType::Empty) > { > variableOut->structOrBlockName = interfaceBlock->name().data(); > variableOut->mappedStructOrBlockName = >- HashName(interfaceBlock->name(), mHashFunction, nullptr).data(); >+ isPerVertex ? interfaceBlock->name().data() >+ : HashName(interfaceBlock->name(), mHashFunction, nullptr).data(); > } > const TFieldList &fields = interfaceBlock->fields(); > for (const TField *field : fields) > { > ShaderVariable fieldVariable; >+ > setFieldProperties(*field->type(), field->name(), staticUse, true, isPatch, >- &fieldVariable); >+ field->symbolType(), &fieldVariable); > fieldVariable.isShaderIOBlock = true; > variableOut->fields.push_back(fieldVariable); > } >@@ -814,12 +818,15 @@ void CollectVariablesTraverser::setFieldProperties(const TType &type, > bool staticUse, > bool isShaderIOBlock, > bool isPatch, >+ SymbolType symbolType, > ShaderVariable *variableOut) const > { > ASSERT(variableOut); > setFieldOrVariableProperties(type, staticUse, isShaderIOBlock, isPatch, variableOut); > variableOut->name.assign(name.data(), name.length()); >- variableOut->mappedName = HashName(name, mHashFunction, nullptr).data(); >+ variableOut->mappedName = (symbolType == SymbolType::BuiltIn) >+ ? name.data() >+ : HashName(name, mHashFunction, nullptr).data(); > } > > void CollectVariablesTraverser::setCommonVariableProperties(const TType &type, >@@ -1036,7 +1043,8 @@ void CollectVariablesTraverser::recordInterfaceBlock(const char *instanceName, > } > > ShaderVariable fieldVariable; >- setFieldProperties(fieldType, field->name(), staticUse, false, false, &fieldVariable); >+ setFieldProperties(fieldType, field->name(), staticUse, false, false, field->symbolType(), >+ &fieldVariable); > fieldVariable.isRowMajorLayout = > (fieldType.getLayoutQualifier().matrixPacking == EmpRowMajor); > interfaceBlock->fields.push_back(fieldVariable); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp >index e716a35028026f73dbb042c51f3ee694b4509095..80b238e055b5e5e1e1885d56152d54a41055f882 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/DirectiveHandler.cpp >@@ -162,6 +162,78 @@ void TDirectiveHandler::handleExtension(const angle::pp::SourceLocation &loc, > iter->second = behaviorVal; > } > } >+ // All the extensions listed in the spec here: >+ // https://www.khronos.org/registry/OpenGL/extensions/ANDROID/ANDROID_extension_pack_es31a.txt >+ // are implicitly enabled when GL_ANDROID_extension_pack_es31a is enabled >+ if (name == "GL_ANDROID_extension_pack_es31a") >+ { >+ constexpr char kGeometryShaderExtName[] = "GL_EXT_geometry_shader"; >+ constexpr char kTessellationShaderExtName[] = "GL_EXT_tessellation_shader"; >+ constexpr char kGpuShader5ExtName[] = "GL_EXT_gpu_shader5"; >+ constexpr char kTextureBufferExtName[] = "GL_EXT_texture_buffer"; >+ constexpr char kTextureCubeMapArrayExtName[] = "GL_EXT_texture_cube_map_array"; >+ constexpr char kSampleVariablesExtName[] = "GL_OES_sample_variables"; >+ constexpr char kShaderMultisampleInterpolationExtName[] = >+ "GL_OES_shader_multisample_interpolation"; >+ constexpr char kShaderImageAtomicExtName[] = "GL_OES_shader_image_atomic"; >+ constexpr char kTextureStorageMultisample2dArrayExtName[] = >+ "GL_OES_texture_storage_multisample_2d_array"; >+ iter = mExtensionBehavior.find(GetExtensionByName(kGeometryShaderExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = mExtensionBehavior.find(GetExtensionByName(kTessellationShaderExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = mExtensionBehavior.find(GetExtensionByName(kGpuShader5ExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = mExtensionBehavior.find(GetExtensionByName(kTextureBufferExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = mExtensionBehavior.find(GetExtensionByName(kTextureCubeMapArrayExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = mExtensionBehavior.find(GetExtensionByName(kSampleVariablesExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = >+ mExtensionBehavior.find(GetExtensionByName(kShaderMultisampleInterpolationExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = mExtensionBehavior.find(GetExtensionByName(kShaderImageAtomicExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ >+ iter = mExtensionBehavior.find( >+ GetExtensionByName(kTextureStorageMultisample2dArrayExtName)); >+ if (iter != mExtensionBehavior.end()) >+ { >+ iter->second = behaviorVal; >+ } >+ } > // EXT_shader_io_blocks is implicitly enabled when EXT_geometry_shader or > // EXT_tessellation_shader is enabled. > if (name == "GL_EXT_geometry_shader" || name == "GL_EXT_tessellation_shader") >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.cpp >index 08b6eafc256fa26b40b5439887d9c44ac7dfd17f..e1a5d614d043b3eaaea59e80c99711000537fc4c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.cpp >@@ -59,31 +59,31 @@ TFieldList *DriverUniformMetal::createUniformFields(TSymbolTable *symbolTable) > return driverFieldList; > } > >-TIntermBinary *DriverUniformMetal::getHalfRenderAreaRef() const >+TIntermTyped *DriverUniformMetal::getHalfRenderAreaRef() const > { > return createDriverUniformRef(kHalfRenderArea); > } > >-TIntermBinary *DriverUniformMetal::getFlipXYRef() const >+TIntermTyped *DriverUniformMetal::getFlipXYRef() const > { > return createDriverUniformRef(kFlipXY); > } > >-TIntermBinary *DriverUniformMetal::getNegFlipXYRef() const >+TIntermTyped *DriverUniformMetal::getNegFlipXYRef() const > { > return createDriverUniformRef(kNegFlipXY); > } > >-TIntermSwizzle *DriverUniformMetal::getNegFlipYRef() const >+TIntermTyped *DriverUniformMetal::getNegFlipYRef() const > { > // Create a swizzle to "negFlipXY.y" >- TIntermBinary *negFlipXY = createDriverUniformRef(kNegFlipXY); >+ TIntermTyped *negFlipXY = createDriverUniformRef(kNegFlipXY); > TVector<int> swizzleOffsetY = {1}; > TIntermSwizzle *negFlipY = new TIntermSwizzle(negFlipXY, swizzleOffsetY); > return negFlipY; > } > >-TIntermBinary *DriverUniformMetal::getCoverageMaskFieldRef() const >+TIntermTyped *DriverUniformMetal::getCoverageMaskFieldRef() const > { > return createDriverUniformRef(kCoverageMask); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.h b/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.h >index d2f539771f8554f468491665532b9edc4fec9560..96a6098c95f3c48d17a89bff9476b7ae5c14be81 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/DriverUniformMetal.h >@@ -22,11 +22,11 @@ class DriverUniformMetal : public DriverUniform > DriverUniformMetal() : DriverUniform(DriverUniformMode::InterfaceBlock) {} > ~DriverUniformMetal() override {} > >- TIntermBinary *getHalfRenderAreaRef() const override; >- TIntermBinary *getFlipXYRef() const override; >- TIntermBinary *getNegFlipXYRef() const override; >- TIntermSwizzle *getNegFlipYRef() const override; >- TIntermBinary *getCoverageMaskFieldRef() const; >+ TIntermTyped *getHalfRenderAreaRef() const override; >+ TIntermTyped *getFlipXYRef() const override; >+ TIntermTyped *getNegFlipXYRef() const override; >+ TIntermTyped *getNegFlipYRef() const override; >+ TIntermTyped *getCoverageMaskFieldRef() const; > > protected: > TFieldList *createUniformFields(TSymbolTable *symbolTable) override; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp >index 5476da08377b4c9635f2c7733e182526ff952069..730fc64b0d8f89f9810fcd4e0dc7ac26f70522fc 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.cpp >@@ -13,6 +13,7 @@ > #include <string.h> > > #define LIST_EXTENSIONS(OP) \ >+ OP(ANDROID_extension_pack_es31a) \ > OP(ANGLE_base_vertex_base_instance_shader_builtin) \ > OP(ANGLE_multi_draw) \ > OP(ANGLE_texture_multisample) \ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h b/Source/ThirdParty/ANGLE/src/compiler/translator/ExtensionBehavior.h >index 079dc67bc3b2ca6fa9443d7884908c6a12329bb8..22f7f162ed95ec5c47caa1354572133bae60d4f1 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 : uint8_t > { > UNDEFINED, // Special value used to indicate no extension. > >+ ANDROID_extension_pack_es31a, > ANGLE_base_vertex_base_instance_shader_builtin, > ANGLE_multi_draw, > ANGLE_texture_multisample, >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp >index c7bb266f34578515395d97271d3f619d1e251e03..0e67d7324e01a97e0fae81fadd27cb20c4b508d6 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/InfoSink.cpp >@@ -82,10 +82,11 @@ TInfoSinkBase &TInfoSinkBase::operator<<(const TType &type) > } > if (type.isMatrix()) > { >- *this << type.getCols() << "X" << type.getRows() << " matrix of "; >+ *this << static_cast<uint32_t>(type.getCols()) << "X" >+ << static_cast<uint32_t>(type.getRows()) << " matrix of "; > } > else if (type.isVector()) >- *this << type.getNominalSize() << "-component vector of "; >+ *this << static_cast<uint32_t>(type.getNominalSize()) << "-component vector of "; > > sink.append(type.getBasicString()); > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp >index a6f644a67fe196297b1e62472551cd8caed1e208..ce7768f47a5d8d78ac9263e09ad0ff1fd8bc5cb5 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Initialize.cpp >@@ -177,6 +177,10 @@ void InitExtensionBehavior(const ShBuiltInResources &resources, TExtensionBehavi > { > extBehavior[TExtension::EXT_clip_cull_distance] = EBhUndefined; > } >+ if (resources.ANDROID_extension_pack_es31a) >+ { >+ extBehavior[TExtension::ANDROID_extension_pack_es31a] = EBhUndefined; >+ } > } > > void ResetExtensionBehavior(const ShBuiltInResources &resources, >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp >index 55ff8bf41df973e8ae1da1ea875bb6c394677836..3c7635cb73319afef3b1565cd5a2731b0c9f385a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.cpp >@@ -875,11 +875,11 @@ const TConstantUnion *TIntermAggregate::getConstantValue() const > { > if (isMatrix()) > { >- int resultCols = getType().getCols(); >- int resultRows = getType().getRows(); >- for (int col = 0; col < resultCols; ++col) >+ const uint8_t resultCols = getType().getCols(); >+ const uint8_t resultRows = getType().getRows(); >+ for (uint8_t col = 0; col < resultCols; ++col) > { >- for (int row = 0; row < resultRows; ++row) >+ for (uint8_t row = 0; row < resultRows; ++row) > { > if (col == row) > { >@@ -907,13 +907,13 @@ const TConstantUnion *TIntermAggregate::getConstantValue() const > 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) >+ const uint8_t argumentCols = argumentTyped->getType().getCols(); >+ const uint8_t argumentRows = argumentTyped->getType().getRows(); >+ const uint8_t resultCols = getType().getCols(); >+ const uint8_t resultRows = getType().getRows(); >+ for (uint8_t col = 0; col < resultCols; ++col) > { >- for (int row = 0; row < resultRows; ++row) >+ for (uint8_t row = 0; row < resultRows; ++row) > { > if (col < argumentCols && row < argumentRows) > { >@@ -1417,8 +1417,8 @@ void TIntermUnary::promote() > break; > case EOpTranspose: > ASSERT(resultType.getBasicType() == EbtFloat); >- resultType.setPrimarySize(static_cast<unsigned char>(mOperand->getType().getRows())); >- resultType.setSecondarySize(static_cast<unsigned char>(mOperand->getType().getCols())); >+ resultType.setPrimarySize(mOperand->getType().getRows()); >+ resultType.setSecondarySize(mOperand->getType().getCols()); > break; > case EOpIsinf: > case EOpIsnan: >@@ -1690,9 +1690,9 @@ void TIntermSwizzle::promote() > if (mOperand->getQualifier() == EvqConst) > resultQualifier = EvqConst; > >- auto numFields = mSwizzleOffsets.size(); >+ size_t numFields = mSwizzleOffsets.size(); > setType(TType(mOperand->getBasicType(), EbpUndefined, resultQualifier, >- static_cast<unsigned char>(numFields))); >+ static_cast<uint8_t>(numFields))); > propagatePrecision(derivePrecision()); > } > >@@ -1856,7 +1856,7 @@ void TIntermBinary::promote() > > ASSERT(mLeft->isArray() == mRight->isArray()); > >- const int nominalSize = std::max(mLeft->getNominalSize(), mRight->getNominalSize()); >+ const uint8_t nominalSize = std::max(mLeft->getNominalSize(), mRight->getNominalSize()); > > switch (mOp) > { >@@ -1865,23 +1865,23 @@ void TIntermBinary::promote() > case EOpMatrixTimesScalar: > if (mRight->isMatrix()) > { >- getTypePointer()->setPrimarySize(static_cast<unsigned char>(mRight->getCols())); >- getTypePointer()->setSecondarySize(static_cast<unsigned char>(mRight->getRows())); >+ getTypePointer()->setPrimarySize(mRight->getCols()); >+ getTypePointer()->setSecondarySize(mRight->getRows()); > } > break; > case EOpMatrixTimesVector: >- getTypePointer()->setPrimarySize(static_cast<unsigned char>(mLeft->getRows())); >+ getTypePointer()->setPrimarySize(mLeft->getRows()); > getTypePointer()->setSecondarySize(1); > break; > case EOpMatrixTimesMatrix: >- getTypePointer()->setPrimarySize(static_cast<unsigned char>(mRight->getCols())); >- getTypePointer()->setSecondarySize(static_cast<unsigned char>(mLeft->getRows())); >+ getTypePointer()->setPrimarySize(mRight->getCols()); >+ getTypePointer()->setSecondarySize(mLeft->getRows()); > break; > case EOpVectorTimesScalar: >- getTypePointer()->setPrimarySize(static_cast<unsigned char>(nominalSize)); >+ getTypePointer()->setPrimarySize(nominalSize); > break; > case EOpVectorTimesMatrix: >- getTypePointer()->setPrimarySize(static_cast<unsigned char>(mRight->getCols())); >+ getTypePointer()->setPrimarySize(mRight->getCols()); > ASSERT(getType().getSecondarySize() == 1); > break; > case EOpMulAssign: >@@ -1916,10 +1916,10 @@ void TIntermBinary::promote() > case EOpBitwiseOrAssign: > { > ASSERT(!mLeft->isArray() && !mRight->isArray()); >- const int secondarySize = >+ const uint8_t secondarySize = > std::max(mLeft->getSecondarySize(), mRight->getSecondarySize()); >- getTypePointer()->setPrimarySize(static_cast<unsigned char>(nominalSize)); >- getTypePointer()->setSecondarySize(static_cast<unsigned char>(secondarySize)); >+ getTypePointer()->setPrimarySize(nominalSize); >+ getTypePointer()->setSecondarySize(secondarySize); > break; > } > case EOpEqual: >@@ -1960,6 +1960,15 @@ void TIntermBinary::promote() > // Derive precision from children nodes > TPrecision TIntermBinary::derivePrecision() const > { >+ // Assignments use the type and precision of the lvalue-expression >+ // GLSL ES spec section 5.8: Assignments >+ // "The assignment operator stores the value of rvalue-expression into the l-value and returns >+ // an r-value with the type and precision of lvalue-expression." >+ if (IsAssignment(mOp)) >+ { >+ return mLeft->getPrecision(); >+ } >+ > const TPrecision higherPrecision = > GetHigherPrecision(mLeft->getPrecision(), mRight->getPrecision()); > >@@ -2071,7 +2080,7 @@ const TConstantUnion *TIntermConstantUnion::FoldIndexing(const TType &type, > else if (type.isMatrix()) > { > ASSERT(index < type.getCols()); >- int size = type.getRows(); >+ const uint8_t size = type.getRows(); > return &constArray[size * index]; > } > else if (type.isVector()) >@@ -2425,20 +2434,20 @@ const TConstantUnion *TIntermConstantUnion::FoldBinary(TOperator op, > // TODO(jmadll): This code should check for overflows. > ASSERT(leftType.getBasicType() == EbtFloat && rightType.getBasicType() == EbtFloat); > >- 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; >+ const uint8_t leftCols = leftType.getCols(); >+ const uint8_t leftRows = leftType.getRows(); >+ const uint8_t rightCols = rightType.getCols(); >+ const uint8_t rightRows = rightType.getRows(); >+ const uint8_t resultCols = rightCols; >+ const uint8_t resultRows = leftRows; > > resultArray = new TConstantUnion[resultCols * resultRows]; >- for (int row = 0; row < resultRows; row++) >+ for (uint8_t row = 0; row < resultRows; row++) > { >- for (int column = 0; column < resultCols; column++) >+ for (uint8_t column = 0; column < resultCols; column++) > { > resultArray[resultRows * column + row].setFConst(0.0f); >- for (int i = 0; i < leftCols; i++) >+ for (uint8_t i = 0; i < leftCols; i++) > { > resultArray[resultRows * column + row].setFConst( > resultArray[resultRows * column + row].getFConst() + >@@ -2598,15 +2607,15 @@ const TConstantUnion *TIntermConstantUnion::FoldBinary(TOperator op, > // TODO(jmadll): This code should check for overflows. > ASSERT(rightType.getBasicType() == EbtFloat); > >- const int matrixCols = leftType.getCols(); >- const int matrixRows = leftType.getRows(); >+ const uint8_t matrixCols = leftType.getCols(); >+ const uint8_t matrixRows = leftType.getRows(); > > resultArray = new TConstantUnion[matrixRows]; > >- for (int matrixRow = 0; matrixRow < matrixRows; matrixRow++) >+ for (uint8_t matrixRow = 0; matrixRow < matrixRows; matrixRow++) > { > resultArray[matrixRow].setFConst(0.0f); >- for (int col = 0; col < matrixCols; col++) >+ for (uint8_t col = 0; col < matrixCols; col++) > { > resultArray[matrixRow].setFConst( > resultArray[matrixRow].getFConst() + >@@ -2622,15 +2631,15 @@ const TConstantUnion *TIntermConstantUnion::FoldBinary(TOperator op, > // TODO(jmadll): This code should check for overflows. > ASSERT(leftType.getBasicType() == EbtFloat); > >- const int matrixCols = rightType.getCols(); >- const int matrixRows = rightType.getRows(); >+ const uint8_t matrixCols = rightType.getCols(); >+ const uint8_t matrixRows = rightType.getRows(); > > resultArray = new TConstantUnion[matrixCols]; > >- for (int matrixCol = 0; matrixCol < matrixCols; matrixCol++) >+ for (uint8_t matrixCol = 0; matrixCol < matrixCols; matrixCol++) > { > resultArray[matrixCol].setFConst(0.0f); >- for (int matrixRow = 0; matrixRow < matrixRows; matrixRow++) >+ for (uint8_t matrixRow = 0; matrixRow < matrixRows; matrixRow++) > { > resultArray[matrixCol].setFConst( > resultArray[matrixCol].getFConst() + >@@ -2816,7 +2825,7 @@ TConstantUnion *TIntermConstantUnion::foldUnaryNonComponentWise(TOperator op) > case EOpDeterminant: > { > ASSERT(getType().getBasicType() == EbtFloat); >- unsigned int size = getType().getNominalSize(); >+ const uint8_t size = getType().getNominalSize(); > ASSERT(size >= 2 && size <= 4); > resultArray = new TConstantUnion(); > resultArray->setFConst(GetMatrix(operandArray, size).determinant()); >@@ -2826,7 +2835,7 @@ TConstantUnion *TIntermConstantUnion::foldUnaryNonComponentWise(TOperator op) > case EOpInverse: > { > ASSERT(getType().getBasicType() == EbtFloat); >- unsigned int size = getType().getNominalSize(); >+ const uint8_t size = getType().getNominalSize(); > ASSERT(size >= 2 && size <= 4); > resultArray = new TConstantUnion[objectSize]; > angle::Matrix<float> result = GetMatrix(operandArray, size).inverse(); >@@ -3799,8 +3808,8 @@ TConstantUnion *TIntermConstantUnion::FoldAggregateBuiltIn(TIntermAggregate *agg > (*arguments)[1]->getAsTyped()->isMatrix()); > // Perform component-wise matrix multiplication. > resultArray = new TConstantUnion[maxObjectSize]; >- int rows = (*arguments)[0]->getAsTyped()->getRows(); >- int cols = (*arguments)[0]->getAsTyped()->getCols(); >+ const uint8_t rows = (*arguments)[0]->getAsTyped()->getRows(); >+ const uint8_t 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); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h >index 1a3bed84c01fc5f3623a577afbeefdd328d0fe06..1b3d8ca810b8196e63dcbc2b1d38835cfa829c69 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/IntermNode.h >@@ -167,10 +167,10 @@ class TIntermTyped : public TIntermNode > 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(); } >+ uint8_t getCols() const { return getType().getCols(); } >+ uint8_t getRows() const { return getType().getRows(); } >+ uint8_t getNominalSize() const { return getType().getNominalSize(); } >+ uint8_t getSecondarySize() const { return getType().getSecondarySize(); } > > bool isInterfaceBlock() const { return getType().isInterfaceBlock(); } > bool isMatrix() const { return getType().isMatrix(); } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputSPIRV.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputSPIRV.cpp >index 432c0d715b138d073344f00ff6766e0bb155bec4..28b20a5bf8c3b9ebcc8f8b950bdd3dbe9680a5a5 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/OutputSPIRV.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/OutputSPIRV.cpp >@@ -1288,7 +1288,7 @@ spirv::IdRef OutputSPIRVTraverser::createComplexConstant(const TType &type, > const spirv::IdRef columnTypeId = > mBuilder.getBasicTypeId(type.getBasicType(), type.getRows()); > >- for (int columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) >+ for (uint8_t columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) > { > auto columnParametersStart = parameters.begin() + columnIndex * type.getRows(); > spirv::IdRefList columnParameters(columnParametersStart, >@@ -1504,7 +1504,7 @@ spirv::IdRef OutputSPIRVTraverser::createConstructorVectorFromMatrix( > > spirv::IdRef argumentTypeId = typeId; > TType arg0TypeAsVector(arg0Type); >- arg0TypeAsVector.setPrimarySize(static_cast<unsigned char>(node->getType().getNominalSize())); >+ arg0TypeAsVector.setPrimarySize(node->getType().getNominalSize()); > arg0TypeAsVector.setSecondarySize(1); > > if (arg0Type.getBasicType() != expectedType.getBasicType()) >@@ -1553,11 +1553,11 @@ spirv::IdRef OutputSPIRVTraverser::createConstructorVectorFromMultiple( > TType componentType(argumentType); > componentType.toComponentType(); > >- for (int columnIndex = 0; >+ for (uint8_t columnIndex = 0; > columnIndex < argumentType.getCols() && componentIndex < extractedComponents.size(); > ++columnIndex) > { >- for (int rowIndex = 0; >+ for (uint8_t rowIndex = 0; > rowIndex < argumentType.getRows() && componentIndex < extractedComponents.size(); > ++rowIndex, ++componentIndex) > { >@@ -1619,7 +1619,7 @@ spirv::IdRef OutputSPIRVTraverser::createConstructorMatrixFromScalar( > > const spirv::IdRef columnTypeId = mBuilder.getBasicTypeId(type.getBasicType(), type.getRows()); > >- for (int columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) >+ for (uint8_t columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) > { > columnIds.push_back(mBuilder.getNewId(decorations)); > >@@ -1668,7 +1668,7 @@ spirv::IdRef OutputSPIRVTraverser::createConstructorMatrixFromVectors( > const spirv::IdRef columnTypeId = mBuilder.getBasicTypeId(type.getBasicType(), type.getRows()); > > // Chunk up the extracted components by column and construct intermediary vectors. >- for (int columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) >+ for (uint8_t columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) > { > columnIds.push_back(mBuilder.getNewId(decorations)); > >@@ -1734,7 +1734,7 @@ spirv::IdRef OutputSPIRVTraverser::createConstructorMatrixFromMatrix( > spirv::LiteralInteger(2), spirv::LiteralInteger(3)}; > swizzle.resize(type.getRows()); > >- for (int columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) >+ for (uint8_t columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) > { > // Extract the column. > const spirv::IdRef parameterColumnId = mBuilder.getNewId(decorations); >@@ -1763,11 +1763,11 @@ spirv::IdRef OutputSPIRVTraverser::createConstructorMatrixFromMatrix( > paramComponentType.toComponentType(); > const spirv::IdRef paramComponentTypeId = mBuilder.getTypeData(paramComponentType, {}).id; > >- for (int columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) >+ for (uint8_t columnIndex = 0; columnIndex < type.getCols(); ++columnIndex) > { > spirv::IdRefList componentIds; > >- for (int componentIndex = 0; componentIndex < type.getRows(); ++componentIndex) >+ for (uint8_t componentIndex = 0; componentIndex < type.getRows(); ++componentIndex) > { > // Take the component from the constructor parameter if possible. > spirv::IdRef componentId; >@@ -1890,8 +1890,8 @@ void OutputSPIRVTraverser::extractComponents(TIntermAggregate *node, > : castBasicType(parameterId, argumentType, expectedType, nullptr); > > // For vector parameters, take components out of the vector one by one. >- for (int componentIndex = 0; componentIndex < argumentType.getNominalSize() && >- extractedComponentsOut->size() < componentCount; >+ for (uint8_t componentIndex = 0; componentIndex < argumentType.getNominalSize() && >+ extractedComponentsOut->size() < componentCount; > ++componentIndex) > { > const spirv::IdRef componentId = mBuilder.getNewId(decorations); >@@ -1913,12 +1913,12 @@ void OutputSPIRVTraverser::extractComponents(TIntermAggregate *node, > // For matrix parameters, take components out of the matrix one by one in column-major > // order. No cast is done here; it would only be required for vector constructors with > // matrix parameters, in which case the resulting vector is cast in the end. >- for (int columnIndex = 0; columnIndex < argumentType.getCols() && >- extractedComponentsOut->size() < componentCount; >+ for (uint8_t columnIndex = 0; columnIndex < argumentType.getCols() && >+ extractedComponentsOut->size() < componentCount; > ++columnIndex) > { >- for (int componentIndex = 0; componentIndex < argumentType.getRows() && >- extractedComponentsOut->size() < componentCount; >+ for (uint8_t componentIndex = 0; componentIndex < argumentType.getRows() && >+ extractedComponentsOut->size() < componentCount; > ++componentIndex) > { > const spirv::IdRef componentId = mBuilder.getNewId(decorations); >@@ -2905,8 +2905,8 @@ spirv::IdRef OutputSPIRVTraverser::visitOperator(TIntermOperator *node, spirv::I > { > // ++ and -- are implemented with binary add and subtract, so add an implicit parameter with > // size vecN(1). >- const int vecSize = firstOperandType.isMatrix() ? firstOperandType.getRows() >- : firstOperandType.getNominalSize(); >+ const uint8_t vecSize = firstOperandType.isMatrix() ? firstOperandType.getRows() >+ : firstOperandType.getNominalSize(); > const spirv::IdRef one = > isFloat ? mBuilder.getVecConstant(1, vecSize) : mBuilder.getIvecConstant(1, vecSize); > parameters.push_back(one); >@@ -2960,7 +2960,7 @@ spirv::IdRef OutputSPIRVTraverser::visitOperator(TIntermOperator *node, spirv::I > } > > // Extract and apply the operator to each column. >- for (int columnIndex = 0; columnIndex < matrixType.getCols(); ++columnIndex) >+ for (uint8_t columnIndex = 0; columnIndex < matrixType.getCols(); ++columnIndex) > { > spirv::IdRef columnIdA = parameters[0]; > if (firstOperandType.isMatrix()) >@@ -3763,7 +3763,7 @@ spirv::IdRef OutputSPIRVTraverser::createImageTextureBuiltIn(TIntermOperator *no > // Gather operands as necessary. > > // - Coordinates >- int coordinatesChannelCount = 0; >+ uint8_t coordinatesChannelCount = 0; > spirv::IdRef coordinatesId; > const TType *coordinatesType = nullptr; > if (coordinatesIndex > 0) >@@ -3785,7 +3785,7 @@ spirv::IdRef OutputSPIRVTraverser::createImageTextureBuiltIn(TIntermOperator *no > { > // Get the component index > ASSERT(coordinatesChannelCount > 0); >- int drefComponent = isProj ? 2 : coordinatesChannelCount - 1; >+ uint8_t drefComponent = isProj ? 2 : coordinatesChannelCount - 1; > > // Get the component type > SpirvType drefSpirvType = mBuilder.getSpirvType(*coordinatesType, {}); >@@ -3896,7 +3896,7 @@ spirv::IdRef OutputSPIRVTraverser::createImageTextureBuiltIn(TIntermOperator *no > // > if (isProj) > { >- int requiredChannelCount = coordinatesChannelCount; >+ uint8_t requiredChannelCount = coordinatesChannelCount; > // texture*Proj* operate on the following parameters: > // > // - sampler1D, vec2 P >@@ -4558,7 +4558,7 @@ void OutputSPIRVTraverser::createCompareImpl(TOperator op, > columnType.toMatrixColumnType(); > > currentAccessChain->emplace_back(); >- for (int columnIndex = 0; columnIndex < operandType.getCols(); ++columnIndex) >+ for (uint8_t columnIndex = 0; columnIndex < operandType.getCols(); ++columnIndex) > { > // Select the current column. > currentAccessChain->back() = spirv::LiteralInteger(columnIndex); >@@ -4665,10 +4665,8 @@ spirv::IdRef OutputSPIRVTraverser::makeBuiltInOutputStructType(TIntermOperator * > if (iter == mBuiltInResultStructMap.end()) > { > // Create a TStructure and TType for the required structure. >- TType *lsbTypeCopy = new TType(lsbType.getBasicType(), >- static_cast<unsigned char>(lsbType.getNominalSize()), 1); >- TType *msbTypeCopy = new TType(msbType.getBasicType(), >- static_cast<unsigned char>(msbType.getNominalSize()), 1); >+ TType *lsbTypeCopy = new TType(lsbType.getBasicType(), lsbType.getNominalSize(), 1); >+ TType *msbTypeCopy = new TType(msbType.getBasicType(), msbType.getNominalSize(), 1); > > TFieldList *fields = new TFieldList; > fields->push_back( >@@ -5119,8 +5117,8 @@ bool OutputSPIRVTraverser::visitTernary(Visit visit, TIntermTernary *node) > // So when selecting between vectors, we must replicate the condition scalar. > if (type.isVector()) > { >- const TType &boolVectorType = *StaticType::GetForVec<EbtBool, EbpUndefined>( >- EvqGlobal, static_cast<unsigned char>(type.getNominalSize())); >+ const TType &boolVectorType = >+ *StaticType::GetForVec<EbtBool, EbpUndefined>(EvqGlobal, type.getNominalSize()); > typeId = > mBuilder.getBasicTypeId(conditionType.getBasicType(), type.getNominalSize()); > conditionValue = createConstructorVectorFromScalar(conditionType, boolVectorType, >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp >index 4d1b6732247f383cf2ab1a832e691af540f4f538..ed359b62640d99641ad00a6d76bcd79ad174670b 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ParseContext.cpp >@@ -4263,7 +4263,12 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > const TVector<unsigned int> *arraySizes, > const TSourceLoc &arraySizesLine) > { >- checkIsNotReserved(nameLine, blockName); >+ const bool isGLPerVertex = blockName == "gl_PerVertex"; >+ // gl_PerVertex is allowed to be redefined and therefore not reserved >+ if (!isGLPerVertex) >+ { >+ checkIsNotReserved(nameLine, blockName); >+ } > > TTypeQualifier typeQualifier = typeQualifierBuilder.getVariableTypeQualifier(mDiagnostics); > >@@ -4569,8 +4574,13 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > } > } > >- TInterfaceBlock *interfaceBlock = new TInterfaceBlock( >- &symbolTable, blockName, fieldList, blockLayoutQualifier, SymbolType::UserDefined); >+ SymbolType instanceSymbolType = SymbolType::UserDefined; >+ if (isGLPerVertex) >+ { >+ instanceSymbolType = SymbolType::BuiltIn; >+ } >+ TInterfaceBlock *interfaceBlock = new TInterfaceBlock(&symbolTable, blockName, fieldList, >+ blockLayoutQualifier, instanceSymbolType); > if (!symbolTable.declare(interfaceBlock)) > { > error(nameLine, "redefinition of an interface block name", blockName); >@@ -4607,8 +4617,21 @@ TIntermDeclaration *TParseContext::addInterfaceBlock( > > fieldType->setQualifier(typeQualifier.qualifier); > >+ SymbolType symbolType = SymbolType::UserDefined; >+ if (field->name() == "gl_Position" || field->name() == "gl_PointSize" || >+ field->name() == "gl_ClipDistance" || field->name() == "gl_CullDistance") >+ { >+ // These builtins can be redifined only when used within a redefiend gl_PerVertex >+ // block >+ if (interfaceBlock->name() != "gl_PerVertex") >+ { >+ error(field->line(), "redefinition in an invalid interface block", >+ field->name()); >+ } >+ symbolType = SymbolType::BuiltIn; >+ } > TVariable *fieldVariable = >- new TVariable(&symbolTable, field->name(), fieldType, SymbolType::UserDefined); >+ new TVariable(&symbolTable, field->name(), fieldType, symbolType); > if (!symbolTable.declare(fieldVariable)) > { > error(field->line(), "redefinition of an interface block member name", >@@ -5629,7 +5652,6 @@ TLayoutQualifier TParseContext::joinLayoutQualifiers(TLayoutQualifier leftQualif > TDeclarator *TParseContext::parseStructDeclarator(const ImmutableString &identifier, > const TSourceLoc &loc) > { >- checkIsNotReserved(loc, identifier); > return new TDeclarator(identifier, loc); > } > >@@ -5637,7 +5659,6 @@ TDeclarator *TParseContext::parseStructArrayDeclarator(const ImmutableString &id > const TSourceLoc &loc, > const TVector<unsigned int> *arraySizes) > { >- checkIsNotReserved(loc, identifier); > return new TDeclarator(identifier, arraySizes, loc); > } > >@@ -5725,8 +5746,17 @@ TFieldList *TParseContext::addStructDeclaratorList(const TPublicType &typeSpecif > type->makeArrays(*declarator->arraySizes()); > } > >- TField *field = >- new TField(type, declarator->name(), declarator->line(), SymbolType::UserDefined); >+ SymbolType symbolType = SymbolType::UserDefined; >+ if (declarator->name() == "gl_Position" || declarator->name() == "gl_PointSize" || >+ declarator->name() == "gl_ClipDistance" || declarator->name() == "gl_CullDistance") >+ { >+ symbolType = SymbolType::BuiltIn; >+ } >+ else >+ { >+ checkIsNotReserved(typeSpecifier.getLine(), declarator->name()); >+ } >+ TField *field = new TField(type, declarator->name(), declarator->line(), symbolType); > checkIsBelowStructNestingLimit(typeSpecifier.getLine(), *field); > fieldList->push_back(field); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp >index 01b246d1d75d2ec2b5b5f3ad7abb0f986bb87e23..f4eeab5ab9733191a78c84c60fc6f19f5cb2a788 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/ShaderStorageBlockFunctionHLSL.cpp >@@ -70,8 +70,8 @@ void ShaderStorageBlockFunctionHLSL::OutputSSBOLoadFunctionBody( > } > else > { >- out << " = " << convertString << "buffer.Load" << ssboFunction.type.getNominalSize() >- << "(loc));\n"; >+ out << " = " << convertString << "buffer.Load" >+ << static_cast<uint32_t>(ssboFunction.type.getNominalSize()) << "(loc));\n"; > } > } > else if (ssboFunction.type.isMatrix()) >@@ -79,12 +79,12 @@ void ShaderStorageBlockFunctionHLSL::OutputSSBOLoadFunctionBody( > if (ssboFunction.rowMajor) > { > out << ";"; >- out << " float" << ssboFunction.type.getRows() << "x" << ssboFunction.type.getCols() >- << " tmp_ = {"; >- for (int rowIndex = 0; rowIndex < ssboFunction.type.getRows(); rowIndex++) >+ out << " float" << static_cast<uint32_t>(ssboFunction.type.getRows()) << "x" >+ << static_cast<uint32_t>(ssboFunction.type.getCols()) << " tmp_ = {"; >+ for (uint8_t rowIndex = 0; rowIndex < ssboFunction.type.getRows(); rowIndex++) > { >- out << "asfloat(buffer.Load" << ssboFunction.type.getCols() << "(loc + " >- << rowIndex * ssboFunction.matrixStride << ")), "; >+ out << "asfloat(buffer.Load" << static_cast<uint32_t>(ssboFunction.type.getCols()) >+ << "(loc + " << rowIndex * ssboFunction.matrixStride << ")), "; > } > out << "};\n"; > out << " result = transpose(tmp_);\n"; >@@ -92,10 +92,10 @@ void ShaderStorageBlockFunctionHLSL::OutputSSBOLoadFunctionBody( > else > { > out << " = {"; >- for (int columnIndex = 0; columnIndex < ssboFunction.type.getCols(); columnIndex++) >+ for (uint8_t columnIndex = 0; columnIndex < ssboFunction.type.getCols(); columnIndex++) > { >- out << "asfloat(buffer.Load" << ssboFunction.type.getRows() << "(loc + " >- << columnIndex * ssboFunction.matrixStride << ")), "; >+ out << "asfloat(buffer.Load" << static_cast<uint32_t>(ssboFunction.type.getRows()) >+ << "(loc + " << columnIndex * ssboFunction.matrixStride << ")), "; > } > out << "};\n"; > } >@@ -131,10 +131,12 @@ void ShaderStorageBlockFunctionHLSL::OutputSSBOStoreFunctionBody( > } > else if (ssboFunction.type.isVector()) > { >- out << " uint" << ssboFunction.type.getNominalSize() << " _value;\n"; >+ out << " uint" << static_cast<uint32_t>(ssboFunction.type.getNominalSize()) >+ << " _value;\n"; > if (ssboFunction.type.getBasicType() == EbtBool) > { >- out << " _value = uint" << ssboFunction.type.getNominalSize() << "(value);\n"; >+ out << " _value = uint" << static_cast<uint32_t>(ssboFunction.type.getNominalSize()) >+ << "(value);\n"; > } > else > { >@@ -157,29 +159,31 @@ void ShaderStorageBlockFunctionHLSL::OutputSSBOStoreFunctionBody( > } > else > { >- out << " buffer.Store" << ssboFunction.type.getNominalSize() << "(loc, _value);\n"; >+ out << " buffer.Store" << static_cast<uint32_t>(ssboFunction.type.getNominalSize()) >+ << "(loc, _value);\n"; > } > } > else if (ssboFunction.type.isMatrix()) > { > if (ssboFunction.rowMajor) > { >- out << " float" << ssboFunction.type.getRows() << "x" << ssboFunction.type.getCols() >+ out << " float" << static_cast<uint32_t>(ssboFunction.type.getRows()) << "x" >+ << static_cast<uint32_t>(ssboFunction.type.getCols()) > << " tmp_ = transpose(value);\n"; >- for (int rowIndex = 0; rowIndex < ssboFunction.type.getRows(); rowIndex++) >+ for (uint8_t rowIndex = 0; rowIndex < ssboFunction.type.getRows(); rowIndex++) > { >- out << " buffer.Store" << ssboFunction.type.getCols() << "(loc + " >- << rowIndex * ssboFunction.matrixStride << ", asuint(tmp_[" << rowIndex >- << "]));\n"; >+ out << " buffer.Store" << static_cast<uint32_t>(ssboFunction.type.getCols()) >+ << "(loc + " << rowIndex * ssboFunction.matrixStride << ", asuint(tmp_[" >+ << static_cast<uint32_t>(rowIndex) << "]));\n"; > } > } > else > { >- for (int columnIndex = 0; columnIndex < ssboFunction.type.getCols(); columnIndex++) >+ for (uint8_t columnIndex = 0; columnIndex < ssboFunction.type.getCols(); columnIndex++) > { >- out << " buffer.Store" << ssboFunction.type.getRows() << "(loc + " >- << columnIndex * ssboFunction.matrixStride << ", asuint(value[" << columnIndex >- << "]));\n"; >+ out << " buffer.Store" << static_cast<uint32_t>(ssboFunction.type.getRows()) >+ << "(loc + " << columnIndex * ssboFunction.matrixStride << ", asuint(value[" >+ << static_cast<uint32_t>(columnIndex) << "]));\n"; > } > } > } >@@ -315,7 +319,7 @@ TString ShaderStorageBlockFunctionHLSL::registerShaderStorageBlockFunction( > { > if (ssboFunction.type.getNominalSize() > 1) > { >- for (int index = 0; index < ssboFunction.type.getNominalSize(); index++) >+ for (uint8_t index = 0; index < ssboFunction.type.getNominalSize(); index++) > { > ssboFunction.swizzleOffsets.push_back(index); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/StaticType.h b/Source/ThirdParty/ANGLE/src/compiler/translator/StaticType.h >index 9d3a0583f87019758cb1f9ddfe94ee5610c48f88..641daadebd147a9f2fa43bbaf45973b77853efae 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/StaticType.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/StaticType.h >@@ -41,8 +41,8 @@ struct StaticMangledName > constexpr StaticMangledName BuildStaticMangledName(TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize) >+ uint8_t primarySize, >+ uint8_t secondarySize) > { > StaticMangledName name = {}; > name.name[0] = TType::GetSizeMangledName(primarySize, secondarySize); >@@ -65,8 +65,8 @@ struct StaticArrayMangledName > constexpr StaticArrayMangledName BuildStaticArrayMangledName(TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize, >+ uint8_t primarySize, >+ uint8_t secondarySize, > const unsigned int *arraySizes, > size_t numArraySizes) > { >@@ -91,8 +91,8 @@ constexpr StaticArrayMangledName BuildStaticArrayMangledName(TBasicType basicTyp > template <TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize> >+ uint8_t primarySize, >+ uint8_t secondarySize> > static constexpr StaticMangledName kMangledNameInstance = > BuildStaticMangledName(basicType, precision, qualifier, primarySize, secondarySize); > >@@ -100,8 +100,8 @@ static constexpr StaticMangledName kMangledNameInstance = > template <TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize, >+ uint8_t primarySize, >+ uint8_t secondarySize, > const unsigned int *arraySizes, > size_t numArraySizes> > static constexpr StaticArrayMangledName kMangledNameArrayInstance = >@@ -127,8 +127,8 @@ static constexpr StaticArrayMangledName kMangledNameArrayInstance = > template <TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize> >+ uint8_t primarySize, >+ uint8_t secondarySize> > static constexpr TType instance = > TType(basicType, > precision, >@@ -142,8 +142,8 @@ static constexpr TType instance = > template <TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize, >+ uint8_t primarySize, >+ uint8_t secondarySize, > const unsigned int *arraySizes, > size_t numArraySizes> > static constexpr TType arrayInstance = >@@ -164,8 +164,8 @@ static constexpr TType arrayInstance = > template <TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize> >+ uint8_t primarySize, >+ uint8_t secondarySize> > constexpr const TType *Get() > { > static_assert(1 <= primarySize && primarySize <= 4, "primarySize out of bounds"); >@@ -176,8 +176,8 @@ constexpr const TType *Get() > template <TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize, >- unsigned char secondarySize, >+ uint8_t primarySize, >+ uint8_t secondarySize, > const unsigned int *arraySizes, > size_t numArraySizes> > constexpr const TType *GetArray() >@@ -196,8 +196,8 @@ constexpr const TType *GetArray() > > template <TBasicType basicType, > TPrecision precision, >- unsigned char primarySize = 1, >- unsigned char secondarySize = 1> >+ uint8_t primarySize = 1, >+ uint8_t secondarySize = 1> > constexpr const TType *GetBasic() > { > return Get<basicType, precision, EvqGlobal, primarySize, secondarySize>(); >@@ -205,8 +205,8 @@ constexpr const TType *GetBasic() > > template <TBasicType basicType, > TPrecision precision, >- unsigned char primarySize = 1, >- unsigned char secondarySize = 1> >+ uint8_t primarySize = 1, >+ uint8_t secondarySize = 1> > constexpr const TType *GetTemporary() > { > return Get<basicType, precision, EvqTemporary, primarySize, secondarySize>(); >@@ -215,8 +215,8 @@ constexpr const TType *GetTemporary() > template <TBasicType basicType, > TPrecision precision, > TQualifier qualifier, >- unsigned char primarySize = 1, >- unsigned char secondarySize = 1> >+ uint8_t primarySize = 1, >+ uint8_t secondarySize = 1> > const TType *GetQualified() > { > return Get<basicType, precision, qualifier, primarySize, secondarySize>(); >@@ -228,11 +228,8 @@ 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) >+template <TBasicType basicType, TPrecision precision, TQualifier qualifier, uint8_t secondarySize> >+constexpr const TType *GetForVecMatHelper(uint8_t primarySize) > { > static_assert(basicType == EbtFloat || basicType == EbtInt || basicType == EbtUInt || > basicType == EbtBool, >@@ -256,7 +253,7 @@ constexpr const TType *GetForVecMatHelper(unsigned char primarySize) > } // namespace Helpers > > template <TBasicType basicType, TPrecision precision, TQualifier qualifier = EvqGlobal> >-constexpr const TType *GetForVecMat(unsigned char primarySize, unsigned char secondarySize = 1) >+constexpr const TType *GetForVecMat(uint8_t primarySize, uint8_t secondarySize = 1) > { > static_assert(basicType == EbtFloat || basicType == EbtInt || basicType == EbtUInt || > basicType == EbtBool, >@@ -278,7 +275,7 @@ constexpr const TType *GetForVecMat(unsigned char primarySize, unsigned char sec > } > > template <TBasicType basicType, TPrecision precision> >-constexpr const TType *GetForVec(TQualifier qualifier, unsigned char size) >+constexpr const TType *GetForVec(TQualifier qualifier, uint8_t size) > { > switch (qualifier) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp >index 669b8f509104f21c2a5c017baac3b0e85c3b70e2..eae602f5eaeca776abd299d11e66f15c7cd4eaf2 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/StructureHLSL.cpp >@@ -462,15 +462,15 @@ TString StructureHLSL::addBuiltInConstructor(const TType &type, const TIntermSeq > > if (ctorType.isMatrix() && ctorParameters.size() == 1) > { >- int rows = ctorType.getRows(); >- int cols = ctorType.getCols(); >+ uint8_t rows = ctorType.getRows(); >+ uint8_t cols = ctorType.getCols(); > const TType ¶meter = ctorParameters[0]; > > if (parameter.isScalar()) > { >- for (int col = 0; col < cols; col++) >+ for (uint8_t col = 0; col < cols; col++) > { >- for (int row = 0; row < rows; row++) >+ for (uint8_t row = 0; row < rows; row++) > { > constructor += TString((row == col) ? "x0" : "0.0"); > >@@ -483,9 +483,9 @@ TString StructureHLSL::addBuiltInConstructor(const TType &type, const TIntermSeq > } > else if (parameter.isMatrix()) > { >- for (int col = 0; col < cols; col++) >+ for (uint8_t col = 0; col < cols; col++) > { >- for (int row = 0; row < rows; row++) >+ for (uint8_t row = 0; row < rows; row++) > { > if (row < parameter.getRows() && col < parameter.getCols()) > { >@@ -562,7 +562,7 @@ TString StructureHLSL::addBuiltInConstructor(const TType &type, const TIntermSeq > } > else if (parameter.isMatrix()) > { >- int column = 0; >+ uint8_t column = 0; > while (remainingComponents > 0 && column < parameter.getCols()) > { > constructor += "[" + str(column) + "]"; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_ESSL_autogen.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_ESSL_autogen.cpp >index a3ac5ae83c45e9bcea7be8ae13b9063ba2e6b092..bff0e11988da92d570e104dd502c1b5ee59a7904 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_ESSL_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_ESSL_autogen.cpp >@@ -641,6 +641,9 @@ 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::textureSizeExt_Sampler2DMSArray1; > constexpr const TSymbolUniqueId BuiltInId::textureSizeExt_ISampler2DMSArray1; > constexpr const TSymbolUniqueId BuiltInId::textureSizeExt_USampler2DMSArray1; >@@ -677,6 +680,9 @@ 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::texelFetchExt_Sampler2DMSArray1_Int3_Int1; > constexpr const TSymbolUniqueId BuiltInId::texelFetchExt_ISampler2DMSArray1_Int3_Int1; > constexpr const TSymbolUniqueId BuiltInId::texelFetchExt_USampler2DMSArray1_Int3_Int1; >@@ -1083,6 +1089,570 @@ constexpr const TSymbolUniqueId BuiltInId::imageLoad_UImageBuffer1_Int1; > constexpr const TSymbolUniqueId BuiltInId::imageLoadExt_ImageBuffer1_Int1; > constexpr const TSymbolUniqueId BuiltInId::imageLoadExt_IImageBuffer1_Int1; > constexpr const TSymbolUniqueId BuiltInId::imageLoadExt_UImageBuffer1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_ImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_Image2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_IImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAdd_UImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_ImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_Image2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_IImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMin_UImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_ImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_Image2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_IImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicMax_UImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_ImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_Image2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_IImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicAnd_UImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_ImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_Image2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_IImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicOr_UImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_ImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_Image2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_IImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicXor_UImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2D1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage3D1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageCube1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageBuffer1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageCubeArray1_Int3_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage1D1_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage1DArray1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageRect1_Int2_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DMS1_Int2_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DMSArray1_Int3_Int1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2D1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage3D1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageCube1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageBuffer1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageCubeArray1_Int3_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage1D1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage1DArray1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageRect1_Int2_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DMS1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DMSArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2D1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2D1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2D1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image3D1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage3D1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage3D1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageCube1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageCube1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageCube1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageBuffer1_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageBuffer1_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageBuffer1_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DArray1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DArray1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DArray1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageCubeArray1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageCubeArray1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageCubeArray1_Int3_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image1D1_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage1D1_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage1D1_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image1DArray1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage1DArray1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage1DArray1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_ImageRect1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImageRect1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImageRect1_Int2_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DMS1_Int2_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DMS1_Int2_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DMS1_Int2_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_Image2DMSArray1_Int3_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_IImage2DMSArray1_Int3_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicExchange_UImage2DMSArray1_Int3_Int1_Float1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image2D1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage2D1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage2D1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image3D1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage3D1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage3D1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageCube1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageCube1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageCube1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageBuffer1_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageBuffer1_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageBuffer1_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image2DArray1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage2DArray1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage2DArray1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageCubeArray1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageCubeArray1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageCubeArray1_Int3_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image1D1_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage1D1_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage1D1_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image1DArray1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage1DArray1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage1DArray1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageRect1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageRect1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageRect1_Int2_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image2DMS1_Int2_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage2DMS1_Int2_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage2DMS1_Int2_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId >+ BuiltInId::imageAtomicCompSwap_Image2DMSArray1_Int3_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId >+ BuiltInId::imageAtomicCompSwap_IImage2DMSArray1_Int3_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId >+ BuiltInId::imageAtomicCompSwap_UImage2DMSArray1_Int3_Int1_UInt1_UInt1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image2D1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage2D1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage2D1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image3D1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage3D1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage3D1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageCube1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageCube1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageCube1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageBuffer1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageBuffer1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageBuffer1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image2DArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage2DArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage2DArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageCubeArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageCubeArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageCubeArray1_Int3_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image1D1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage1D1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage1D1_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image1DArray1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage1DArray1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage1DArray1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_ImageRect1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImageRect1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImageRect1_Int2_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image2DMS1_Int2_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage2DMS1_Int2_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage2DMS1_Int2_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_Image2DMSArray1_Int3_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_IImage2DMSArray1_Int3_Int1_Int1_Int1; >+constexpr const TSymbolUniqueId BuiltInId::imageAtomicCompSwap_UImage2DMSArray1_Int3_Int1_Int1_Int1; > constexpr const TSymbolUniqueId BuiltInId::imageAtomicAddExt_Image2D1_Int2_UInt1; > constexpr const TSymbolUniqueId BuiltInId::imageAtomicAddExt_IImage2D1_Int2_UInt1; > constexpr const TSymbolUniqueId BuiltInId::imageAtomicAddExt_UImage2D1_Int2_UInt1; >@@ -1876,7 +2446,7 @@ constexpr const TSymbolUniqueId BuiltInId::gl_PositionTES; > constexpr const TSymbolUniqueId BuiltInId::gl_PositionTESES3_2; > constexpr const TSymbolUniqueId BuiltInId::gl_ViewID_OVR; > >-const int TSymbolTable::kLastBuiltInId = 5002; >+const int TSymbolTable::kLastBuiltInId = 5569; > > namespace BuiltInName > { >@@ -2084,13 +2654,21 @@ constexpr const ImmutableString gl_out("gl_out"); > constexpr const ImmutableString greaterThan("greaterThan"); > constexpr const ImmutableString greaterThanEqual("greaterThanEqual"); > constexpr const ImmutableString groupMemoryBarrier("groupMemoryBarrier"); >+constexpr const ImmutableString imageAtomicAdd("imageAtomicAdd"); > constexpr const ImmutableString imageAtomicAddExt("imageAtomicAdd"); >+constexpr const ImmutableString imageAtomicAnd("imageAtomicAnd"); > constexpr const ImmutableString imageAtomicAndExt("imageAtomicAnd"); >+constexpr const ImmutableString imageAtomicCompSwap("imageAtomicCompSwap"); > constexpr const ImmutableString imageAtomicCompSwapExt("imageAtomicCompSwap"); >+constexpr const ImmutableString imageAtomicExchange("imageAtomicExchange"); > constexpr const ImmutableString imageAtomicExchangeExt("imageAtomicExchange"); >+constexpr const ImmutableString imageAtomicMax("imageAtomicMax"); > constexpr const ImmutableString imageAtomicMaxExt("imageAtomicMax"); >+constexpr const ImmutableString imageAtomicMin("imageAtomicMin"); > constexpr const ImmutableString imageAtomicMinExt("imageAtomicMin"); >+constexpr const ImmutableString imageAtomicOr("imageAtomicOr"); > constexpr const ImmutableString imageAtomicOrExt("imageAtomicOr"); >+constexpr const ImmutableString imageAtomicXor("imageAtomicXor"); > constexpr const ImmutableString imageAtomicXorExt("imageAtomicXor"); > constexpr const ImmutableString imageLoad("imageLoad"); > constexpr const ImmutableString imageLoadExt("imageLoad"); >@@ -9413,6 +9991,30 @@ constexpr const TFunction textureSizeExt_00b( > StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 2, 1>(), > EOpTextureSize, > false); >+constexpr const TFunction textureSize_00Q(BuiltInId::textureSize_Sampler2DMSArray1, >+ BuiltInName::textureSize, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00Q20D00D, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpTextureSize, >+ false); >+constexpr const TFunction textureSize_00W(BuiltInId::textureSize_ISampler2DMSArray1, >+ BuiltInName::textureSize, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00W20D00D, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpTextureSize, >+ false); >+constexpr const TFunction textureSize_00c(BuiltInId::textureSize_USampler2DMSArray1, >+ BuiltInName::textureSize, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00c20D00D, >+ 1, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 3, 1>(), >+ EOpTextureSize, >+ false); > constexpr const TFunction textureSizeExt_00Q( > BuiltInId::textureSizeExt_Sampler2DMSArray1, > BuiltInName::textureSizeExt, >@@ -9737,6 +10339,33 @@ constexpr const TFunction texelFetchExt_00b10D00D( > StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), > EOpTexelFetch, > false); >+constexpr const TFunction texelFetch_00Q20D00D( >+ BuiltInId::texelFetch_Sampler2DMSArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00Q20D00D, >+ 3, >+ StaticType::Get<EbtFloat, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpTexelFetch, >+ false); >+constexpr const TFunction texelFetch_00W20D00D( >+ BuiltInId::texelFetch_ISampler2DMSArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00W20D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpTexelFetch, >+ false); >+constexpr const TFunction texelFetch_00c20D00D( >+ BuiltInId::texelFetch_USampler2DMSArray1_Int3_Int1, >+ BuiltInName::texelFetch, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00c20D00D, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), >+ EOpTexelFetch, >+ false); > constexpr const TFunction texelFetchExt_00Q20D00D( > BuiltInId::texelFetchExt_Sampler2DMSArray1_Int3_Int1, > BuiltInName::texelFetchExt, >@@ -13163,6 +13792,5055 @@ constexpr const TFunction imageLoadExt_01f00D( > StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 4, 1>(), > EOpImageLoad, > false); >+constexpr const TFunction imageAtomicAdd_00z10D00E( >+ BuiltInId::imageAtomicAdd_Image2D1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01K10D00E( >+ BuiltInId::imageAtomicAdd_IImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01V10D00E( >+ BuiltInId::imageAtomicAdd_UImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01A20D00E( >+ BuiltInId::imageAtomicAdd_Image3D1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01L20D00E( >+ BuiltInId::imageAtomicAdd_IImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01W20D00E( >+ BuiltInId::imageAtomicAdd_UImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01C20D00E( >+ BuiltInId::imageAtomicAdd_ImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01N20D00E( >+ BuiltInId::imageAtomicAdd_IImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01Y20D00E( >+ BuiltInId::imageAtomicAdd_UImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01J00D00E( >+ BuiltInId::imageAtomicAdd_ImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01U00D00E( >+ BuiltInId::imageAtomicAdd_IImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01f00D00E( >+ BuiltInId::imageAtomicAdd_UImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01B20D00E( >+ BuiltInId::imageAtomicAdd_Image2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01M20D00E( >+ BuiltInId::imageAtomicAdd_IImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01X20D00E( >+ BuiltInId::imageAtomicAdd_UImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01H20D00E( >+ BuiltInId::imageAtomicAdd_ImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01S20D00E( >+ BuiltInId::imageAtomicAdd_IImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01d20D00E( >+ BuiltInId::imageAtomicAdd_UImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01D00D00E( >+ BuiltInId::imageAtomicAdd_Image1D1_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01O00D00E( >+ BuiltInId::imageAtomicAdd_IImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01Z00D00E( >+ BuiltInId::imageAtomicAdd_UImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01E10D00E( >+ BuiltInId::imageAtomicAdd_Image1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01P10D00E( >+ BuiltInId::imageAtomicAdd_IImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01a10D00E( >+ BuiltInId::imageAtomicAdd_UImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01I10D00E( >+ BuiltInId::imageAtomicAdd_ImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01T10D00E( >+ BuiltInId::imageAtomicAdd_IImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01e10D00E( >+ BuiltInId::imageAtomicAdd_UImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01F10D00D00E( >+ BuiltInId::imageAtomicAdd_Image2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01Q10D00D00E( >+ BuiltInId::imageAtomicAdd_IImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01b10D00D00E( >+ BuiltInId::imageAtomicAdd_UImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01G20D00D00E( >+ BuiltInId::imageAtomicAdd_Image2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01R20D00D00E( >+ BuiltInId::imageAtomicAdd_IImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01c20D00D00E( >+ BuiltInId::imageAtomicAdd_UImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_00z10D00D( >+ BuiltInId::imageAtomicAdd_Image2D1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01K10D00D( >+ BuiltInId::imageAtomicAdd_IImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01V10D00D( >+ BuiltInId::imageAtomicAdd_UImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01A20D00D( >+ BuiltInId::imageAtomicAdd_Image3D1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01L20D00D( >+ BuiltInId::imageAtomicAdd_IImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01W20D00D( >+ BuiltInId::imageAtomicAdd_UImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01C20D00D( >+ BuiltInId::imageAtomicAdd_ImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01N20D00D( >+ BuiltInId::imageAtomicAdd_IImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01Y20D00D( >+ BuiltInId::imageAtomicAdd_UImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01J00D00D( >+ BuiltInId::imageAtomicAdd_ImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01U00D00D( >+ BuiltInId::imageAtomicAdd_IImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01f00D00D( >+ BuiltInId::imageAtomicAdd_UImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01B20D00D( >+ BuiltInId::imageAtomicAdd_Image2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01M20D00D( >+ BuiltInId::imageAtomicAdd_IImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01X20D00D( >+ BuiltInId::imageAtomicAdd_UImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01H20D00D( >+ BuiltInId::imageAtomicAdd_ImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01S20D00D( >+ BuiltInId::imageAtomicAdd_IImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01d20D00D( >+ BuiltInId::imageAtomicAdd_UImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01D00D00D( >+ BuiltInId::imageAtomicAdd_Image1D1_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01O00D00D( >+ BuiltInId::imageAtomicAdd_IImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01Z00D00D( >+ BuiltInId::imageAtomicAdd_UImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01E10D00D( >+ BuiltInId::imageAtomicAdd_Image1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01P10D00D( >+ BuiltInId::imageAtomicAdd_IImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01a10D00D( >+ BuiltInId::imageAtomicAdd_UImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01I10D00D( >+ BuiltInId::imageAtomicAdd_ImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01T10D00D( >+ BuiltInId::imageAtomicAdd_IImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01e10D00D( >+ BuiltInId::imageAtomicAdd_UImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01F10D00D00D( >+ BuiltInId::imageAtomicAdd_Image2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01Q10D00D00D( >+ BuiltInId::imageAtomicAdd_IImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01b10D00D00D( >+ BuiltInId::imageAtomicAdd_UImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01G20D00D00D( >+ BuiltInId::imageAtomicAdd_Image2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01R20D00D00D( >+ BuiltInId::imageAtomicAdd_IImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicAdd_01c20D00D00D( >+ BuiltInId::imageAtomicAdd_UImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicAdd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAdd, >+ false); >+constexpr const TFunction imageAtomicMin_00z10D00E( >+ BuiltInId::imageAtomicMin_Image2D1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01K10D00E( >+ BuiltInId::imageAtomicMin_IImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01V10D00E( >+ BuiltInId::imageAtomicMin_UImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01A20D00E( >+ BuiltInId::imageAtomicMin_Image3D1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01L20D00E( >+ BuiltInId::imageAtomicMin_IImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01W20D00E( >+ BuiltInId::imageAtomicMin_UImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01C20D00E( >+ BuiltInId::imageAtomicMin_ImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01N20D00E( >+ BuiltInId::imageAtomicMin_IImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01Y20D00E( >+ BuiltInId::imageAtomicMin_UImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01J00D00E( >+ BuiltInId::imageAtomicMin_ImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01U00D00E( >+ BuiltInId::imageAtomicMin_IImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01f00D00E( >+ BuiltInId::imageAtomicMin_UImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01B20D00E( >+ BuiltInId::imageAtomicMin_Image2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01M20D00E( >+ BuiltInId::imageAtomicMin_IImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01X20D00E( >+ BuiltInId::imageAtomicMin_UImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01H20D00E( >+ BuiltInId::imageAtomicMin_ImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01S20D00E( >+ BuiltInId::imageAtomicMin_IImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01d20D00E( >+ BuiltInId::imageAtomicMin_UImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01D00D00E( >+ BuiltInId::imageAtomicMin_Image1D1_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01O00D00E( >+ BuiltInId::imageAtomicMin_IImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01Z00D00E( >+ BuiltInId::imageAtomicMin_UImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01E10D00E( >+ BuiltInId::imageAtomicMin_Image1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01P10D00E( >+ BuiltInId::imageAtomicMin_IImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01a10D00E( >+ BuiltInId::imageAtomicMin_UImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01I10D00E( >+ BuiltInId::imageAtomicMin_ImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01T10D00E( >+ BuiltInId::imageAtomicMin_IImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01e10D00E( >+ BuiltInId::imageAtomicMin_UImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01F10D00D00E( >+ BuiltInId::imageAtomicMin_Image2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01Q10D00D00E( >+ BuiltInId::imageAtomicMin_IImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01b10D00D00E( >+ BuiltInId::imageAtomicMin_UImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01G20D00D00E( >+ BuiltInId::imageAtomicMin_Image2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01R20D00D00E( >+ BuiltInId::imageAtomicMin_IImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01c20D00D00E( >+ BuiltInId::imageAtomicMin_UImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_00z10D00D( >+ BuiltInId::imageAtomicMin_Image2D1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01K10D00D( >+ BuiltInId::imageAtomicMin_IImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01V10D00D( >+ BuiltInId::imageAtomicMin_UImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01A20D00D( >+ BuiltInId::imageAtomicMin_Image3D1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01L20D00D( >+ BuiltInId::imageAtomicMin_IImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01W20D00D( >+ BuiltInId::imageAtomicMin_UImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01C20D00D( >+ BuiltInId::imageAtomicMin_ImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01N20D00D( >+ BuiltInId::imageAtomicMin_IImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01Y20D00D( >+ BuiltInId::imageAtomicMin_UImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01J00D00D( >+ BuiltInId::imageAtomicMin_ImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01U00D00D( >+ BuiltInId::imageAtomicMin_IImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01f00D00D( >+ BuiltInId::imageAtomicMin_UImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01B20D00D( >+ BuiltInId::imageAtomicMin_Image2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01M20D00D( >+ BuiltInId::imageAtomicMin_IImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01X20D00D( >+ BuiltInId::imageAtomicMin_UImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01H20D00D( >+ BuiltInId::imageAtomicMin_ImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01S20D00D( >+ BuiltInId::imageAtomicMin_IImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01d20D00D( >+ BuiltInId::imageAtomicMin_UImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01D00D00D( >+ BuiltInId::imageAtomicMin_Image1D1_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01O00D00D( >+ BuiltInId::imageAtomicMin_IImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01Z00D00D( >+ BuiltInId::imageAtomicMin_UImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01E10D00D( >+ BuiltInId::imageAtomicMin_Image1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01P10D00D( >+ BuiltInId::imageAtomicMin_IImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01a10D00D( >+ BuiltInId::imageAtomicMin_UImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01I10D00D( >+ BuiltInId::imageAtomicMin_ImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01T10D00D( >+ BuiltInId::imageAtomicMin_IImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01e10D00D( >+ BuiltInId::imageAtomicMin_UImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01F10D00D00D( >+ BuiltInId::imageAtomicMin_Image2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01Q10D00D00D( >+ BuiltInId::imageAtomicMin_IImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01b10D00D00D( >+ BuiltInId::imageAtomicMin_UImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01G20D00D00D( >+ BuiltInId::imageAtomicMin_Image2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01R20D00D00D( >+ BuiltInId::imageAtomicMin_IImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMin_01c20D00D00D( >+ BuiltInId::imageAtomicMin_UImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicMin, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMin, >+ false); >+constexpr const TFunction imageAtomicMax_00z10D00E( >+ BuiltInId::imageAtomicMax_Image2D1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01K10D00E( >+ BuiltInId::imageAtomicMax_IImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01V10D00E( >+ BuiltInId::imageAtomicMax_UImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01A20D00E( >+ BuiltInId::imageAtomicMax_Image3D1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01L20D00E( >+ BuiltInId::imageAtomicMax_IImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01W20D00E( >+ BuiltInId::imageAtomicMax_UImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01C20D00E( >+ BuiltInId::imageAtomicMax_ImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01N20D00E( >+ BuiltInId::imageAtomicMax_IImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01Y20D00E( >+ BuiltInId::imageAtomicMax_UImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01J00D00E( >+ BuiltInId::imageAtomicMax_ImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01U00D00E( >+ BuiltInId::imageAtomicMax_IImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01f00D00E( >+ BuiltInId::imageAtomicMax_UImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01B20D00E( >+ BuiltInId::imageAtomicMax_Image2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01M20D00E( >+ BuiltInId::imageAtomicMax_IImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01X20D00E( >+ BuiltInId::imageAtomicMax_UImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01H20D00E( >+ BuiltInId::imageAtomicMax_ImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01S20D00E( >+ BuiltInId::imageAtomicMax_IImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01d20D00E( >+ BuiltInId::imageAtomicMax_UImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01D00D00E( >+ BuiltInId::imageAtomicMax_Image1D1_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01O00D00E( >+ BuiltInId::imageAtomicMax_IImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01Z00D00E( >+ BuiltInId::imageAtomicMax_UImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01E10D00E( >+ BuiltInId::imageAtomicMax_Image1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01P10D00E( >+ BuiltInId::imageAtomicMax_IImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01a10D00E( >+ BuiltInId::imageAtomicMax_UImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01I10D00E( >+ BuiltInId::imageAtomicMax_ImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01T10D00E( >+ BuiltInId::imageAtomicMax_IImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01e10D00E( >+ BuiltInId::imageAtomicMax_UImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01F10D00D00E( >+ BuiltInId::imageAtomicMax_Image2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01Q10D00D00E( >+ BuiltInId::imageAtomicMax_IImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01b10D00D00E( >+ BuiltInId::imageAtomicMax_UImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01G20D00D00E( >+ BuiltInId::imageAtomicMax_Image2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01R20D00D00E( >+ BuiltInId::imageAtomicMax_IImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01c20D00D00E( >+ BuiltInId::imageAtomicMax_UImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_00z10D00D( >+ BuiltInId::imageAtomicMax_Image2D1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01K10D00D( >+ BuiltInId::imageAtomicMax_IImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01V10D00D( >+ BuiltInId::imageAtomicMax_UImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01A20D00D( >+ BuiltInId::imageAtomicMax_Image3D1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01L20D00D( >+ BuiltInId::imageAtomicMax_IImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01W20D00D( >+ BuiltInId::imageAtomicMax_UImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01C20D00D( >+ BuiltInId::imageAtomicMax_ImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01N20D00D( >+ BuiltInId::imageAtomicMax_IImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01Y20D00D( >+ BuiltInId::imageAtomicMax_UImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01J00D00D( >+ BuiltInId::imageAtomicMax_ImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01U00D00D( >+ BuiltInId::imageAtomicMax_IImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01f00D00D( >+ BuiltInId::imageAtomicMax_UImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01B20D00D( >+ BuiltInId::imageAtomicMax_Image2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01M20D00D( >+ BuiltInId::imageAtomicMax_IImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01X20D00D( >+ BuiltInId::imageAtomicMax_UImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01H20D00D( >+ BuiltInId::imageAtomicMax_ImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01S20D00D( >+ BuiltInId::imageAtomicMax_IImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01d20D00D( >+ BuiltInId::imageAtomicMax_UImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01D00D00D( >+ BuiltInId::imageAtomicMax_Image1D1_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01O00D00D( >+ BuiltInId::imageAtomicMax_IImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01Z00D00D( >+ BuiltInId::imageAtomicMax_UImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01E10D00D( >+ BuiltInId::imageAtomicMax_Image1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01P10D00D( >+ BuiltInId::imageAtomicMax_IImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01a10D00D( >+ BuiltInId::imageAtomicMax_UImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01I10D00D( >+ BuiltInId::imageAtomicMax_ImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01T10D00D( >+ BuiltInId::imageAtomicMax_IImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01e10D00D( >+ BuiltInId::imageAtomicMax_UImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01F10D00D00D( >+ BuiltInId::imageAtomicMax_Image2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01Q10D00D00D( >+ BuiltInId::imageAtomicMax_IImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01b10D00D00D( >+ BuiltInId::imageAtomicMax_UImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01G20D00D00D( >+ BuiltInId::imageAtomicMax_Image2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01R20D00D00D( >+ BuiltInId::imageAtomicMax_IImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicMax_01c20D00D00D( >+ BuiltInId::imageAtomicMax_UImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicMax, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicMax, >+ false); >+constexpr const TFunction imageAtomicAnd_00z10D00E( >+ BuiltInId::imageAtomicAnd_Image2D1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01K10D00E( >+ BuiltInId::imageAtomicAnd_IImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01V10D00E( >+ BuiltInId::imageAtomicAnd_UImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01A20D00E( >+ BuiltInId::imageAtomicAnd_Image3D1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01L20D00E( >+ BuiltInId::imageAtomicAnd_IImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01W20D00E( >+ BuiltInId::imageAtomicAnd_UImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01C20D00E( >+ BuiltInId::imageAtomicAnd_ImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01N20D00E( >+ BuiltInId::imageAtomicAnd_IImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01Y20D00E( >+ BuiltInId::imageAtomicAnd_UImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01J00D00E( >+ BuiltInId::imageAtomicAnd_ImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01U00D00E( >+ BuiltInId::imageAtomicAnd_IImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01f00D00E( >+ BuiltInId::imageAtomicAnd_UImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01B20D00E( >+ BuiltInId::imageAtomicAnd_Image2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01M20D00E( >+ BuiltInId::imageAtomicAnd_IImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01X20D00E( >+ BuiltInId::imageAtomicAnd_UImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01H20D00E( >+ BuiltInId::imageAtomicAnd_ImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01S20D00E( >+ BuiltInId::imageAtomicAnd_IImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01d20D00E( >+ BuiltInId::imageAtomicAnd_UImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01D00D00E( >+ BuiltInId::imageAtomicAnd_Image1D1_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01O00D00E( >+ BuiltInId::imageAtomicAnd_IImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01Z00D00E( >+ BuiltInId::imageAtomicAnd_UImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01E10D00E( >+ BuiltInId::imageAtomicAnd_Image1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01P10D00E( >+ BuiltInId::imageAtomicAnd_IImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01a10D00E( >+ BuiltInId::imageAtomicAnd_UImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01I10D00E( >+ BuiltInId::imageAtomicAnd_ImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01T10D00E( >+ BuiltInId::imageAtomicAnd_IImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01e10D00E( >+ BuiltInId::imageAtomicAnd_UImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01F10D00D00E( >+ BuiltInId::imageAtomicAnd_Image2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01Q10D00D00E( >+ BuiltInId::imageAtomicAnd_IImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01b10D00D00E( >+ BuiltInId::imageAtomicAnd_UImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01G20D00D00E( >+ BuiltInId::imageAtomicAnd_Image2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01R20D00D00E( >+ BuiltInId::imageAtomicAnd_IImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01c20D00D00E( >+ BuiltInId::imageAtomicAnd_UImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_00z10D00D( >+ BuiltInId::imageAtomicAnd_Image2D1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01K10D00D( >+ BuiltInId::imageAtomicAnd_IImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01V10D00D( >+ BuiltInId::imageAtomicAnd_UImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01A20D00D( >+ BuiltInId::imageAtomicAnd_Image3D1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01L20D00D( >+ BuiltInId::imageAtomicAnd_IImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01W20D00D( >+ BuiltInId::imageAtomicAnd_UImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01C20D00D( >+ BuiltInId::imageAtomicAnd_ImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01N20D00D( >+ BuiltInId::imageAtomicAnd_IImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01Y20D00D( >+ BuiltInId::imageAtomicAnd_UImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01J00D00D( >+ BuiltInId::imageAtomicAnd_ImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01U00D00D( >+ BuiltInId::imageAtomicAnd_IImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01f00D00D( >+ BuiltInId::imageAtomicAnd_UImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01B20D00D( >+ BuiltInId::imageAtomicAnd_Image2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01M20D00D( >+ BuiltInId::imageAtomicAnd_IImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01X20D00D( >+ BuiltInId::imageAtomicAnd_UImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01H20D00D( >+ BuiltInId::imageAtomicAnd_ImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01S20D00D( >+ BuiltInId::imageAtomicAnd_IImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01d20D00D( >+ BuiltInId::imageAtomicAnd_UImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01D00D00D( >+ BuiltInId::imageAtomicAnd_Image1D1_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01O00D00D( >+ BuiltInId::imageAtomicAnd_IImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01Z00D00D( >+ BuiltInId::imageAtomicAnd_UImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01E10D00D( >+ BuiltInId::imageAtomicAnd_Image1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01P10D00D( >+ BuiltInId::imageAtomicAnd_IImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01a10D00D( >+ BuiltInId::imageAtomicAnd_UImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01I10D00D( >+ BuiltInId::imageAtomicAnd_ImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01T10D00D( >+ BuiltInId::imageAtomicAnd_IImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01e10D00D( >+ BuiltInId::imageAtomicAnd_UImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01F10D00D00D( >+ BuiltInId::imageAtomicAnd_Image2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01Q10D00D00D( >+ BuiltInId::imageAtomicAnd_IImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01b10D00D00D( >+ BuiltInId::imageAtomicAnd_UImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01G20D00D00D( >+ BuiltInId::imageAtomicAnd_Image2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01R20D00D00D( >+ BuiltInId::imageAtomicAnd_IImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicAnd_01c20D00D00D( >+ BuiltInId::imageAtomicAnd_UImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicAnd, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicAnd, >+ false); >+constexpr const TFunction imageAtomicOr_00z10D00E( >+ BuiltInId::imageAtomicOr_Image2D1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01K10D00E( >+ BuiltInId::imageAtomicOr_IImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01V10D00E( >+ BuiltInId::imageAtomicOr_UImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01A20D00E( >+ BuiltInId::imageAtomicOr_Image3D1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01L20D00E( >+ BuiltInId::imageAtomicOr_IImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01W20D00E( >+ BuiltInId::imageAtomicOr_UImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01C20D00E( >+ BuiltInId::imageAtomicOr_ImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01N20D00E( >+ BuiltInId::imageAtomicOr_IImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01Y20D00E( >+ BuiltInId::imageAtomicOr_UImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01J00D00E( >+ BuiltInId::imageAtomicOr_ImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01U00D00E( >+ BuiltInId::imageAtomicOr_IImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01f00D00E( >+ BuiltInId::imageAtomicOr_UImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01B20D00E( >+ BuiltInId::imageAtomicOr_Image2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01M20D00E( >+ BuiltInId::imageAtomicOr_IImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01X20D00E( >+ BuiltInId::imageAtomicOr_UImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01H20D00E( >+ BuiltInId::imageAtomicOr_ImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01S20D00E( >+ BuiltInId::imageAtomicOr_IImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01d20D00E( >+ BuiltInId::imageAtomicOr_UImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01D00D00E( >+ BuiltInId::imageAtomicOr_Image1D1_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01O00D00E( >+ BuiltInId::imageAtomicOr_IImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01Z00D00E( >+ BuiltInId::imageAtomicOr_UImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01E10D00E( >+ BuiltInId::imageAtomicOr_Image1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01P10D00E( >+ BuiltInId::imageAtomicOr_IImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01a10D00E( >+ BuiltInId::imageAtomicOr_UImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01I10D00E( >+ BuiltInId::imageAtomicOr_ImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01T10D00E( >+ BuiltInId::imageAtomicOr_IImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01e10D00E( >+ BuiltInId::imageAtomicOr_UImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01F10D00D00E( >+ BuiltInId::imageAtomicOr_Image2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01Q10D00D00E( >+ BuiltInId::imageAtomicOr_IImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01b10D00D00E( >+ BuiltInId::imageAtomicOr_UImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01G20D00D00E( >+ BuiltInId::imageAtomicOr_Image2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01R20D00D00E( >+ BuiltInId::imageAtomicOr_IImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01c20D00D00E( >+ BuiltInId::imageAtomicOr_UImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_00z10D00D( >+ BuiltInId::imageAtomicOr_Image2D1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01K10D00D( >+ BuiltInId::imageAtomicOr_IImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01V10D00D( >+ BuiltInId::imageAtomicOr_UImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01A20D00D( >+ BuiltInId::imageAtomicOr_Image3D1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01L20D00D( >+ BuiltInId::imageAtomicOr_IImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01W20D00D( >+ BuiltInId::imageAtomicOr_UImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01C20D00D( >+ BuiltInId::imageAtomicOr_ImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01N20D00D( >+ BuiltInId::imageAtomicOr_IImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01Y20D00D( >+ BuiltInId::imageAtomicOr_UImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01J00D00D( >+ BuiltInId::imageAtomicOr_ImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01U00D00D( >+ BuiltInId::imageAtomicOr_IImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01f00D00D( >+ BuiltInId::imageAtomicOr_UImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01B20D00D( >+ BuiltInId::imageAtomicOr_Image2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01M20D00D( >+ BuiltInId::imageAtomicOr_IImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01X20D00D( >+ BuiltInId::imageAtomicOr_UImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01H20D00D( >+ BuiltInId::imageAtomicOr_ImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01S20D00D( >+ BuiltInId::imageAtomicOr_IImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01d20D00D( >+ BuiltInId::imageAtomicOr_UImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01D00D00D( >+ BuiltInId::imageAtomicOr_Image1D1_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01O00D00D( >+ BuiltInId::imageAtomicOr_IImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01Z00D00D( >+ BuiltInId::imageAtomicOr_UImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01E10D00D( >+ BuiltInId::imageAtomicOr_Image1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01P10D00D( >+ BuiltInId::imageAtomicOr_IImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01a10D00D( >+ BuiltInId::imageAtomicOr_UImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01I10D00D( >+ BuiltInId::imageAtomicOr_ImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01T10D00D( >+ BuiltInId::imageAtomicOr_IImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01e10D00D( >+ BuiltInId::imageAtomicOr_UImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01F10D00D00D( >+ BuiltInId::imageAtomicOr_Image2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01Q10D00D00D( >+ BuiltInId::imageAtomicOr_IImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01b10D00D00D( >+ BuiltInId::imageAtomicOr_UImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01G20D00D00D( >+ BuiltInId::imageAtomicOr_Image2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01R20D00D00D( >+ BuiltInId::imageAtomicOr_IImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicOr_01c20D00D00D( >+ BuiltInId::imageAtomicOr_UImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicOr, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicOr, >+ false); >+constexpr const TFunction imageAtomicXor_00z10D00E( >+ BuiltInId::imageAtomicXor_Image2D1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01K10D00E( >+ BuiltInId::imageAtomicXor_IImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01V10D00E( >+ BuiltInId::imageAtomicXor_UImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01A20D00E( >+ BuiltInId::imageAtomicXor_Image3D1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01L20D00E( >+ BuiltInId::imageAtomicXor_IImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01W20D00E( >+ BuiltInId::imageAtomicXor_UImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01C20D00E( >+ BuiltInId::imageAtomicXor_ImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01N20D00E( >+ BuiltInId::imageAtomicXor_IImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01Y20D00E( >+ BuiltInId::imageAtomicXor_UImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01J00D00E( >+ BuiltInId::imageAtomicXor_ImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01U00D00E( >+ BuiltInId::imageAtomicXor_IImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01f00D00E( >+ BuiltInId::imageAtomicXor_UImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01B20D00E( >+ BuiltInId::imageAtomicXor_Image2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01M20D00E( >+ BuiltInId::imageAtomicXor_IImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01X20D00E( >+ BuiltInId::imageAtomicXor_UImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01H20D00E( >+ BuiltInId::imageAtomicXor_ImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01S20D00E( >+ BuiltInId::imageAtomicXor_IImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01d20D00E( >+ BuiltInId::imageAtomicXor_UImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01D00D00E( >+ BuiltInId::imageAtomicXor_Image1D1_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01O00D00E( >+ BuiltInId::imageAtomicXor_IImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01Z00D00E( >+ BuiltInId::imageAtomicXor_UImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01E10D00E( >+ BuiltInId::imageAtomicXor_Image1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01P10D00E( >+ BuiltInId::imageAtomicXor_IImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01a10D00E( >+ BuiltInId::imageAtomicXor_UImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01I10D00E( >+ BuiltInId::imageAtomicXor_ImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01T10D00E( >+ BuiltInId::imageAtomicXor_IImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01e10D00E( >+ BuiltInId::imageAtomicXor_UImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01F10D00D00E( >+ BuiltInId::imageAtomicXor_Image2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01Q10D00D00E( >+ BuiltInId::imageAtomicXor_IImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01b10D00D00E( >+ BuiltInId::imageAtomicXor_UImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01G20D00D00E( >+ BuiltInId::imageAtomicXor_Image2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01R20D00D00E( >+ BuiltInId::imageAtomicXor_IImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01c20D00D00E( >+ BuiltInId::imageAtomicXor_UImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_00z10D00D( >+ BuiltInId::imageAtomicXor_Image2D1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01K10D00D( >+ BuiltInId::imageAtomicXor_IImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01V10D00D( >+ BuiltInId::imageAtomicXor_UImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01A20D00D( >+ BuiltInId::imageAtomicXor_Image3D1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01L20D00D( >+ BuiltInId::imageAtomicXor_IImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01W20D00D( >+ BuiltInId::imageAtomicXor_UImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01C20D00D( >+ BuiltInId::imageAtomicXor_ImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01N20D00D( >+ BuiltInId::imageAtomicXor_IImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01Y20D00D( >+ BuiltInId::imageAtomicXor_UImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01J00D00D( >+ BuiltInId::imageAtomicXor_ImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01U00D00D( >+ BuiltInId::imageAtomicXor_IImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01f00D00D( >+ BuiltInId::imageAtomicXor_UImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01B20D00D( >+ BuiltInId::imageAtomicXor_Image2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01M20D00D( >+ BuiltInId::imageAtomicXor_IImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01X20D00D( >+ BuiltInId::imageAtomicXor_UImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01H20D00D( >+ BuiltInId::imageAtomicXor_ImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01S20D00D( >+ BuiltInId::imageAtomicXor_IImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01d20D00D( >+ BuiltInId::imageAtomicXor_UImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01D00D00D( >+ BuiltInId::imageAtomicXor_Image1D1_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01O00D00D( >+ BuiltInId::imageAtomicXor_IImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01Z00D00D( >+ BuiltInId::imageAtomicXor_UImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01E10D00D( >+ BuiltInId::imageAtomicXor_Image1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01P10D00D( >+ BuiltInId::imageAtomicXor_IImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01a10D00D( >+ BuiltInId::imageAtomicXor_UImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01I10D00D( >+ BuiltInId::imageAtomicXor_ImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01T10D00D( >+ BuiltInId::imageAtomicXor_IImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01e10D00D( >+ BuiltInId::imageAtomicXor_UImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01F10D00D00D( >+ BuiltInId::imageAtomicXor_Image2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01Q10D00D00D( >+ BuiltInId::imageAtomicXor_IImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01b10D00D00D( >+ BuiltInId::imageAtomicXor_UImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01G20D00D00D( >+ BuiltInId::imageAtomicXor_Image2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01R20D00D00D( >+ BuiltInId::imageAtomicXor_IImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicXor_01c20D00D00D( >+ BuiltInId::imageAtomicXor_UImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicXor, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicXor, >+ false); >+constexpr const TFunction imageAtomicExchange_00z10D00E( >+ BuiltInId::imageAtomicExchange_Image2D1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01K10D00E( >+ BuiltInId::imageAtomicExchange_IImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01V10D00E( >+ BuiltInId::imageAtomicExchange_UImage2D1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01A20D00E( >+ BuiltInId::imageAtomicExchange_Image3D1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01L20D00E( >+ BuiltInId::imageAtomicExchange_IImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01W20D00E( >+ BuiltInId::imageAtomicExchange_UImage3D1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01C20D00E( >+ BuiltInId::imageAtomicExchange_ImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01N20D00E( >+ BuiltInId::imageAtomicExchange_IImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Y20D00E( >+ BuiltInId::imageAtomicExchange_UImageCube1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01J00D00E( >+ BuiltInId::imageAtomicExchange_ImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01U00D00E( >+ BuiltInId::imageAtomicExchange_IImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01f00D00E( >+ BuiltInId::imageAtomicExchange_UImageBuffer1_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01B20D00E( >+ BuiltInId::imageAtomicExchange_Image2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01M20D00E( >+ BuiltInId::imageAtomicExchange_IImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01X20D00E( >+ BuiltInId::imageAtomicExchange_UImage2DArray1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01H20D00E( >+ BuiltInId::imageAtomicExchange_ImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01S20D00E( >+ BuiltInId::imageAtomicExchange_IImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01d20D00E( >+ BuiltInId::imageAtomicExchange_UImageCubeArray1_Int3_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01D00D00E( >+ BuiltInId::imageAtomicExchange_Image1D1_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01O00D00E( >+ BuiltInId::imageAtomicExchange_IImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Z00D00E( >+ BuiltInId::imageAtomicExchange_UImage1D1_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01E10D00E( >+ BuiltInId::imageAtomicExchange_Image1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01P10D00E( >+ BuiltInId::imageAtomicExchange_IImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01a10D00E( >+ BuiltInId::imageAtomicExchange_UImage1DArray1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01I10D00E( >+ BuiltInId::imageAtomicExchange_ImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01T10D00E( >+ BuiltInId::imageAtomicExchange_IImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01e10D00E( >+ BuiltInId::imageAtomicExchange_UImageRect1_Int2_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 3, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01F10D00D00E( >+ BuiltInId::imageAtomicExchange_Image2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Q10D00D00E( >+ BuiltInId::imageAtomicExchange_IImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01b10D00D00E( >+ BuiltInId::imageAtomicExchange_UImage2DMS1_Int2_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01G20D00D00E( >+ BuiltInId::imageAtomicExchange_Image2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01R20D00D00E( >+ BuiltInId::imageAtomicExchange_IImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01c20D00D00E( >+ BuiltInId::imageAtomicExchange_UImage2DMSArray1_Int3_Int1_UInt1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_00z10D00D( >+ BuiltInId::imageAtomicExchange_Image2D1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01K10D00D( >+ BuiltInId::imageAtomicExchange_IImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01V10D00D( >+ BuiltInId::imageAtomicExchange_UImage2D1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01A20D00D( >+ BuiltInId::imageAtomicExchange_Image3D1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01L20D00D( >+ BuiltInId::imageAtomicExchange_IImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01W20D00D( >+ BuiltInId::imageAtomicExchange_UImage3D1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01C20D00D( >+ BuiltInId::imageAtomicExchange_ImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01N20D00D( >+ BuiltInId::imageAtomicExchange_IImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Y20D00D( >+ BuiltInId::imageAtomicExchange_UImageCube1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01J00D00D( >+ BuiltInId::imageAtomicExchange_ImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01U00D00D( >+ BuiltInId::imageAtomicExchange_IImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01f00D00D( >+ BuiltInId::imageAtomicExchange_UImageBuffer1_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01B20D00D( >+ BuiltInId::imageAtomicExchange_Image2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01M20D00D( >+ BuiltInId::imageAtomicExchange_IImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01X20D00D( >+ BuiltInId::imageAtomicExchange_UImage2DArray1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01H20D00D( >+ BuiltInId::imageAtomicExchange_ImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01S20D00D( >+ BuiltInId::imageAtomicExchange_IImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01d20D00D( >+ BuiltInId::imageAtomicExchange_UImageCubeArray1_Int3_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01D00D00D( >+ BuiltInId::imageAtomicExchange_Image1D1_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01O00D00D( >+ BuiltInId::imageAtomicExchange_IImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Z00D00D( >+ BuiltInId::imageAtomicExchange_UImage1D1_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01E10D00D( >+ BuiltInId::imageAtomicExchange_Image1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01P10D00D( >+ BuiltInId::imageAtomicExchange_IImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01a10D00D( >+ BuiltInId::imageAtomicExchange_UImage1DArray1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01I10D00D( >+ BuiltInId::imageAtomicExchange_ImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01T10D00D( >+ BuiltInId::imageAtomicExchange_IImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01e10D00D( >+ BuiltInId::imageAtomicExchange_UImageRect1_Int2_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01F10D00D00D( >+ BuiltInId::imageAtomicExchange_Image2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Q10D00D00D( >+ BuiltInId::imageAtomicExchange_IImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01b10D00D00D( >+ BuiltInId::imageAtomicExchange_UImage2DMS1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01G20D00D00D( >+ BuiltInId::imageAtomicExchange_Image2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01R20D00D00D( >+ BuiltInId::imageAtomicExchange_IImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01c20D00D00D( >+ BuiltInId::imageAtomicExchange_UImage2DMSArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_00z10D00B( >+ BuiltInId::imageAtomicExchange_Image2D1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01K10D00B( >+ BuiltInId::imageAtomicExchange_IImage2D1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01V10D00B( >+ BuiltInId::imageAtomicExchange_UImage2D1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01A20D00B( >+ BuiltInId::imageAtomicExchange_Image3D1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01L20D00B( >+ BuiltInId::imageAtomicExchange_IImage3D1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01W20D00B( >+ BuiltInId::imageAtomicExchange_UImage3D1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01C20D00B( >+ BuiltInId::imageAtomicExchange_ImageCube1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01N20D00B( >+ BuiltInId::imageAtomicExchange_IImageCube1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Y20D00B( >+ BuiltInId::imageAtomicExchange_UImageCube1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01J00D00B( >+ BuiltInId::imageAtomicExchange_ImageBuffer1_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01U00D00B( >+ BuiltInId::imageAtomicExchange_IImageBuffer1_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01f00D00B( >+ BuiltInId::imageAtomicExchange_UImageBuffer1_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01B20D00B( >+ BuiltInId::imageAtomicExchange_Image2DArray1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01M20D00B( >+ BuiltInId::imageAtomicExchange_IImage2DArray1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01X20D00B( >+ BuiltInId::imageAtomicExchange_UImage2DArray1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01H20D00B( >+ BuiltInId::imageAtomicExchange_ImageCubeArray1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01S20D00B( >+ BuiltInId::imageAtomicExchange_IImageCubeArray1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01d20D00B( >+ BuiltInId::imageAtomicExchange_UImageCubeArray1_Int3_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01D00D00B( >+ BuiltInId::imageAtomicExchange_Image1D1_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01O00D00B( >+ BuiltInId::imageAtomicExchange_IImage1D1_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Z00D00B( >+ BuiltInId::imageAtomicExchange_UImage1D1_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01E10D00B( >+ BuiltInId::imageAtomicExchange_Image1DArray1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01P10D00B( >+ BuiltInId::imageAtomicExchange_IImage1DArray1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01a10D00B( >+ BuiltInId::imageAtomicExchange_UImage1DArray1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01I10D00B( >+ BuiltInId::imageAtomicExchange_ImageRect1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01T10D00B( >+ BuiltInId::imageAtomicExchange_IImageRect1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01e10D00B( >+ BuiltInId::imageAtomicExchange_UImageRect1_Int2_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00B, >+ 3, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01F10D00D00B( >+ BuiltInId::imageAtomicExchange_Image2DMS1_Int2_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01Q10D00D00B( >+ BuiltInId::imageAtomicExchange_IImage2DMS1_Int2_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01b10D00D00B( >+ BuiltInId::imageAtomicExchange_UImage2DMS1_Int2_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01G20D00D00B( >+ BuiltInId::imageAtomicExchange_Image2DMSArray1_Int3_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01R20D00D00B( >+ BuiltInId::imageAtomicExchange_IImage2DMSArray1_Int3_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicExchange_01c20D00D00B( >+ BuiltInId::imageAtomicExchange_UImage2DMSArray1_Int3_Int1_Float1, >+ BuiltInName::imageAtomicExchange, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00B, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicExchange, >+ false); >+constexpr const TFunction imageAtomicCompSwap_00z10D00E00E( >+ BuiltInId::imageAtomicCompSwap_Image2D1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01K10D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImage2D1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01V10D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImage2D1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01A20D00E00E( >+ BuiltInId::imageAtomicCompSwap_Image3D1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01L20D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImage3D1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01W20D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImage3D1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01C20D00E00E( >+ BuiltInId::imageAtomicCompSwap_ImageCube1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01N20D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImageCube1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01Y20D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImageCube1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01J00D00E00E( >+ BuiltInId::imageAtomicCompSwap_ImageBuffer1_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01U00D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImageBuffer1_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01f00D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImageBuffer1_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01B20D00E00E( >+ BuiltInId::imageAtomicCompSwap_Image2DArray1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01M20D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImage2DArray1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01X20D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImage2DArray1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01H20D00E00E( >+ BuiltInId::imageAtomicCompSwap_ImageCubeArray1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01S20D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImageCubeArray1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01d20D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImageCubeArray1_Int3_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01D00D00E00E( >+ BuiltInId::imageAtomicCompSwap_Image1D1_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01O00D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImage1D1_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01Z00D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImage1D1_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01E10D00E00E( >+ BuiltInId::imageAtomicCompSwap_Image1DArray1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01P10D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImage1DArray1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01a10D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImage1DArray1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01I10D00E00E( >+ BuiltInId::imageAtomicCompSwap_ImageRect1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01T10D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImageRect1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01e10D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImageRect1_Int2_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00E00E, >+ 4, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01F10D00D00E00E( >+ BuiltInId::imageAtomicCompSwap_Image2DMS1_Int2_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00E00E, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01Q10D00D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImage2DMS1_Int2_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00E00E, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01b10D00D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImage2DMS1_Int2_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00E00E, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01G20D00D00E00E( >+ BuiltInId::imageAtomicCompSwap_Image2DMSArray1_Int3_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00E00E, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01R20D00D00E00E( >+ BuiltInId::imageAtomicCompSwap_IImage2DMSArray1_Int3_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00E00E, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01c20D00D00E00E( >+ BuiltInId::imageAtomicCompSwap_UImage2DMSArray1_Int3_Int1_UInt1_UInt1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00E00E, >+ 5, >+ StaticType::Get<EbtUInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_00z10D00D00D( >+ BuiltInId::imageAtomicCompSwap_Image2D1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p00z10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01K10D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImage2D1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01K10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01V10D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImage2D1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01V10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01A20D00D00D( >+ BuiltInId::imageAtomicCompSwap_Image3D1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01A20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01L20D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImage3D1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01L20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01W20D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImage3D1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01W20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01C20D00D00D( >+ BuiltInId::imageAtomicCompSwap_ImageCube1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01C20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01N20D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImageCube1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01N20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01Y20D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImageCube1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Y20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01J00D00D00D( >+ BuiltInId::imageAtomicCompSwap_ImageBuffer1_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01J00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01U00D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImageBuffer1_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01U00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01f00D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImageBuffer1_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01f00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01B20D00D00D( >+ BuiltInId::imageAtomicCompSwap_Image2DArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01B20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01M20D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImage2DArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01M20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01X20D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImage2DArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01X20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01H20D00D00D( >+ BuiltInId::imageAtomicCompSwap_ImageCubeArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01H20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01S20D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImageCubeArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01S20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01d20D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImageCubeArray1_Int3_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01d20D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01D00D00D00D( >+ BuiltInId::imageAtomicCompSwap_Image1D1_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01D00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01O00D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImage1D1_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01O00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01Z00D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImage1D1_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Z00D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01E10D00D00D( >+ BuiltInId::imageAtomicCompSwap_Image1DArray1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01E10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01P10D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImage1DArray1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01P10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01a10D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImage1DArray1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01a10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01I10D00D00D( >+ BuiltInId::imageAtomicCompSwap_ImageRect1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01I10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01T10D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImageRect1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01T10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01e10D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImageRect1_Int2_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01e10D00D00D, >+ 4, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01F10D00D00D00D( >+ BuiltInId::imageAtomicCompSwap_Image2DMS1_Int2_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01F10D00D00D00D, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01Q10D00D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImage2DMS1_Int2_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01Q10D00D00D00D, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01b10D00D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImage2DMS1_Int2_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01b10D00D00D00D, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01G20D00D00D00D( >+ BuiltInId::imageAtomicCompSwap_Image2DMSArray1_Int3_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01G20D00D00D00D, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01R20D00D00D00D( >+ BuiltInId::imageAtomicCompSwap_IImage2DMSArray1_Int3_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01R20D00D00D00D, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); >+constexpr const TFunction imageAtomicCompSwap_01c20D00D00D00D( >+ BuiltInId::imageAtomicCompSwap_UImage2DMSArray1_Int3_Int1_Int1_Int1, >+ BuiltInName::imageAtomicCompSwap, >+ std::array<TExtension, 1u>{{TExtension::UNDEFINED}}, >+ BuiltInParameters::p01c20D00D00D00D, >+ 5, >+ StaticType::Get<EbtInt, EbpUndefined, EvqGlobal, 1, 1>(), >+ EOpImageAtomicCompSwap, >+ false); > constexpr const TFunction imageAtomicAddExt_00z10D00E( > BuiltInId::imageAtomicAddExt_Image2D1_Int2_UInt1, > BuiltInName::imageAtomicAddExt, >@@ -19068,10 +24746,13 @@ constexpr SymbolRule kRules[] = { > Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&textureSize_00b), > Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>( > &textureSizeExt_00b), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00Q), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &textureSizeExt_00Q), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00W), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &textureSizeExt_00W), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00c), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &textureSizeExt_00c), > Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(OES_EGL_image_external_essl3)>( >@@ -19114,10 +24795,13 @@ constexpr SymbolRule kRules[] = { > Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&texelFetch_00b10D00D), > Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>( > &texelFetchExt_00b10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00Q20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &texelFetchExt_00Q20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &texelFetchExt_00W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00c20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &texelFetchExt_00c20D00D), > Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(OES_EGL_image_external_essl3)>( >@@ -19615,1126 +25299,1687 @@ constexpr SymbolRule kRules[] = { > Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageLoad_01f00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_buffer)>(&imageLoadExt_01f00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(EXT_texture_buffer)>(&imageLoadExt_01f00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_00z10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_00z10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01K10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01K10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01V10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01V10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01A20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01A20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01L20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01L20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01W20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01W20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01C20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01C20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01N20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01N20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Y20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01J00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01J00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01U00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01U00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01f00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01f00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01B20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01B20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01M20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01M20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01X20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01X20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01H20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01H20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01S20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01S20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01d20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01d20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01O00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01O00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Z00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01E10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01E10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01P10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01P10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01a10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01a10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01I10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01I10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01T10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01T10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01e10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01e10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01F10D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Q10D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01b10D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01G20D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01R20D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01c20D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_00z10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_00z10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01K10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01K10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01V10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01V10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01A20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01A20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01L20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01L20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01W20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01W20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01C20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01C20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01N20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01N20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Y20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Y20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01J00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01J00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01U00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01U00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01f00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01f00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01B20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01B20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01M20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01M20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01X20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01X20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01H20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01H20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01S20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01S20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01d20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01d20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01O00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01O00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Z00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Z00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01E10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01E10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01P10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01P10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01a10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01a10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01I10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01I10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01T10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01T10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01e10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01e10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01F10D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01F10D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Q10D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Q10D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01b10D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01b10D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01G20D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01G20D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01R20D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01R20D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01c20D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01c20D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_00z10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_00z10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01K10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01K10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01V10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01V10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01A20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01A20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01L20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01L20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01W20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01W20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01C20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01C20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01N20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01N20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Y20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Y20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01J00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01J00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01U00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01U00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01f00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01f00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01B20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01B20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01M20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01M20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01X20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01X20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01H20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01H20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01S20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01S20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01d20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01d20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01O00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01O00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Z00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Z00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01E10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01E10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01P10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01P10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01a10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01a10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01I10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01I10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01T10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01T10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01e10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01e10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01F10D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01F10D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Q10D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Q10D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01b10D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01b10D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01G20D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01G20D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01R20D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01R20D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01c20D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01c20D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, 0>(&memoryBarrier_), >@@ -23345,1042 +29590,1042 @@ constexpr uint16_t kMangledOffsets[] = { > 629, // textureSize_00V > 631, // textureSize_00b > 633, // textureSize_00Q >- 634, // textureSize_00W >- 635, // textureSize_00c >- 636, // textureSize_00M00D >- 637, // textureSize_00N00D >- 638, // textureProjLod_00I20B00B >- 639, // textureProjLod_00R20B00B >- 640, // textureProjLod_00X20B00B >- 641, // textureProjLod_00I30B00B >- 642, // textureProjLod_00R30B00B >- 643, // textureProjLod_00X30B00B >- 644, // textureProjLod_00J30B00B >- 645, // textureProjLod_00S30B00B >- 646, // textureProjLod_00Y30B00B >- 647, // textureProjLod_00d30B00B >- 648, // texelFetch_00I10D00D >- 649, // texelFetch_00R10D00D >- 650, // texelFetch_00X10D00D >- 651, // texelFetch_00J20D00D >- 652, // texelFetch_00S20D00D >- 653, // texelFetch_00Y20D00D >- 654, // texelFetch_00L20D00D >- 655, // texelFetch_00U20D00D >- 656, // texelFetch_00a20D00D >- 657, // texelFetch_00j00D >- 660, // texelFetch_00r00D >- 663, // texelFetch_00w00D >- 666, // texelFetch_00P10D00D >- 668, // texelFetch_00V10D00D >- 670, // texelFetch_00b10D00D >- 672, // texelFetch_00Q20D00D >- 673, // texelFetch_00W20D00D >- 674, // texelFetch_00c20D00D >- 675, // texelFetch_00M10D00D >- 676, // texelFetch_00N10D00D >- 677, // textureGrad_00I10B10B10B >- 678, // textureGrad_00R10B10B10B >- 679, // textureGrad_00X10B10B10B >- 680, // textureGrad_00J20B20B20B >- 681, // textureGrad_00S20B20B20B >- 682, // textureGrad_00Y20B20B20B >- 683, // textureGrad_00K20B20B20B >- 684, // textureGrad_00T20B20B20B >- 685, // textureGrad_00Z20B20B20B >- 686, // textureGrad_00d20B10B10B >- 687, // textureGrad_00e30B20B20B >- 688, // textureGrad_00L20B10B10B >- 689, // textureGrad_00U20B10B10B >- 690, // textureGrad_00a20B10B10B >- 691, // textureGrad_00f30B10B10B >- 692, // textureGrad_00k30B20B20B >- 695, // textureGrad_00s30B20B20B >- 698, // textureGrad_00x30B20B20B >- 701, // textureProjGrad_00I20B10B10B >- 702, // textureProjGrad_00R20B10B10B >- 703, // textureProjGrad_00X20B10B10B >- 704, // textureProjGrad_00I30B10B10B >- 705, // textureProjGrad_00R30B10B10B >- 706, // textureProjGrad_00X30B10B10B >- 707, // textureProjGrad_00J30B20B20B >- 708, // textureProjGrad_00S30B20B20B >- 709, // textureProjGrad_00Y30B20B20B >- 710, // textureProjGrad_00d30B10B10B >- 711, // texture_00I10B00B >- 712, // texture_00R10B00B >- 713, // texture_00X10B00B >- 714, // texture_00J20B00B >- 715, // texture_00S20B00B >- 716, // texture_00Y20B00B >- 717, // texture_00K20B00B >- 718, // texture_00T20B00B >- 719, // texture_00Z20B00B >- 720, // texture_00L20B00B >- 721, // texture_00U20B00B >- 722, // texture_00a20B00B >- 723, // textureProj_00I20B00B >- 724, // textureProj_00R20B00B >- 725, // textureProj_00X20B00B >- 726, // textureProj_00I30B00B >- 727, // textureProj_00R30B00B >- 728, // textureProj_00X30B00B >- 729, // textureProj_00J30B00B >- 730, // textureProj_00S30B00B >- 731, // textureProj_00Y30B00B >- 732, // texture_00d20B00B >- 733, // texture_00e30B00B >- 734, // textureProj_00d30B00B >- 735, // texture_00k30B00B >- 738, // texture_00s30B00B >- 741, // texture_00x30B00B >- 744, // texture_00M10B00B >- 745, // textureProj_00M20B00B >- 746, // textureProj_00M30B00B >- 747, // texture_00N10B00B >- 748, // textureProj_00N20B00B >- 749, // textureProj_00N30B00B >- 750, // textureOffset_00I10B10D >- 751, // textureOffset_00R10B10D >- 752, // textureOffset_00X10B10D >- 753, // textureOffset_00J20B20D >- 754, // textureOffset_00S20B20D >- 755, // textureOffset_00Y20B20D >- 756, // textureOffset_00d20B10D >- 757, // textureOffset_00L20B10D >- 758, // textureOffset_00U20B10D >- 759, // textureOffset_00a20B10D >- 760, // textureProjOffset_00I20B10D >- 761, // textureProjOffset_00R20B10D >- 762, // textureProjOffset_00X20B10D >- 763, // textureProjOffset_00I30B10D >- 764, // textureProjOffset_00R30B10D >- 765, // textureProjOffset_00X30B10D >- 766, // textureProjOffset_00J30B20D >- 767, // textureProjOffset_00S30B20D >- 768, // textureProjOffset_00Y30B20D >- 769, // textureProjOffset_00d30B10D >- 770, // textureLodOffset_00I10B00B10D >- 771, // textureLodOffset_00R10B00B10D >- 772, // textureLodOffset_00X10B00B10D >- 773, // textureLodOffset_00J20B00B20D >- 774, // textureLodOffset_00S20B00B20D >- 775, // textureLodOffset_00Y20B00B20D >- 776, // textureLodOffset_00d20B00B10D >- 777, // textureLodOffset_00L20B00B10D >- 778, // textureLodOffset_00U20B00B10D >- 779, // textureLodOffset_00a20B00B10D >- 780, // textureProjLodOffset_00I20B00B10D >- 781, // textureProjLodOffset_00R20B00B10D >- 782, // textureProjLodOffset_00X20B00B10D >- 783, // textureProjLodOffset_00I30B00B10D >- 784, // textureProjLodOffset_00R30B00B10D >- 785, // textureProjLodOffset_00X30B00B10D >- 786, // textureProjLodOffset_00J30B00B20D >- 787, // textureProjLodOffset_00S30B00B20D >- 788, // textureProjLodOffset_00Y30B00B20D >- 789, // textureProjLodOffset_00d30B00B10D >- 790, // texelFetchOffset_00I10D00D10D >- 791, // texelFetchOffset_00R10D00D10D >- 792, // texelFetchOffset_00X10D00D10D >- 793, // texelFetchOffset_00J20D00D20D >- 794, // texelFetchOffset_00S20D00D20D >- 795, // texelFetchOffset_00Y20D00D20D >- 796, // texelFetchOffset_00L20D00D10D >- 797, // texelFetchOffset_00U20D00D10D >- 798, // texelFetchOffset_00a20D00D10D >- 799, // textureGradOffset_00I10B10B10B10D >- 800, // textureGradOffset_00R10B10B10B10D >- 801, // textureGradOffset_00X10B10B10B10D >- 802, // textureGradOffset_00J20B20B20B20D >- 803, // textureGradOffset_00S20B20B20B20D >- 804, // textureGradOffset_00Y20B20B20B20D >- 805, // textureGradOffset_00d20B10B10B10D >- 806, // textureGradOffset_00L20B10B10B10D >- 807, // textureGradOffset_00U20B10B10B10D >- 808, // textureGradOffset_00a20B10B10B10D >- 809, // textureGradOffset_00f30B10B10B10D >- 810, // textureProjGradOffset_00I20B10B10B10D >- 811, // textureProjGradOffset_00R20B10B10B10D >- 812, // textureProjGradOffset_00X20B10B10B10D >- 813, // textureProjGradOffset_00I30B10B10B10D >- 814, // textureProjGradOffset_00R30B10B10B10D >- 815, // textureProjGradOffset_00X30B10B10B10D >- 816, // textureProjGradOffset_00J30B20B20B20D >- 817, // textureProjGradOffset_00S30B20B20B20D >- 818, // textureProjGradOffset_00Y30B20B20B20D >- 819, // textureProjGradOffset_00d30B10B10B10D >- 820, // textureOffset_00I10B10D00B >- 821, // textureOffset_00R10B10D00B >- 822, // textureOffset_00X10B10D00B >- 823, // textureOffset_00J20B20D00B >- 824, // textureOffset_00S20B20D00B >- 825, // textureOffset_00Y20B20D00B >- 826, // textureOffset_00d20B10D00B >- 827, // textureOffset_00L20B10D00B >- 828, // textureOffset_00U20B10D00B >- 829, // textureOffset_00a20B10D00B >- 830, // textureProjOffset_00I20B10D00B >- 831, // textureProjOffset_00R20B10D00B >- 832, // textureProjOffset_00X20B10D00B >- 833, // textureProjOffset_00I30B10D00B >- 834, // textureProjOffset_00R30B10D00B >- 835, // textureProjOffset_00X30B10D00B >- 836, // textureProjOffset_00J30B20D00B >- 837, // textureProjOffset_00S30B20D00B >- 838, // textureProjOffset_00Y30B20D00B >- 839, // textureProjOffset_00d30B10D00B >- 840, // textureGather_00I10B >- 841, // textureGather_00R10B >- 842, // textureGather_00X10B >- 843, // textureGather_00I10B00D >- 844, // textureGather_00R10B00D >- 845, // textureGather_00X10B00D >- 846, // textureGather_00L20B >- 847, // textureGather_00U20B >- 848, // textureGather_00a20B >- 849, // textureGather_00L20B00D >- 850, // textureGather_00U20B00D >- 851, // textureGather_00a20B00D >- 852, // textureGather_00K20B >- 853, // textureGather_00T20B >- 854, // textureGather_00Z20B >- 855, // textureGather_00K20B00D >- 856, // textureGather_00T20B00D >- 857, // textureGather_00Z20B00D >- 858, // textureGather_00k30B >- 861, // textureGather_00s30B >- 864, // textureGather_00x30B >- 867, // textureGather_00k30B00D >- 870, // textureGather_00s30B00D >- 873, // textureGather_00x30B00D >- 876, // textureGather_00l30B00B >- 879, // textureGather_00d10B >- 880, // textureGather_00d10B00B >- 881, // textureGather_00f20B >- 882, // textureGather_00f20B00B >- 883, // textureGather_00e20B >- 884, // textureGather_00e20B00B >- 885, // textureGatherOffset_00I10B10D >- 886, // textureGatherOffset_00R10B10D >- 887, // textureGatherOffset_00X10B10D >- 888, // textureGatherOffset_00L20B10D >- 889, // textureGatherOffset_00U20B10D >- 890, // textureGatherOffset_00a20B10D >- 891, // textureGatherOffset_00d10B00B10D >- 892, // textureGatherOffset_00f20B00B10D >- 893, // textureGatherOffset_00I10B10D00D >- 894, // textureGatherOffset_00R10B10D00D >- 895, // textureGatherOffset_00X10B10D00D >- 896, // textureGatherOffset_00L20B10D00D >- 897, // textureGatherOffset_00U20B10D00D >- 898, // textureGatherOffset_00a20B10D00D >- 899, // textureGatherOffsets_00I10B10Dx4 >- 901, // textureGatherOffsets_00R10B10Dx4 >- 903, // textureGatherOffsets_00X10B10Dx4 >- 905, // textureGatherOffsets_00L20B10Dx4 >- 907, // textureGatherOffsets_00U20B10Dx4 >- 909, // textureGatherOffsets_00a20B10Dx4 >- 911, // textureGatherOffsets_00d10B00B10Dx4 >- 913, // textureGatherOffsets_00f20B00B10Dx4 >- 915, // textureGatherOffsets_00I10B10Dx400D >- 917, // textureGatherOffsets_00R10B10Dx400D >- 919, // textureGatherOffsets_00X10B10Dx400D >- 921, // textureGatherOffsets_00L20B10Dx400D >- 923, // textureGatherOffsets_00U20B10Dx400D >- 925, // textureGatherOffsets_00a20B10Dx400D >- 927, // rgb_2_yuv_20B00H >- 928, // yuv_2_rgb_20B00H >- 929, // dFdx_00B >- 931, // dFdx_10B >- 933, // dFdx_20B >- 935, // dFdx_30B >- 937, // dFdy_00B >- 939, // dFdy_10B >- 941, // dFdy_20B >- 943, // dFdy_30B >- 945, // fwidth_00B >- 947, // fwidth_10B >- 949, // fwidth_20B >- 951, // fwidth_30B >- 953, // interpolateAtCentroid_00B >- 955, // interpolateAtCentroid_10B >- 957, // interpolateAtCentroid_20B >- 959, // interpolateAtCentroid_30B >- 961, // interpolateAtSample_00B00D >- 963, // interpolateAtSample_10B00D >- 965, // interpolateAtSample_20B00D >- 967, // interpolateAtSample_30B00D >- 969, // interpolateAtOffset_00B10B >- 971, // interpolateAtOffset_10B10B >- 973, // interpolateAtOffset_20B10B >- 975, // interpolateAtOffset_30B10B >- 977, // atomicCounter_00G >- 978, // atomicCounterIncrement_00G >- 979, // atomicCounterDecrement_00G >- 980, // atomicAdd_00E00E >- 981, // atomicAdd_00D00D >- 982, // atomicMin_00E00E >- 983, // atomicMin_00D00D >- 984, // atomicMax_00E00E >- 985, // atomicMax_00D00D >- 986, // atomicAnd_00E00E >- 987, // atomicAnd_00D00D >- 988, // atomicOr_00E00E >- 989, // atomicOr_00D00D >- 990, // atomicXor_00E00E >- 991, // atomicXor_00D00D >- 992, // atomicExchange_00E00E >- 993, // atomicExchange_00D00D >- 994, // atomicCompSwap_00E00E00E >- 995, // atomicCompSwap_00D00D00D >- 996, // imageSize_00z >- 997, // imageSize_01K >- 998, // imageSize_01V >- 999, // imageSize_01A >- 1000, // imageSize_01L >- 1001, // imageSize_01W >- 1002, // imageSize_01B >- 1003, // imageSize_01M >- 1004, // imageSize_01X >- 1005, // imageSize_01C >- 1006, // imageSize_01N >- 1007, // imageSize_01Y >- 1008, // imageSize_01H >- 1011, // imageSize_01S >- 1014, // imageSize_01d >- 1017, // imageSize_01J >- 1020, // imageSize_01U >- 1023, // imageSize_01f >- 1026, // imageStore_00z10D30B >- 1027, // imageStore_01K10D30D >- 1028, // imageStore_01V10D30E >- 1029, // imageStore_01A20D30B >- 1030, // imageStore_01L20D30D >- 1031, // imageStore_01W20D30E >- 1032, // imageStore_01B20D30B >- 1033, // imageStore_01M20D30D >- 1034, // imageStore_01X20D30E >- 1035, // imageStore_01C20D30B >- 1036, // imageStore_01N20D30D >- 1037, // imageStore_01Y20D30E >- 1038, // imageStore_01H20D30B >- 1041, // imageStore_01S20D30D >- 1044, // imageStore_01d20D30E >- 1047, // imageStore_01J00D30B >- 1050, // imageStore_01U00D30D >- 1053, // imageStore_01f00D30E >- 1056, // imageLoad_00z10D >- 1057, // imageLoad_01K10D >- 1058, // imageLoad_01V10D >- 1059, // imageLoad_01A20D >- 1060, // imageLoad_01L20D >- 1061, // imageLoad_01W20D >- 1062, // imageLoad_01B20D >- 1063, // imageLoad_01M20D >- 1064, // imageLoad_01X20D >- 1065, // imageLoad_01C20D >- 1066, // imageLoad_01N20D >- 1067, // imageLoad_01Y20D >- 1068, // imageLoad_01H20D >- 1071, // imageLoad_01S20D >- 1074, // imageLoad_01d20D >- 1077, // imageLoad_01J00D >- 1080, // imageLoad_01U00D >- 1083, // imageLoad_01f00D >- 1086, // imageAtomicAdd_00z10D00E >- 1087, // imageAtomicAdd_01K10D00E >- 1088, // imageAtomicAdd_01V10D00E >- 1089, // imageAtomicAdd_01A20D00E >- 1090, // imageAtomicAdd_01L20D00E >- 1091, // imageAtomicAdd_01W20D00E >- 1092, // imageAtomicAdd_01C20D00E >- 1093, // imageAtomicAdd_01N20D00E >- 1094, // imageAtomicAdd_01Y20D00E >- 1095, // imageAtomicAdd_01J00D00E >- 1096, // imageAtomicAdd_01U00D00E >- 1097, // imageAtomicAdd_01f00D00E >- 1098, // imageAtomicAdd_01B20D00E >- 1099, // imageAtomicAdd_01M20D00E >- 1100, // imageAtomicAdd_01X20D00E >- 1101, // imageAtomicAdd_01H20D00E >- 1102, // imageAtomicAdd_01S20D00E >- 1103, // imageAtomicAdd_01d20D00E >- 1104, // imageAtomicAdd_01D00D00E >- 1105, // imageAtomicAdd_01O00D00E >- 1106, // imageAtomicAdd_01Z00D00E >- 1107, // imageAtomicAdd_01E10D00E >- 1108, // imageAtomicAdd_01P10D00E >- 1109, // imageAtomicAdd_01a10D00E >- 1110, // imageAtomicAdd_01I10D00E >- 1111, // imageAtomicAdd_01T10D00E >- 1112, // imageAtomicAdd_01e10D00E >- 1113, // imageAtomicAdd_01F10D00D00E >- 1114, // imageAtomicAdd_01Q10D00D00E >- 1115, // imageAtomicAdd_01b10D00D00E >- 1116, // imageAtomicAdd_01G20D00D00E >- 1117, // imageAtomicAdd_01R20D00D00E >- 1118, // imageAtomicAdd_01c20D00D00E >- 1119, // imageAtomicAdd_00z10D00D >- 1120, // imageAtomicAdd_01K10D00D >- 1121, // imageAtomicAdd_01V10D00D >- 1122, // imageAtomicAdd_01A20D00D >- 1123, // imageAtomicAdd_01L20D00D >- 1124, // imageAtomicAdd_01W20D00D >- 1125, // imageAtomicAdd_01C20D00D >- 1126, // imageAtomicAdd_01N20D00D >- 1127, // imageAtomicAdd_01Y20D00D >- 1128, // imageAtomicAdd_01J00D00D >- 1129, // imageAtomicAdd_01U00D00D >- 1130, // imageAtomicAdd_01f00D00D >- 1131, // imageAtomicAdd_01B20D00D >- 1132, // imageAtomicAdd_01M20D00D >- 1133, // imageAtomicAdd_01X20D00D >- 1134, // imageAtomicAdd_01H20D00D >- 1135, // imageAtomicAdd_01S20D00D >- 1136, // imageAtomicAdd_01d20D00D >- 1137, // imageAtomicAdd_01D00D00D >- 1138, // imageAtomicAdd_01O00D00D >- 1139, // imageAtomicAdd_01Z00D00D >- 1140, // imageAtomicAdd_01E10D00D >- 1141, // imageAtomicAdd_01P10D00D >- 1142, // imageAtomicAdd_01a10D00D >- 1143, // imageAtomicAdd_01I10D00D >- 1144, // imageAtomicAdd_01T10D00D >- 1145, // imageAtomicAdd_01e10D00D >- 1146, // imageAtomicAdd_01F10D00D00D >- 1147, // imageAtomicAdd_01Q10D00D00D >- 1148, // imageAtomicAdd_01b10D00D00D >- 1149, // imageAtomicAdd_01G20D00D00D >- 1150, // imageAtomicAdd_01R20D00D00D >- 1151, // imageAtomicAdd_01c20D00D00D >- 1152, // imageAtomicMin_00z10D00E >- 1153, // imageAtomicMin_01K10D00E >- 1154, // imageAtomicMin_01V10D00E >- 1155, // imageAtomicMin_01A20D00E >- 1156, // imageAtomicMin_01L20D00E >- 1157, // imageAtomicMin_01W20D00E >- 1158, // imageAtomicMin_01C20D00E >- 1159, // imageAtomicMin_01N20D00E >- 1160, // imageAtomicMin_01Y20D00E >- 1161, // imageAtomicMin_01J00D00E >- 1162, // imageAtomicMin_01U00D00E >- 1163, // imageAtomicMin_01f00D00E >- 1164, // imageAtomicMin_01B20D00E >- 1165, // imageAtomicMin_01M20D00E >- 1166, // imageAtomicMin_01X20D00E >- 1167, // imageAtomicMin_01H20D00E >- 1168, // imageAtomicMin_01S20D00E >- 1169, // imageAtomicMin_01d20D00E >- 1170, // imageAtomicMin_01D00D00E >- 1171, // imageAtomicMin_01O00D00E >- 1172, // imageAtomicMin_01Z00D00E >- 1173, // imageAtomicMin_01E10D00E >- 1174, // imageAtomicMin_01P10D00E >- 1175, // imageAtomicMin_01a10D00E >- 1176, // imageAtomicMin_01I10D00E >- 1177, // imageAtomicMin_01T10D00E >- 1178, // imageAtomicMin_01e10D00E >- 1179, // imageAtomicMin_01F10D00D00E >- 1180, // imageAtomicMin_01Q10D00D00E >- 1181, // imageAtomicMin_01b10D00D00E >- 1182, // imageAtomicMin_01G20D00D00E >- 1183, // imageAtomicMin_01R20D00D00E >- 1184, // imageAtomicMin_01c20D00D00E >- 1185, // imageAtomicMin_00z10D00D >- 1186, // imageAtomicMin_01K10D00D >- 1187, // imageAtomicMin_01V10D00D >- 1188, // imageAtomicMin_01A20D00D >- 1189, // imageAtomicMin_01L20D00D >- 1190, // imageAtomicMin_01W20D00D >- 1191, // imageAtomicMin_01C20D00D >- 1192, // imageAtomicMin_01N20D00D >- 1193, // imageAtomicMin_01Y20D00D >- 1194, // imageAtomicMin_01J00D00D >- 1195, // imageAtomicMin_01U00D00D >- 1196, // imageAtomicMin_01f00D00D >- 1197, // imageAtomicMin_01B20D00D >- 1198, // imageAtomicMin_01M20D00D >- 1199, // imageAtomicMin_01X20D00D >- 1200, // imageAtomicMin_01H20D00D >- 1201, // imageAtomicMin_01S20D00D >- 1202, // imageAtomicMin_01d20D00D >- 1203, // imageAtomicMin_01D00D00D >- 1204, // imageAtomicMin_01O00D00D >- 1205, // imageAtomicMin_01Z00D00D >- 1206, // imageAtomicMin_01E10D00D >- 1207, // imageAtomicMin_01P10D00D >- 1208, // imageAtomicMin_01a10D00D >- 1209, // imageAtomicMin_01I10D00D >- 1210, // imageAtomicMin_01T10D00D >- 1211, // imageAtomicMin_01e10D00D >- 1212, // imageAtomicMin_01F10D00D00D >- 1213, // imageAtomicMin_01Q10D00D00D >- 1214, // imageAtomicMin_01b10D00D00D >- 1215, // imageAtomicMin_01G20D00D00D >- 1216, // imageAtomicMin_01R20D00D00D >- 1217, // imageAtomicMin_01c20D00D00D >- 1218, // imageAtomicMax_00z10D00E >- 1219, // imageAtomicMax_01K10D00E >- 1220, // imageAtomicMax_01V10D00E >- 1221, // imageAtomicMax_01A20D00E >- 1222, // imageAtomicMax_01L20D00E >- 1223, // imageAtomicMax_01W20D00E >- 1224, // imageAtomicMax_01C20D00E >- 1225, // imageAtomicMax_01N20D00E >- 1226, // imageAtomicMax_01Y20D00E >- 1227, // imageAtomicMax_01J00D00E >- 1228, // imageAtomicMax_01U00D00E >- 1229, // imageAtomicMax_01f00D00E >- 1230, // imageAtomicMax_01B20D00E >- 1231, // imageAtomicMax_01M20D00E >- 1232, // imageAtomicMax_01X20D00E >- 1233, // imageAtomicMax_01H20D00E >- 1234, // imageAtomicMax_01S20D00E >- 1235, // imageAtomicMax_01d20D00E >- 1236, // imageAtomicMax_01D00D00E >- 1237, // imageAtomicMax_01O00D00E >- 1238, // imageAtomicMax_01Z00D00E >- 1239, // imageAtomicMax_01E10D00E >- 1240, // imageAtomicMax_01P10D00E >- 1241, // imageAtomicMax_01a10D00E >- 1242, // imageAtomicMax_01I10D00E >- 1243, // imageAtomicMax_01T10D00E >- 1244, // imageAtomicMax_01e10D00E >- 1245, // imageAtomicMax_01F10D00D00E >- 1246, // imageAtomicMax_01Q10D00D00E >- 1247, // imageAtomicMax_01b10D00D00E >- 1248, // imageAtomicMax_01G20D00D00E >- 1249, // imageAtomicMax_01R20D00D00E >- 1250, // imageAtomicMax_01c20D00D00E >- 1251, // imageAtomicMax_00z10D00D >- 1252, // imageAtomicMax_01K10D00D >- 1253, // imageAtomicMax_01V10D00D >- 1254, // imageAtomicMax_01A20D00D >- 1255, // imageAtomicMax_01L20D00D >- 1256, // imageAtomicMax_01W20D00D >- 1257, // imageAtomicMax_01C20D00D >- 1258, // imageAtomicMax_01N20D00D >- 1259, // imageAtomicMax_01Y20D00D >- 1260, // imageAtomicMax_01J00D00D >- 1261, // imageAtomicMax_01U00D00D >- 1262, // imageAtomicMax_01f00D00D >- 1263, // imageAtomicMax_01B20D00D >- 1264, // imageAtomicMax_01M20D00D >- 1265, // imageAtomicMax_01X20D00D >- 1266, // imageAtomicMax_01H20D00D >- 1267, // imageAtomicMax_01S20D00D >- 1268, // imageAtomicMax_01d20D00D >- 1269, // imageAtomicMax_01D00D00D >- 1270, // imageAtomicMax_01O00D00D >- 1271, // imageAtomicMax_01Z00D00D >- 1272, // imageAtomicMax_01E10D00D >- 1273, // imageAtomicMax_01P10D00D >- 1274, // imageAtomicMax_01a10D00D >- 1275, // imageAtomicMax_01I10D00D >- 1276, // imageAtomicMax_01T10D00D >- 1277, // imageAtomicMax_01e10D00D >- 1278, // imageAtomicMax_01F10D00D00D >- 1279, // imageAtomicMax_01Q10D00D00D >- 1280, // imageAtomicMax_01b10D00D00D >- 1281, // imageAtomicMax_01G20D00D00D >- 1282, // imageAtomicMax_01R20D00D00D >- 1283, // imageAtomicMax_01c20D00D00D >- 1284, // imageAtomicAnd_00z10D00E >- 1285, // imageAtomicAnd_01K10D00E >- 1286, // imageAtomicAnd_01V10D00E >- 1287, // imageAtomicAnd_01A20D00E >- 1288, // imageAtomicAnd_01L20D00E >- 1289, // imageAtomicAnd_01W20D00E >- 1290, // imageAtomicAnd_01C20D00E >- 1291, // imageAtomicAnd_01N20D00E >- 1292, // imageAtomicAnd_01Y20D00E >- 1293, // imageAtomicAnd_01J00D00E >- 1294, // imageAtomicAnd_01U00D00E >- 1295, // imageAtomicAnd_01f00D00E >- 1296, // imageAtomicAnd_01B20D00E >- 1297, // imageAtomicAnd_01M20D00E >- 1298, // imageAtomicAnd_01X20D00E >- 1299, // imageAtomicAnd_01H20D00E >- 1300, // imageAtomicAnd_01S20D00E >- 1301, // imageAtomicAnd_01d20D00E >- 1302, // imageAtomicAnd_01D00D00E >- 1303, // imageAtomicAnd_01O00D00E >- 1304, // imageAtomicAnd_01Z00D00E >- 1305, // imageAtomicAnd_01E10D00E >- 1306, // imageAtomicAnd_01P10D00E >- 1307, // imageAtomicAnd_01a10D00E >- 1308, // imageAtomicAnd_01I10D00E >- 1309, // imageAtomicAnd_01T10D00E >- 1310, // imageAtomicAnd_01e10D00E >- 1311, // imageAtomicAnd_01F10D00D00E >- 1312, // imageAtomicAnd_01Q10D00D00E >- 1313, // imageAtomicAnd_01b10D00D00E >- 1314, // imageAtomicAnd_01G20D00D00E >- 1315, // imageAtomicAnd_01R20D00D00E >- 1316, // imageAtomicAnd_01c20D00D00E >- 1317, // imageAtomicAnd_00z10D00D >- 1318, // imageAtomicAnd_01K10D00D >- 1319, // imageAtomicAnd_01V10D00D >- 1320, // imageAtomicAnd_01A20D00D >- 1321, // imageAtomicAnd_01L20D00D >- 1322, // imageAtomicAnd_01W20D00D >- 1323, // imageAtomicAnd_01C20D00D >- 1324, // imageAtomicAnd_01N20D00D >- 1325, // imageAtomicAnd_01Y20D00D >- 1326, // imageAtomicAnd_01J00D00D >- 1327, // imageAtomicAnd_01U00D00D >- 1328, // imageAtomicAnd_01f00D00D >- 1329, // imageAtomicAnd_01B20D00D >- 1330, // imageAtomicAnd_01M20D00D >- 1331, // imageAtomicAnd_01X20D00D >- 1332, // imageAtomicAnd_01H20D00D >- 1333, // imageAtomicAnd_01S20D00D >- 1334, // imageAtomicAnd_01d20D00D >- 1335, // imageAtomicAnd_01D00D00D >- 1336, // imageAtomicAnd_01O00D00D >- 1337, // imageAtomicAnd_01Z00D00D >- 1338, // imageAtomicAnd_01E10D00D >- 1339, // imageAtomicAnd_01P10D00D >- 1340, // imageAtomicAnd_01a10D00D >- 1341, // imageAtomicAnd_01I10D00D >- 1342, // imageAtomicAnd_01T10D00D >- 1343, // imageAtomicAnd_01e10D00D >- 1344, // imageAtomicAnd_01F10D00D00D >- 1345, // imageAtomicAnd_01Q10D00D00D >- 1346, // imageAtomicAnd_01b10D00D00D >- 1347, // imageAtomicAnd_01G20D00D00D >- 1348, // imageAtomicAnd_01R20D00D00D >- 1349, // imageAtomicAnd_01c20D00D00D >- 1350, // imageAtomicOr_00z10D00E >- 1351, // imageAtomicOr_01K10D00E >- 1352, // imageAtomicOr_01V10D00E >- 1353, // imageAtomicOr_01A20D00E >- 1354, // imageAtomicOr_01L20D00E >- 1355, // imageAtomicOr_01W20D00E >- 1356, // imageAtomicOr_01C20D00E >- 1357, // imageAtomicOr_01N20D00E >- 1358, // imageAtomicOr_01Y20D00E >- 1359, // imageAtomicOr_01J00D00E >- 1360, // imageAtomicOr_01U00D00E >- 1361, // imageAtomicOr_01f00D00E >- 1362, // imageAtomicOr_01B20D00E >- 1363, // imageAtomicOr_01M20D00E >- 1364, // imageAtomicOr_01X20D00E >- 1365, // imageAtomicOr_01H20D00E >- 1366, // imageAtomicOr_01S20D00E >- 1367, // imageAtomicOr_01d20D00E >- 1368, // imageAtomicOr_01D00D00E >- 1369, // imageAtomicOr_01O00D00E >- 1370, // imageAtomicOr_01Z00D00E >- 1371, // imageAtomicOr_01E10D00E >- 1372, // imageAtomicOr_01P10D00E >- 1373, // imageAtomicOr_01a10D00E >- 1374, // imageAtomicOr_01I10D00E >- 1375, // imageAtomicOr_01T10D00E >- 1376, // imageAtomicOr_01e10D00E >- 1377, // imageAtomicOr_01F10D00D00E >- 1378, // imageAtomicOr_01Q10D00D00E >- 1379, // imageAtomicOr_01b10D00D00E >- 1380, // imageAtomicOr_01G20D00D00E >- 1381, // imageAtomicOr_01R20D00D00E >- 1382, // imageAtomicOr_01c20D00D00E >- 1383, // imageAtomicOr_00z10D00D >- 1384, // imageAtomicOr_01K10D00D >- 1385, // imageAtomicOr_01V10D00D >- 1386, // imageAtomicOr_01A20D00D >- 1387, // imageAtomicOr_01L20D00D >- 1388, // imageAtomicOr_01W20D00D >- 1389, // imageAtomicOr_01C20D00D >- 1390, // imageAtomicOr_01N20D00D >- 1391, // imageAtomicOr_01Y20D00D >- 1392, // imageAtomicOr_01J00D00D >- 1393, // imageAtomicOr_01U00D00D >- 1394, // imageAtomicOr_01f00D00D >- 1395, // imageAtomicOr_01B20D00D >- 1396, // imageAtomicOr_01M20D00D >- 1397, // imageAtomicOr_01X20D00D >- 1398, // imageAtomicOr_01H20D00D >- 1399, // imageAtomicOr_01S20D00D >- 1400, // imageAtomicOr_01d20D00D >- 1401, // imageAtomicOr_01D00D00D >- 1402, // imageAtomicOr_01O00D00D >- 1403, // imageAtomicOr_01Z00D00D >- 1404, // imageAtomicOr_01E10D00D >- 1405, // imageAtomicOr_01P10D00D >- 1406, // imageAtomicOr_01a10D00D >- 1407, // imageAtomicOr_01I10D00D >- 1408, // imageAtomicOr_01T10D00D >- 1409, // imageAtomicOr_01e10D00D >- 1410, // imageAtomicOr_01F10D00D00D >- 1411, // imageAtomicOr_01Q10D00D00D >- 1412, // imageAtomicOr_01b10D00D00D >- 1413, // imageAtomicOr_01G20D00D00D >- 1414, // imageAtomicOr_01R20D00D00D >- 1415, // imageAtomicOr_01c20D00D00D >- 1416, // imageAtomicXor_00z10D00E >- 1417, // imageAtomicXor_01K10D00E >- 1418, // imageAtomicXor_01V10D00E >- 1419, // imageAtomicXor_01A20D00E >- 1420, // imageAtomicXor_01L20D00E >- 1421, // imageAtomicXor_01W20D00E >- 1422, // imageAtomicXor_01C20D00E >- 1423, // imageAtomicXor_01N20D00E >- 1424, // imageAtomicXor_01Y20D00E >- 1425, // imageAtomicXor_01J00D00E >- 1426, // imageAtomicXor_01U00D00E >- 1427, // imageAtomicXor_01f00D00E >- 1428, // imageAtomicXor_01B20D00E >- 1429, // imageAtomicXor_01M20D00E >- 1430, // imageAtomicXor_01X20D00E >- 1431, // imageAtomicXor_01H20D00E >- 1432, // imageAtomicXor_01S20D00E >- 1433, // imageAtomicXor_01d20D00E >- 1434, // imageAtomicXor_01D00D00E >- 1435, // imageAtomicXor_01O00D00E >- 1436, // imageAtomicXor_01Z00D00E >- 1437, // imageAtomicXor_01E10D00E >- 1438, // imageAtomicXor_01P10D00E >- 1439, // imageAtomicXor_01a10D00E >- 1440, // imageAtomicXor_01I10D00E >- 1441, // imageAtomicXor_01T10D00E >- 1442, // imageAtomicXor_01e10D00E >- 1443, // imageAtomicXor_01F10D00D00E >- 1444, // imageAtomicXor_01Q10D00D00E >- 1445, // imageAtomicXor_01b10D00D00E >- 1446, // imageAtomicXor_01G20D00D00E >- 1447, // imageAtomicXor_01R20D00D00E >- 1448, // imageAtomicXor_01c20D00D00E >- 1449, // imageAtomicXor_00z10D00D >- 1450, // imageAtomicXor_01K10D00D >- 1451, // imageAtomicXor_01V10D00D >- 1452, // imageAtomicXor_01A20D00D >- 1453, // imageAtomicXor_01L20D00D >- 1454, // imageAtomicXor_01W20D00D >- 1455, // imageAtomicXor_01C20D00D >- 1456, // imageAtomicXor_01N20D00D >- 1457, // imageAtomicXor_01Y20D00D >- 1458, // imageAtomicXor_01J00D00D >- 1459, // imageAtomicXor_01U00D00D >- 1460, // imageAtomicXor_01f00D00D >- 1461, // imageAtomicXor_01B20D00D >- 1462, // imageAtomicXor_01M20D00D >- 1463, // imageAtomicXor_01X20D00D >- 1464, // imageAtomicXor_01H20D00D >- 1465, // imageAtomicXor_01S20D00D >- 1466, // imageAtomicXor_01d20D00D >- 1467, // imageAtomicXor_01D00D00D >- 1468, // imageAtomicXor_01O00D00D >- 1469, // imageAtomicXor_01Z00D00D >- 1470, // imageAtomicXor_01E10D00D >- 1471, // imageAtomicXor_01P10D00D >- 1472, // imageAtomicXor_01a10D00D >- 1473, // imageAtomicXor_01I10D00D >- 1474, // imageAtomicXor_01T10D00D >- 1475, // imageAtomicXor_01e10D00D >- 1476, // imageAtomicXor_01F10D00D00D >- 1477, // imageAtomicXor_01Q10D00D00D >- 1478, // imageAtomicXor_01b10D00D00D >- 1479, // imageAtomicXor_01G20D00D00D >- 1480, // imageAtomicXor_01R20D00D00D >- 1481, // imageAtomicXor_01c20D00D00D >- 1482, // imageAtomicExchange_00z10D00E >- 1483, // imageAtomicExchange_01K10D00E >- 1484, // imageAtomicExchange_01V10D00E >- 1485, // imageAtomicExchange_01A20D00E >- 1486, // imageAtomicExchange_01L20D00E >- 1487, // imageAtomicExchange_01W20D00E >- 1488, // imageAtomicExchange_01C20D00E >- 1489, // imageAtomicExchange_01N20D00E >- 1490, // imageAtomicExchange_01Y20D00E >- 1491, // imageAtomicExchange_01J00D00E >- 1492, // imageAtomicExchange_01U00D00E >- 1493, // imageAtomicExchange_01f00D00E >- 1494, // imageAtomicExchange_01B20D00E >- 1495, // imageAtomicExchange_01M20D00E >- 1496, // imageAtomicExchange_01X20D00E >- 1497, // imageAtomicExchange_01H20D00E >- 1498, // imageAtomicExchange_01S20D00E >- 1499, // imageAtomicExchange_01d20D00E >- 1500, // imageAtomicExchange_01D00D00E >- 1501, // imageAtomicExchange_01O00D00E >- 1502, // imageAtomicExchange_01Z00D00E >- 1503, // imageAtomicExchange_01E10D00E >- 1504, // imageAtomicExchange_01P10D00E >- 1505, // imageAtomicExchange_01a10D00E >- 1506, // imageAtomicExchange_01I10D00E >- 1507, // imageAtomicExchange_01T10D00E >- 1508, // imageAtomicExchange_01e10D00E >- 1509, // imageAtomicExchange_01F10D00D00E >- 1510, // imageAtomicExchange_01Q10D00D00E >- 1511, // imageAtomicExchange_01b10D00D00E >- 1512, // imageAtomicExchange_01G20D00D00E >- 1513, // imageAtomicExchange_01R20D00D00E >- 1514, // imageAtomicExchange_01c20D00D00E >- 1515, // imageAtomicExchange_00z10D00D >- 1516, // imageAtomicExchange_01K10D00D >- 1517, // imageAtomicExchange_01V10D00D >- 1518, // imageAtomicExchange_01A20D00D >- 1519, // imageAtomicExchange_01L20D00D >- 1520, // imageAtomicExchange_01W20D00D >- 1521, // imageAtomicExchange_01C20D00D >- 1522, // imageAtomicExchange_01N20D00D >- 1523, // imageAtomicExchange_01Y20D00D >- 1524, // imageAtomicExchange_01J00D00D >- 1525, // imageAtomicExchange_01U00D00D >- 1526, // imageAtomicExchange_01f00D00D >- 1527, // imageAtomicExchange_01B20D00D >- 1528, // imageAtomicExchange_01M20D00D >- 1529, // imageAtomicExchange_01X20D00D >- 1530, // imageAtomicExchange_01H20D00D >- 1531, // imageAtomicExchange_01S20D00D >- 1532, // imageAtomicExchange_01d20D00D >- 1533, // imageAtomicExchange_01D00D00D >- 1534, // imageAtomicExchange_01O00D00D >- 1535, // imageAtomicExchange_01Z00D00D >- 1536, // imageAtomicExchange_01E10D00D >- 1537, // imageAtomicExchange_01P10D00D >- 1538, // imageAtomicExchange_01a10D00D >- 1539, // imageAtomicExchange_01I10D00D >- 1540, // imageAtomicExchange_01T10D00D >- 1541, // imageAtomicExchange_01e10D00D >- 1542, // imageAtomicExchange_01F10D00D00D >- 1543, // imageAtomicExchange_01Q10D00D00D >- 1544, // imageAtomicExchange_01b10D00D00D >- 1545, // imageAtomicExchange_01G20D00D00D >- 1546, // imageAtomicExchange_01R20D00D00D >- 1547, // imageAtomicExchange_01c20D00D00D >- 1548, // imageAtomicExchange_00z10D00B >- 1549, // imageAtomicExchange_01K10D00B >- 1550, // imageAtomicExchange_01V10D00B >- 1551, // imageAtomicExchange_01A20D00B >- 1552, // imageAtomicExchange_01L20D00B >- 1553, // imageAtomicExchange_01W20D00B >- 1554, // imageAtomicExchange_01C20D00B >- 1555, // imageAtomicExchange_01N20D00B >- 1556, // imageAtomicExchange_01Y20D00B >- 1557, // imageAtomicExchange_01J00D00B >- 1558, // imageAtomicExchange_01U00D00B >- 1559, // imageAtomicExchange_01f00D00B >- 1560, // imageAtomicExchange_01B20D00B >- 1561, // imageAtomicExchange_01M20D00B >- 1562, // imageAtomicExchange_01X20D00B >- 1563, // imageAtomicExchange_01H20D00B >- 1564, // imageAtomicExchange_01S20D00B >- 1565, // imageAtomicExchange_01d20D00B >- 1566, // imageAtomicExchange_01D00D00B >- 1567, // imageAtomicExchange_01O00D00B >- 1568, // imageAtomicExchange_01Z00D00B >- 1569, // imageAtomicExchange_01E10D00B >- 1570, // imageAtomicExchange_01P10D00B >- 1571, // imageAtomicExchange_01a10D00B >- 1572, // imageAtomicExchange_01I10D00B >- 1573, // imageAtomicExchange_01T10D00B >- 1574, // imageAtomicExchange_01e10D00B >- 1575, // imageAtomicExchange_01F10D00D00B >- 1576, // imageAtomicExchange_01Q10D00D00B >- 1577, // imageAtomicExchange_01b10D00D00B >- 1578, // imageAtomicExchange_01G20D00D00B >- 1579, // imageAtomicExchange_01R20D00D00B >- 1580, // imageAtomicExchange_01c20D00D00B >- 1581, // imageAtomicCompSwap_00z10D00E00E >- 1582, // imageAtomicCompSwap_01K10D00E00E >- 1583, // imageAtomicCompSwap_01V10D00E00E >- 1584, // imageAtomicCompSwap_01A20D00E00E >- 1585, // imageAtomicCompSwap_01L20D00E00E >- 1586, // imageAtomicCompSwap_01W20D00E00E >- 1587, // imageAtomicCompSwap_01C20D00E00E >- 1588, // imageAtomicCompSwap_01N20D00E00E >- 1589, // imageAtomicCompSwap_01Y20D00E00E >- 1590, // imageAtomicCompSwap_01J00D00E00E >- 1591, // imageAtomicCompSwap_01U00D00E00E >- 1592, // imageAtomicCompSwap_01f00D00E00E >- 1593, // imageAtomicCompSwap_01B20D00E00E >- 1594, // imageAtomicCompSwap_01M20D00E00E >- 1595, // imageAtomicCompSwap_01X20D00E00E >- 1596, // imageAtomicCompSwap_01H20D00E00E >- 1597, // imageAtomicCompSwap_01S20D00E00E >- 1598, // imageAtomicCompSwap_01d20D00E00E >- 1599, // imageAtomicCompSwap_01D00D00E00E >- 1600, // imageAtomicCompSwap_01O00D00E00E >- 1601, // imageAtomicCompSwap_01Z00D00E00E >- 1602, // imageAtomicCompSwap_01E10D00E00E >- 1603, // imageAtomicCompSwap_01P10D00E00E >- 1604, // imageAtomicCompSwap_01a10D00E00E >- 1605, // imageAtomicCompSwap_01I10D00E00E >- 1606, // imageAtomicCompSwap_01T10D00E00E >- 1607, // imageAtomicCompSwap_01e10D00E00E >- 1608, // imageAtomicCompSwap_01F10D00D00E00E >- 1609, // imageAtomicCompSwap_01Q10D00D00E00E >- 1610, // imageAtomicCompSwap_01b10D00D00E00E >- 1611, // imageAtomicCompSwap_01G20D00D00E00E >- 1612, // imageAtomicCompSwap_01R20D00D00E00E >- 1613, // imageAtomicCompSwap_01c20D00D00E00E >- 1614, // imageAtomicCompSwap_00z10D00D00D >- 1615, // imageAtomicCompSwap_01K10D00D00D >- 1616, // imageAtomicCompSwap_01V10D00D00D >- 1617, // imageAtomicCompSwap_01A20D00D00D >- 1618, // imageAtomicCompSwap_01L20D00D00D >- 1619, // imageAtomicCompSwap_01W20D00D00D >- 1620, // imageAtomicCompSwap_01C20D00D00D >- 1621, // imageAtomicCompSwap_01N20D00D00D >- 1622, // imageAtomicCompSwap_01Y20D00D00D >- 1623, // imageAtomicCompSwap_01J00D00D00D >- 1624, // imageAtomicCompSwap_01U00D00D00D >- 1625, // imageAtomicCompSwap_01f00D00D00D >- 1626, // imageAtomicCompSwap_01B20D00D00D >- 1627, // imageAtomicCompSwap_01M20D00D00D >- 1628, // imageAtomicCompSwap_01X20D00D00D >- 1629, // imageAtomicCompSwap_01H20D00D00D >- 1630, // imageAtomicCompSwap_01S20D00D00D >- 1631, // imageAtomicCompSwap_01d20D00D00D >- 1632, // imageAtomicCompSwap_01D00D00D00D >- 1633, // imageAtomicCompSwap_01O00D00D00D >- 1634, // imageAtomicCompSwap_01Z00D00D00D >- 1635, // imageAtomicCompSwap_01E10D00D00D >- 1636, // imageAtomicCompSwap_01P10D00D00D >- 1637, // imageAtomicCompSwap_01a10D00D00D >- 1638, // imageAtomicCompSwap_01I10D00D00D >- 1639, // imageAtomicCompSwap_01T10D00D00D >- 1640, // imageAtomicCompSwap_01e10D00D00D >- 1641, // imageAtomicCompSwap_01F10D00D00D00D >- 1642, // imageAtomicCompSwap_01Q10D00D00D00D >- 1643, // imageAtomicCompSwap_01b10D00D00D00D >- 1644, // imageAtomicCompSwap_01G20D00D00D00D >- 1645, // imageAtomicCompSwap_01R20D00D00D00D >- 1646, // imageAtomicCompSwap_01c20D00D00D00D >- 1647, // memoryBarrier_ >- 1648, // memoryBarrierAtomicCounter_ >- 1649, // memoryBarrierBuffer_ >- 1650, // memoryBarrierImage_ >- 1651, // barrier_ >- 1654, // memoryBarrierShared_ >- 1655, // groupMemoryBarrier_ >- 1656, // EmitVertex_ >- 1659, // EndPrimitive_ >- 1662, // subpassLoad_01g >- 1663, // subpassLoad_01h >- 1664, // subpassLoad_01i >- 1665, // subpassLoad_01j00D >- 1666, // subpassLoad_01k00D >- 1667, // subpassLoad_01l00D >- 1668, // gl_DepthRangeParameters >- 1669, // gl_DepthRange >- 1670, // gl_NumSamples >- 1672, // gl_MaxVertexAttribs >- 1673, // gl_MaxVertexUniformVectors >- 1674, // gl_MaxVertexTextureImageUnits >- 1675, // gl_MaxCombinedTextureImageUnits >- 1676, // gl_MaxTextureImageUnits >- 1677, // gl_MaxFragmentUniformVectors >- 1678, // gl_MaxVaryingVectors >- 1679, // gl_MaxDrawBuffers >- 1680, // gl_MaxDualSourceDrawBuffersEXT >- 1681, // gl_MaxVertexOutputVectors >- 1682, // gl_MaxFragmentInputVectors >- 1683, // gl_MinProgramTexelOffset >- 1684, // gl_MaxProgramTexelOffset >- 1685, // gl_MaxImageUnits >- 1686, // gl_MaxVertexImageUniforms >- 1687, // gl_MaxFragmentImageUniforms >- 1688, // gl_MaxComputeImageUniforms >- 1689, // gl_MaxCombinedImageUniforms >- 1690, // gl_MaxCombinedShaderOutputResources >- 1691, // gl_MaxComputeWorkGroupCount >- 1692, // gl_MaxComputeWorkGroupSize >- 1693, // gl_MaxComputeUniformComponents >- 1694, // gl_MaxComputeTextureImageUnits >- 1695, // gl_MaxComputeAtomicCounters >- 1696, // gl_MaxComputeAtomicCounterBuffers >- 1697, // gl_MaxVertexAtomicCounters >- 1698, // gl_MaxFragmentAtomicCounters >- 1699, // gl_MaxCombinedAtomicCounters >- 1700, // gl_MaxAtomicCounterBindings >- 1701, // gl_MaxVertexAtomicCounterBuffers >- 1702, // gl_MaxFragmentAtomicCounterBuffers >- 1703, // gl_MaxCombinedAtomicCounterBuffers >- 1704, // gl_MaxAtomicCounterBufferSize >- 1705, // gl_MaxGeometryInputComponents >- 1708, // gl_MaxGeometryOutputComponents >- 1711, // gl_MaxGeometryImageUniforms >- 1714, // gl_MaxGeometryTextureImageUnits >- 1717, // gl_MaxGeometryOutputVertices >- 1720, // gl_MaxGeometryTotalOutputComponents >- 1723, // gl_MaxGeometryUniformComponents >- 1726, // gl_MaxGeometryAtomicCounters >- 1729, // gl_MaxGeometryAtomicCounterBuffers >- 1732, // gl_MaxTessControlInputComponents >- 1734, // gl_MaxTessControlOutputComponents >- 1736, // gl_MaxTessControlTextureImageUnits >- 1738, // gl_MaxTessControlUniformComponents >- 1740, // gl_MaxTessControlTotalOutputComponents >- 1742, // gl_MaxTessControlImageUniforms >- 1744, // gl_MaxTessControlAtomicCounters >- 1746, // gl_MaxTessControlAtomicCounterBuffers >- 1748, // gl_MaxTessPatchComponents >- 1750, // gl_MaxPatchVertices >- 1752, // gl_MaxTessGenLevel >- 1754, // gl_MaxTessEvaluationInputComponents >- 1756, // gl_MaxTessEvaluationOutputComponents >- 1758, // gl_MaxTessEvaluationTextureImageUnits >- 1760, // gl_MaxTessEvaluationUniformComponents >- 1762, // gl_MaxTessEvaluationImageUniforms >- 1764, // gl_MaxTessEvaluationAtomicCounters >- 1766, // gl_MaxTessEvaluationAtomicCounterBuffers >- 1768, // gl_MaxSamples >- 1770, // gl_MaxClipDistances >- 1771, // gl_MaxCullDistances >- 1772, // gl_MaxCombinedClipAndCullDistances >- 1773, // gl_FragCoord >- 1775, // gl_FrontFacing >- 1776, // gl_PointCoord >- 1777, // gl_FragColor >- 1778, // gl_FragData >- 1779, // gl_FragDepth >- 1780, // gl_HelperInvocation >- 1781, // gl_SecondaryFragColorEXT >- 1782, // gl_SecondaryFragDataEXT >- 1783, // gl_FragDepthEXT >- 1784, // gl_LastFragData >- 1787, // gl_LastFragColor >- 1788, // gl_LastFragColorARM >- 1789, // gl_PrimitiveID >- 1799, // gl_Layer >- 1805, // gl_SampleID >- 1807, // gl_SamplePosition >- 1809, // gl_SampleMaskIn >- 1811, // gl_SampleMask >- 1813, // gl_CullDistance >- 1815, // gl_ClipDistance >- 1817, // gl_Position >- 1825, // gl_PointSize >- 1827, // gl_InstanceID >- 1828, // Empty >- 1828, // gl_VertexID >- 1829, // Empty >- 1829, // Empty >- 1829, // gl_DrawID >- 1830, // gl_BaseVertex >- 1831, // gl_BaseInstance >- 1832, // angle_BaseVertex >- 1833, // angle_BaseInstance >- 1834, // gl_NumWorkGroups >- 1835, // gl_WorkGroupSize >- 1836, // gl_WorkGroupID >- 1837, // gl_LocalInvocationID >- 1838, // gl_GlobalInvocationID >- 1839, // gl_LocalInvocationIndex >- 1840, // gl_PrimitiveIDIn >- 1843, // gl_InvocationID >- 1848, // gl_PerVertex >- 1855, // gl_in >- 1862, // gl_PatchVerticesIn >- 1866, // gl_TessLevelOuter >- 1870, // gl_TessLevelInner >- 1874, // gl_out >- 1878, // gl_BoundingBoxEXT >- 1880, // gl_TessCoord >- 1881, // gl_ViewID_OVR >+ 635, // textureSize_00W >+ 637, // textureSize_00c >+ 639, // textureSize_00M00D >+ 640, // textureSize_00N00D >+ 641, // textureProjLod_00I20B00B >+ 642, // textureProjLod_00R20B00B >+ 643, // textureProjLod_00X20B00B >+ 644, // textureProjLod_00I30B00B >+ 645, // textureProjLod_00R30B00B >+ 646, // textureProjLod_00X30B00B >+ 647, // textureProjLod_00J30B00B >+ 648, // textureProjLod_00S30B00B >+ 649, // textureProjLod_00Y30B00B >+ 650, // textureProjLod_00d30B00B >+ 651, // texelFetch_00I10D00D >+ 652, // texelFetch_00R10D00D >+ 653, // texelFetch_00X10D00D >+ 654, // texelFetch_00J20D00D >+ 655, // texelFetch_00S20D00D >+ 656, // texelFetch_00Y20D00D >+ 657, // texelFetch_00L20D00D >+ 658, // texelFetch_00U20D00D >+ 659, // texelFetch_00a20D00D >+ 660, // texelFetch_00j00D >+ 663, // texelFetch_00r00D >+ 666, // texelFetch_00w00D >+ 669, // texelFetch_00P10D00D >+ 671, // texelFetch_00V10D00D >+ 673, // texelFetch_00b10D00D >+ 675, // texelFetch_00Q20D00D >+ 677, // texelFetch_00W20D00D >+ 679, // texelFetch_00c20D00D >+ 681, // texelFetch_00M10D00D >+ 682, // texelFetch_00N10D00D >+ 683, // textureGrad_00I10B10B10B >+ 684, // textureGrad_00R10B10B10B >+ 685, // textureGrad_00X10B10B10B >+ 686, // textureGrad_00J20B20B20B >+ 687, // textureGrad_00S20B20B20B >+ 688, // textureGrad_00Y20B20B20B >+ 689, // textureGrad_00K20B20B20B >+ 690, // textureGrad_00T20B20B20B >+ 691, // textureGrad_00Z20B20B20B >+ 692, // textureGrad_00d20B10B10B >+ 693, // textureGrad_00e30B20B20B >+ 694, // textureGrad_00L20B10B10B >+ 695, // textureGrad_00U20B10B10B >+ 696, // textureGrad_00a20B10B10B >+ 697, // textureGrad_00f30B10B10B >+ 698, // textureGrad_00k30B20B20B >+ 701, // textureGrad_00s30B20B20B >+ 704, // textureGrad_00x30B20B20B >+ 707, // textureProjGrad_00I20B10B10B >+ 708, // textureProjGrad_00R20B10B10B >+ 709, // textureProjGrad_00X20B10B10B >+ 710, // textureProjGrad_00I30B10B10B >+ 711, // textureProjGrad_00R30B10B10B >+ 712, // textureProjGrad_00X30B10B10B >+ 713, // textureProjGrad_00J30B20B20B >+ 714, // textureProjGrad_00S30B20B20B >+ 715, // textureProjGrad_00Y30B20B20B >+ 716, // textureProjGrad_00d30B10B10B >+ 717, // texture_00I10B00B >+ 718, // texture_00R10B00B >+ 719, // texture_00X10B00B >+ 720, // texture_00J20B00B >+ 721, // texture_00S20B00B >+ 722, // texture_00Y20B00B >+ 723, // texture_00K20B00B >+ 724, // texture_00T20B00B >+ 725, // texture_00Z20B00B >+ 726, // texture_00L20B00B >+ 727, // texture_00U20B00B >+ 728, // texture_00a20B00B >+ 729, // textureProj_00I20B00B >+ 730, // textureProj_00R20B00B >+ 731, // textureProj_00X20B00B >+ 732, // textureProj_00I30B00B >+ 733, // textureProj_00R30B00B >+ 734, // textureProj_00X30B00B >+ 735, // textureProj_00J30B00B >+ 736, // textureProj_00S30B00B >+ 737, // textureProj_00Y30B00B >+ 738, // texture_00d20B00B >+ 739, // texture_00e30B00B >+ 740, // textureProj_00d30B00B >+ 741, // texture_00k30B00B >+ 744, // texture_00s30B00B >+ 747, // texture_00x30B00B >+ 750, // texture_00M10B00B >+ 751, // textureProj_00M20B00B >+ 752, // textureProj_00M30B00B >+ 753, // texture_00N10B00B >+ 754, // textureProj_00N20B00B >+ 755, // textureProj_00N30B00B >+ 756, // textureOffset_00I10B10D >+ 757, // textureOffset_00R10B10D >+ 758, // textureOffset_00X10B10D >+ 759, // textureOffset_00J20B20D >+ 760, // textureOffset_00S20B20D >+ 761, // textureOffset_00Y20B20D >+ 762, // textureOffset_00d20B10D >+ 763, // textureOffset_00L20B10D >+ 764, // textureOffset_00U20B10D >+ 765, // textureOffset_00a20B10D >+ 766, // textureProjOffset_00I20B10D >+ 767, // textureProjOffset_00R20B10D >+ 768, // textureProjOffset_00X20B10D >+ 769, // textureProjOffset_00I30B10D >+ 770, // textureProjOffset_00R30B10D >+ 771, // textureProjOffset_00X30B10D >+ 772, // textureProjOffset_00J30B20D >+ 773, // textureProjOffset_00S30B20D >+ 774, // textureProjOffset_00Y30B20D >+ 775, // textureProjOffset_00d30B10D >+ 776, // textureLodOffset_00I10B00B10D >+ 777, // textureLodOffset_00R10B00B10D >+ 778, // textureLodOffset_00X10B00B10D >+ 779, // textureLodOffset_00J20B00B20D >+ 780, // textureLodOffset_00S20B00B20D >+ 781, // textureLodOffset_00Y20B00B20D >+ 782, // textureLodOffset_00d20B00B10D >+ 783, // textureLodOffset_00L20B00B10D >+ 784, // textureLodOffset_00U20B00B10D >+ 785, // textureLodOffset_00a20B00B10D >+ 786, // textureProjLodOffset_00I20B00B10D >+ 787, // textureProjLodOffset_00R20B00B10D >+ 788, // textureProjLodOffset_00X20B00B10D >+ 789, // textureProjLodOffset_00I30B00B10D >+ 790, // textureProjLodOffset_00R30B00B10D >+ 791, // textureProjLodOffset_00X30B00B10D >+ 792, // textureProjLodOffset_00J30B00B20D >+ 793, // textureProjLodOffset_00S30B00B20D >+ 794, // textureProjLodOffset_00Y30B00B20D >+ 795, // textureProjLodOffset_00d30B00B10D >+ 796, // texelFetchOffset_00I10D00D10D >+ 797, // texelFetchOffset_00R10D00D10D >+ 798, // texelFetchOffset_00X10D00D10D >+ 799, // texelFetchOffset_00J20D00D20D >+ 800, // texelFetchOffset_00S20D00D20D >+ 801, // texelFetchOffset_00Y20D00D20D >+ 802, // texelFetchOffset_00L20D00D10D >+ 803, // texelFetchOffset_00U20D00D10D >+ 804, // texelFetchOffset_00a20D00D10D >+ 805, // textureGradOffset_00I10B10B10B10D >+ 806, // textureGradOffset_00R10B10B10B10D >+ 807, // textureGradOffset_00X10B10B10B10D >+ 808, // textureGradOffset_00J20B20B20B20D >+ 809, // textureGradOffset_00S20B20B20B20D >+ 810, // textureGradOffset_00Y20B20B20B20D >+ 811, // textureGradOffset_00d20B10B10B10D >+ 812, // textureGradOffset_00L20B10B10B10D >+ 813, // textureGradOffset_00U20B10B10B10D >+ 814, // textureGradOffset_00a20B10B10B10D >+ 815, // textureGradOffset_00f30B10B10B10D >+ 816, // textureProjGradOffset_00I20B10B10B10D >+ 817, // textureProjGradOffset_00R20B10B10B10D >+ 818, // textureProjGradOffset_00X20B10B10B10D >+ 819, // textureProjGradOffset_00I30B10B10B10D >+ 820, // textureProjGradOffset_00R30B10B10B10D >+ 821, // textureProjGradOffset_00X30B10B10B10D >+ 822, // textureProjGradOffset_00J30B20B20B20D >+ 823, // textureProjGradOffset_00S30B20B20B20D >+ 824, // textureProjGradOffset_00Y30B20B20B20D >+ 825, // textureProjGradOffset_00d30B10B10B10D >+ 826, // textureOffset_00I10B10D00B >+ 827, // textureOffset_00R10B10D00B >+ 828, // textureOffset_00X10B10D00B >+ 829, // textureOffset_00J20B20D00B >+ 830, // textureOffset_00S20B20D00B >+ 831, // textureOffset_00Y20B20D00B >+ 832, // textureOffset_00d20B10D00B >+ 833, // textureOffset_00L20B10D00B >+ 834, // textureOffset_00U20B10D00B >+ 835, // textureOffset_00a20B10D00B >+ 836, // textureProjOffset_00I20B10D00B >+ 837, // textureProjOffset_00R20B10D00B >+ 838, // textureProjOffset_00X20B10D00B >+ 839, // textureProjOffset_00I30B10D00B >+ 840, // textureProjOffset_00R30B10D00B >+ 841, // textureProjOffset_00X30B10D00B >+ 842, // textureProjOffset_00J30B20D00B >+ 843, // textureProjOffset_00S30B20D00B >+ 844, // textureProjOffset_00Y30B20D00B >+ 845, // textureProjOffset_00d30B10D00B >+ 846, // textureGather_00I10B >+ 847, // textureGather_00R10B >+ 848, // textureGather_00X10B >+ 849, // textureGather_00I10B00D >+ 850, // textureGather_00R10B00D >+ 851, // textureGather_00X10B00D >+ 852, // textureGather_00L20B >+ 853, // textureGather_00U20B >+ 854, // textureGather_00a20B >+ 855, // textureGather_00L20B00D >+ 856, // textureGather_00U20B00D >+ 857, // textureGather_00a20B00D >+ 858, // textureGather_00K20B >+ 859, // textureGather_00T20B >+ 860, // textureGather_00Z20B >+ 861, // textureGather_00K20B00D >+ 862, // textureGather_00T20B00D >+ 863, // textureGather_00Z20B00D >+ 864, // textureGather_00k30B >+ 867, // textureGather_00s30B >+ 870, // textureGather_00x30B >+ 873, // textureGather_00k30B00D >+ 876, // textureGather_00s30B00D >+ 879, // textureGather_00x30B00D >+ 882, // textureGather_00l30B00B >+ 885, // textureGather_00d10B >+ 886, // textureGather_00d10B00B >+ 887, // textureGather_00f20B >+ 888, // textureGather_00f20B00B >+ 889, // textureGather_00e20B >+ 890, // textureGather_00e20B00B >+ 891, // textureGatherOffset_00I10B10D >+ 892, // textureGatherOffset_00R10B10D >+ 893, // textureGatherOffset_00X10B10D >+ 894, // textureGatherOffset_00L20B10D >+ 895, // textureGatherOffset_00U20B10D >+ 896, // textureGatherOffset_00a20B10D >+ 897, // textureGatherOffset_00d10B00B10D >+ 898, // textureGatherOffset_00f20B00B10D >+ 899, // textureGatherOffset_00I10B10D00D >+ 900, // textureGatherOffset_00R10B10D00D >+ 901, // textureGatherOffset_00X10B10D00D >+ 902, // textureGatherOffset_00L20B10D00D >+ 903, // textureGatherOffset_00U20B10D00D >+ 904, // textureGatherOffset_00a20B10D00D >+ 905, // textureGatherOffsets_00I10B10Dx4 >+ 907, // textureGatherOffsets_00R10B10Dx4 >+ 909, // textureGatherOffsets_00X10B10Dx4 >+ 911, // textureGatherOffsets_00L20B10Dx4 >+ 913, // textureGatherOffsets_00U20B10Dx4 >+ 915, // textureGatherOffsets_00a20B10Dx4 >+ 917, // textureGatherOffsets_00d10B00B10Dx4 >+ 919, // textureGatherOffsets_00f20B00B10Dx4 >+ 921, // textureGatherOffsets_00I10B10Dx400D >+ 923, // textureGatherOffsets_00R10B10Dx400D >+ 925, // textureGatherOffsets_00X10B10Dx400D >+ 927, // textureGatherOffsets_00L20B10Dx400D >+ 929, // textureGatherOffsets_00U20B10Dx400D >+ 931, // textureGatherOffsets_00a20B10Dx400D >+ 933, // rgb_2_yuv_20B00H >+ 934, // yuv_2_rgb_20B00H >+ 935, // dFdx_00B >+ 937, // dFdx_10B >+ 939, // dFdx_20B >+ 941, // dFdx_30B >+ 943, // dFdy_00B >+ 945, // dFdy_10B >+ 947, // dFdy_20B >+ 949, // dFdy_30B >+ 951, // fwidth_00B >+ 953, // fwidth_10B >+ 955, // fwidth_20B >+ 957, // fwidth_30B >+ 959, // interpolateAtCentroid_00B >+ 961, // interpolateAtCentroid_10B >+ 963, // interpolateAtCentroid_20B >+ 965, // interpolateAtCentroid_30B >+ 967, // interpolateAtSample_00B00D >+ 969, // interpolateAtSample_10B00D >+ 971, // interpolateAtSample_20B00D >+ 973, // interpolateAtSample_30B00D >+ 975, // interpolateAtOffset_00B10B >+ 977, // interpolateAtOffset_10B10B >+ 979, // interpolateAtOffset_20B10B >+ 981, // interpolateAtOffset_30B10B >+ 983, // atomicCounter_00G >+ 984, // atomicCounterIncrement_00G >+ 985, // atomicCounterDecrement_00G >+ 986, // atomicAdd_00E00E >+ 987, // atomicAdd_00D00D >+ 988, // atomicMin_00E00E >+ 989, // atomicMin_00D00D >+ 990, // atomicMax_00E00E >+ 991, // atomicMax_00D00D >+ 992, // atomicAnd_00E00E >+ 993, // atomicAnd_00D00D >+ 994, // atomicOr_00E00E >+ 995, // atomicOr_00D00D >+ 996, // atomicXor_00E00E >+ 997, // atomicXor_00D00D >+ 998, // atomicExchange_00E00E >+ 999, // atomicExchange_00D00D >+ 1000, // atomicCompSwap_00E00E00E >+ 1001, // atomicCompSwap_00D00D00D >+ 1002, // imageSize_00z >+ 1003, // imageSize_01K >+ 1004, // imageSize_01V >+ 1005, // imageSize_01A >+ 1006, // imageSize_01L >+ 1007, // imageSize_01W >+ 1008, // imageSize_01B >+ 1009, // imageSize_01M >+ 1010, // imageSize_01X >+ 1011, // imageSize_01C >+ 1012, // imageSize_01N >+ 1013, // imageSize_01Y >+ 1014, // imageSize_01H >+ 1017, // imageSize_01S >+ 1020, // imageSize_01d >+ 1023, // imageSize_01J >+ 1026, // imageSize_01U >+ 1029, // imageSize_01f >+ 1032, // imageStore_00z10D30B >+ 1033, // imageStore_01K10D30D >+ 1034, // imageStore_01V10D30E >+ 1035, // imageStore_01A20D30B >+ 1036, // imageStore_01L20D30D >+ 1037, // imageStore_01W20D30E >+ 1038, // imageStore_01B20D30B >+ 1039, // imageStore_01M20D30D >+ 1040, // imageStore_01X20D30E >+ 1041, // imageStore_01C20D30B >+ 1042, // imageStore_01N20D30D >+ 1043, // imageStore_01Y20D30E >+ 1044, // imageStore_01H20D30B >+ 1047, // imageStore_01S20D30D >+ 1050, // imageStore_01d20D30E >+ 1053, // imageStore_01J00D30B >+ 1056, // imageStore_01U00D30D >+ 1059, // imageStore_01f00D30E >+ 1062, // imageLoad_00z10D >+ 1063, // imageLoad_01K10D >+ 1064, // imageLoad_01V10D >+ 1065, // imageLoad_01A20D >+ 1066, // imageLoad_01L20D >+ 1067, // imageLoad_01W20D >+ 1068, // imageLoad_01B20D >+ 1069, // imageLoad_01M20D >+ 1070, // imageLoad_01X20D >+ 1071, // imageLoad_01C20D >+ 1072, // imageLoad_01N20D >+ 1073, // imageLoad_01Y20D >+ 1074, // imageLoad_01H20D >+ 1077, // imageLoad_01S20D >+ 1080, // imageLoad_01d20D >+ 1083, // imageLoad_01J00D >+ 1086, // imageLoad_01U00D >+ 1089, // imageLoad_01f00D >+ 1092, // imageAtomicAdd_00z10D00E >+ 1094, // imageAtomicAdd_01K10D00E >+ 1096, // imageAtomicAdd_01V10D00E >+ 1098, // imageAtomicAdd_01A20D00E >+ 1100, // imageAtomicAdd_01L20D00E >+ 1102, // imageAtomicAdd_01W20D00E >+ 1104, // imageAtomicAdd_01C20D00E >+ 1106, // imageAtomicAdd_01N20D00E >+ 1108, // imageAtomicAdd_01Y20D00E >+ 1110, // imageAtomicAdd_01J00D00E >+ 1112, // imageAtomicAdd_01U00D00E >+ 1114, // imageAtomicAdd_01f00D00E >+ 1116, // imageAtomicAdd_01B20D00E >+ 1118, // imageAtomicAdd_01M20D00E >+ 1120, // imageAtomicAdd_01X20D00E >+ 1122, // imageAtomicAdd_01H20D00E >+ 1124, // imageAtomicAdd_01S20D00E >+ 1126, // imageAtomicAdd_01d20D00E >+ 1128, // imageAtomicAdd_01D00D00E >+ 1130, // imageAtomicAdd_01O00D00E >+ 1132, // imageAtomicAdd_01Z00D00E >+ 1134, // imageAtomicAdd_01E10D00E >+ 1136, // imageAtomicAdd_01P10D00E >+ 1138, // imageAtomicAdd_01a10D00E >+ 1140, // imageAtomicAdd_01I10D00E >+ 1142, // imageAtomicAdd_01T10D00E >+ 1144, // imageAtomicAdd_01e10D00E >+ 1146, // imageAtomicAdd_01F10D00D00E >+ 1148, // imageAtomicAdd_01Q10D00D00E >+ 1150, // imageAtomicAdd_01b10D00D00E >+ 1152, // imageAtomicAdd_01G20D00D00E >+ 1154, // imageAtomicAdd_01R20D00D00E >+ 1156, // imageAtomicAdd_01c20D00D00E >+ 1158, // imageAtomicAdd_00z10D00D >+ 1160, // imageAtomicAdd_01K10D00D >+ 1162, // imageAtomicAdd_01V10D00D >+ 1164, // imageAtomicAdd_01A20D00D >+ 1166, // imageAtomicAdd_01L20D00D >+ 1168, // imageAtomicAdd_01W20D00D >+ 1170, // imageAtomicAdd_01C20D00D >+ 1172, // imageAtomicAdd_01N20D00D >+ 1174, // imageAtomicAdd_01Y20D00D >+ 1176, // imageAtomicAdd_01J00D00D >+ 1178, // imageAtomicAdd_01U00D00D >+ 1180, // imageAtomicAdd_01f00D00D >+ 1182, // imageAtomicAdd_01B20D00D >+ 1184, // imageAtomicAdd_01M20D00D >+ 1186, // imageAtomicAdd_01X20D00D >+ 1188, // imageAtomicAdd_01H20D00D >+ 1190, // imageAtomicAdd_01S20D00D >+ 1192, // imageAtomicAdd_01d20D00D >+ 1194, // imageAtomicAdd_01D00D00D >+ 1196, // imageAtomicAdd_01O00D00D >+ 1198, // imageAtomicAdd_01Z00D00D >+ 1200, // imageAtomicAdd_01E10D00D >+ 1202, // imageAtomicAdd_01P10D00D >+ 1204, // imageAtomicAdd_01a10D00D >+ 1206, // imageAtomicAdd_01I10D00D >+ 1208, // imageAtomicAdd_01T10D00D >+ 1210, // imageAtomicAdd_01e10D00D >+ 1212, // imageAtomicAdd_01F10D00D00D >+ 1214, // imageAtomicAdd_01Q10D00D00D >+ 1216, // imageAtomicAdd_01b10D00D00D >+ 1218, // imageAtomicAdd_01G20D00D00D >+ 1220, // imageAtomicAdd_01R20D00D00D >+ 1222, // imageAtomicAdd_01c20D00D00D >+ 1224, // imageAtomicMin_00z10D00E >+ 1226, // imageAtomicMin_01K10D00E >+ 1228, // imageAtomicMin_01V10D00E >+ 1230, // imageAtomicMin_01A20D00E >+ 1232, // imageAtomicMin_01L20D00E >+ 1234, // imageAtomicMin_01W20D00E >+ 1236, // imageAtomicMin_01C20D00E >+ 1238, // imageAtomicMin_01N20D00E >+ 1240, // imageAtomicMin_01Y20D00E >+ 1242, // imageAtomicMin_01J00D00E >+ 1244, // imageAtomicMin_01U00D00E >+ 1246, // imageAtomicMin_01f00D00E >+ 1248, // imageAtomicMin_01B20D00E >+ 1250, // imageAtomicMin_01M20D00E >+ 1252, // imageAtomicMin_01X20D00E >+ 1254, // imageAtomicMin_01H20D00E >+ 1256, // imageAtomicMin_01S20D00E >+ 1258, // imageAtomicMin_01d20D00E >+ 1260, // imageAtomicMin_01D00D00E >+ 1262, // imageAtomicMin_01O00D00E >+ 1264, // imageAtomicMin_01Z00D00E >+ 1266, // imageAtomicMin_01E10D00E >+ 1268, // imageAtomicMin_01P10D00E >+ 1270, // imageAtomicMin_01a10D00E >+ 1272, // imageAtomicMin_01I10D00E >+ 1274, // imageAtomicMin_01T10D00E >+ 1276, // imageAtomicMin_01e10D00E >+ 1278, // imageAtomicMin_01F10D00D00E >+ 1280, // imageAtomicMin_01Q10D00D00E >+ 1282, // imageAtomicMin_01b10D00D00E >+ 1284, // imageAtomicMin_01G20D00D00E >+ 1286, // imageAtomicMin_01R20D00D00E >+ 1288, // imageAtomicMin_01c20D00D00E >+ 1290, // imageAtomicMin_00z10D00D >+ 1292, // imageAtomicMin_01K10D00D >+ 1294, // imageAtomicMin_01V10D00D >+ 1296, // imageAtomicMin_01A20D00D >+ 1298, // imageAtomicMin_01L20D00D >+ 1300, // imageAtomicMin_01W20D00D >+ 1302, // imageAtomicMin_01C20D00D >+ 1304, // imageAtomicMin_01N20D00D >+ 1306, // imageAtomicMin_01Y20D00D >+ 1308, // imageAtomicMin_01J00D00D >+ 1310, // imageAtomicMin_01U00D00D >+ 1312, // imageAtomicMin_01f00D00D >+ 1314, // imageAtomicMin_01B20D00D >+ 1316, // imageAtomicMin_01M20D00D >+ 1318, // imageAtomicMin_01X20D00D >+ 1320, // imageAtomicMin_01H20D00D >+ 1322, // imageAtomicMin_01S20D00D >+ 1324, // imageAtomicMin_01d20D00D >+ 1326, // imageAtomicMin_01D00D00D >+ 1328, // imageAtomicMin_01O00D00D >+ 1330, // imageAtomicMin_01Z00D00D >+ 1332, // imageAtomicMin_01E10D00D >+ 1334, // imageAtomicMin_01P10D00D >+ 1336, // imageAtomicMin_01a10D00D >+ 1338, // imageAtomicMin_01I10D00D >+ 1340, // imageAtomicMin_01T10D00D >+ 1342, // imageAtomicMin_01e10D00D >+ 1344, // imageAtomicMin_01F10D00D00D >+ 1346, // imageAtomicMin_01Q10D00D00D >+ 1348, // imageAtomicMin_01b10D00D00D >+ 1350, // imageAtomicMin_01G20D00D00D >+ 1352, // imageAtomicMin_01R20D00D00D >+ 1354, // imageAtomicMin_01c20D00D00D >+ 1356, // imageAtomicMax_00z10D00E >+ 1358, // imageAtomicMax_01K10D00E >+ 1360, // imageAtomicMax_01V10D00E >+ 1362, // imageAtomicMax_01A20D00E >+ 1364, // imageAtomicMax_01L20D00E >+ 1366, // imageAtomicMax_01W20D00E >+ 1368, // imageAtomicMax_01C20D00E >+ 1370, // imageAtomicMax_01N20D00E >+ 1372, // imageAtomicMax_01Y20D00E >+ 1374, // imageAtomicMax_01J00D00E >+ 1376, // imageAtomicMax_01U00D00E >+ 1378, // imageAtomicMax_01f00D00E >+ 1380, // imageAtomicMax_01B20D00E >+ 1382, // imageAtomicMax_01M20D00E >+ 1384, // imageAtomicMax_01X20D00E >+ 1386, // imageAtomicMax_01H20D00E >+ 1388, // imageAtomicMax_01S20D00E >+ 1390, // imageAtomicMax_01d20D00E >+ 1392, // imageAtomicMax_01D00D00E >+ 1394, // imageAtomicMax_01O00D00E >+ 1396, // imageAtomicMax_01Z00D00E >+ 1398, // imageAtomicMax_01E10D00E >+ 1400, // imageAtomicMax_01P10D00E >+ 1402, // imageAtomicMax_01a10D00E >+ 1404, // imageAtomicMax_01I10D00E >+ 1406, // imageAtomicMax_01T10D00E >+ 1408, // imageAtomicMax_01e10D00E >+ 1410, // imageAtomicMax_01F10D00D00E >+ 1412, // imageAtomicMax_01Q10D00D00E >+ 1414, // imageAtomicMax_01b10D00D00E >+ 1416, // imageAtomicMax_01G20D00D00E >+ 1418, // imageAtomicMax_01R20D00D00E >+ 1420, // imageAtomicMax_01c20D00D00E >+ 1422, // imageAtomicMax_00z10D00D >+ 1424, // imageAtomicMax_01K10D00D >+ 1426, // imageAtomicMax_01V10D00D >+ 1428, // imageAtomicMax_01A20D00D >+ 1430, // imageAtomicMax_01L20D00D >+ 1432, // imageAtomicMax_01W20D00D >+ 1434, // imageAtomicMax_01C20D00D >+ 1436, // imageAtomicMax_01N20D00D >+ 1438, // imageAtomicMax_01Y20D00D >+ 1440, // imageAtomicMax_01J00D00D >+ 1442, // imageAtomicMax_01U00D00D >+ 1444, // imageAtomicMax_01f00D00D >+ 1446, // imageAtomicMax_01B20D00D >+ 1448, // imageAtomicMax_01M20D00D >+ 1450, // imageAtomicMax_01X20D00D >+ 1452, // imageAtomicMax_01H20D00D >+ 1454, // imageAtomicMax_01S20D00D >+ 1456, // imageAtomicMax_01d20D00D >+ 1458, // imageAtomicMax_01D00D00D >+ 1460, // imageAtomicMax_01O00D00D >+ 1462, // imageAtomicMax_01Z00D00D >+ 1464, // imageAtomicMax_01E10D00D >+ 1466, // imageAtomicMax_01P10D00D >+ 1468, // imageAtomicMax_01a10D00D >+ 1470, // imageAtomicMax_01I10D00D >+ 1472, // imageAtomicMax_01T10D00D >+ 1474, // imageAtomicMax_01e10D00D >+ 1476, // imageAtomicMax_01F10D00D00D >+ 1478, // imageAtomicMax_01Q10D00D00D >+ 1480, // imageAtomicMax_01b10D00D00D >+ 1482, // imageAtomicMax_01G20D00D00D >+ 1484, // imageAtomicMax_01R20D00D00D >+ 1486, // imageAtomicMax_01c20D00D00D >+ 1488, // imageAtomicAnd_00z10D00E >+ 1490, // imageAtomicAnd_01K10D00E >+ 1492, // imageAtomicAnd_01V10D00E >+ 1494, // imageAtomicAnd_01A20D00E >+ 1496, // imageAtomicAnd_01L20D00E >+ 1498, // imageAtomicAnd_01W20D00E >+ 1500, // imageAtomicAnd_01C20D00E >+ 1502, // imageAtomicAnd_01N20D00E >+ 1504, // imageAtomicAnd_01Y20D00E >+ 1506, // imageAtomicAnd_01J00D00E >+ 1508, // imageAtomicAnd_01U00D00E >+ 1510, // imageAtomicAnd_01f00D00E >+ 1512, // imageAtomicAnd_01B20D00E >+ 1514, // imageAtomicAnd_01M20D00E >+ 1516, // imageAtomicAnd_01X20D00E >+ 1518, // imageAtomicAnd_01H20D00E >+ 1520, // imageAtomicAnd_01S20D00E >+ 1522, // imageAtomicAnd_01d20D00E >+ 1524, // imageAtomicAnd_01D00D00E >+ 1526, // imageAtomicAnd_01O00D00E >+ 1528, // imageAtomicAnd_01Z00D00E >+ 1530, // imageAtomicAnd_01E10D00E >+ 1532, // imageAtomicAnd_01P10D00E >+ 1534, // imageAtomicAnd_01a10D00E >+ 1536, // imageAtomicAnd_01I10D00E >+ 1538, // imageAtomicAnd_01T10D00E >+ 1540, // imageAtomicAnd_01e10D00E >+ 1542, // imageAtomicAnd_01F10D00D00E >+ 1544, // imageAtomicAnd_01Q10D00D00E >+ 1546, // imageAtomicAnd_01b10D00D00E >+ 1548, // imageAtomicAnd_01G20D00D00E >+ 1550, // imageAtomicAnd_01R20D00D00E >+ 1552, // imageAtomicAnd_01c20D00D00E >+ 1554, // imageAtomicAnd_00z10D00D >+ 1556, // imageAtomicAnd_01K10D00D >+ 1558, // imageAtomicAnd_01V10D00D >+ 1560, // imageAtomicAnd_01A20D00D >+ 1562, // imageAtomicAnd_01L20D00D >+ 1564, // imageAtomicAnd_01W20D00D >+ 1566, // imageAtomicAnd_01C20D00D >+ 1568, // imageAtomicAnd_01N20D00D >+ 1570, // imageAtomicAnd_01Y20D00D >+ 1572, // imageAtomicAnd_01J00D00D >+ 1574, // imageAtomicAnd_01U00D00D >+ 1576, // imageAtomicAnd_01f00D00D >+ 1578, // imageAtomicAnd_01B20D00D >+ 1580, // imageAtomicAnd_01M20D00D >+ 1582, // imageAtomicAnd_01X20D00D >+ 1584, // imageAtomicAnd_01H20D00D >+ 1586, // imageAtomicAnd_01S20D00D >+ 1588, // imageAtomicAnd_01d20D00D >+ 1590, // imageAtomicAnd_01D00D00D >+ 1592, // imageAtomicAnd_01O00D00D >+ 1594, // imageAtomicAnd_01Z00D00D >+ 1596, // imageAtomicAnd_01E10D00D >+ 1598, // imageAtomicAnd_01P10D00D >+ 1600, // imageAtomicAnd_01a10D00D >+ 1602, // imageAtomicAnd_01I10D00D >+ 1604, // imageAtomicAnd_01T10D00D >+ 1606, // imageAtomicAnd_01e10D00D >+ 1608, // imageAtomicAnd_01F10D00D00D >+ 1610, // imageAtomicAnd_01Q10D00D00D >+ 1612, // imageAtomicAnd_01b10D00D00D >+ 1614, // imageAtomicAnd_01G20D00D00D >+ 1616, // imageAtomicAnd_01R20D00D00D >+ 1618, // imageAtomicAnd_01c20D00D00D >+ 1620, // imageAtomicOr_00z10D00E >+ 1622, // imageAtomicOr_01K10D00E >+ 1624, // imageAtomicOr_01V10D00E >+ 1626, // imageAtomicOr_01A20D00E >+ 1628, // imageAtomicOr_01L20D00E >+ 1630, // imageAtomicOr_01W20D00E >+ 1632, // imageAtomicOr_01C20D00E >+ 1634, // imageAtomicOr_01N20D00E >+ 1636, // imageAtomicOr_01Y20D00E >+ 1638, // imageAtomicOr_01J00D00E >+ 1640, // imageAtomicOr_01U00D00E >+ 1642, // imageAtomicOr_01f00D00E >+ 1644, // imageAtomicOr_01B20D00E >+ 1646, // imageAtomicOr_01M20D00E >+ 1648, // imageAtomicOr_01X20D00E >+ 1650, // imageAtomicOr_01H20D00E >+ 1652, // imageAtomicOr_01S20D00E >+ 1654, // imageAtomicOr_01d20D00E >+ 1656, // imageAtomicOr_01D00D00E >+ 1658, // imageAtomicOr_01O00D00E >+ 1660, // imageAtomicOr_01Z00D00E >+ 1662, // imageAtomicOr_01E10D00E >+ 1664, // imageAtomicOr_01P10D00E >+ 1666, // imageAtomicOr_01a10D00E >+ 1668, // imageAtomicOr_01I10D00E >+ 1670, // imageAtomicOr_01T10D00E >+ 1672, // imageAtomicOr_01e10D00E >+ 1674, // imageAtomicOr_01F10D00D00E >+ 1676, // imageAtomicOr_01Q10D00D00E >+ 1678, // imageAtomicOr_01b10D00D00E >+ 1680, // imageAtomicOr_01G20D00D00E >+ 1682, // imageAtomicOr_01R20D00D00E >+ 1684, // imageAtomicOr_01c20D00D00E >+ 1686, // imageAtomicOr_00z10D00D >+ 1688, // imageAtomicOr_01K10D00D >+ 1690, // imageAtomicOr_01V10D00D >+ 1692, // imageAtomicOr_01A20D00D >+ 1694, // imageAtomicOr_01L20D00D >+ 1696, // imageAtomicOr_01W20D00D >+ 1698, // imageAtomicOr_01C20D00D >+ 1700, // imageAtomicOr_01N20D00D >+ 1702, // imageAtomicOr_01Y20D00D >+ 1704, // imageAtomicOr_01J00D00D >+ 1706, // imageAtomicOr_01U00D00D >+ 1708, // imageAtomicOr_01f00D00D >+ 1710, // imageAtomicOr_01B20D00D >+ 1712, // imageAtomicOr_01M20D00D >+ 1714, // imageAtomicOr_01X20D00D >+ 1716, // imageAtomicOr_01H20D00D >+ 1718, // imageAtomicOr_01S20D00D >+ 1720, // imageAtomicOr_01d20D00D >+ 1722, // imageAtomicOr_01D00D00D >+ 1724, // imageAtomicOr_01O00D00D >+ 1726, // imageAtomicOr_01Z00D00D >+ 1728, // imageAtomicOr_01E10D00D >+ 1730, // imageAtomicOr_01P10D00D >+ 1732, // imageAtomicOr_01a10D00D >+ 1734, // imageAtomicOr_01I10D00D >+ 1736, // imageAtomicOr_01T10D00D >+ 1738, // imageAtomicOr_01e10D00D >+ 1740, // imageAtomicOr_01F10D00D00D >+ 1742, // imageAtomicOr_01Q10D00D00D >+ 1744, // imageAtomicOr_01b10D00D00D >+ 1746, // imageAtomicOr_01G20D00D00D >+ 1748, // imageAtomicOr_01R20D00D00D >+ 1750, // imageAtomicOr_01c20D00D00D >+ 1752, // imageAtomicXor_00z10D00E >+ 1754, // imageAtomicXor_01K10D00E >+ 1756, // imageAtomicXor_01V10D00E >+ 1758, // imageAtomicXor_01A20D00E >+ 1760, // imageAtomicXor_01L20D00E >+ 1762, // imageAtomicXor_01W20D00E >+ 1764, // imageAtomicXor_01C20D00E >+ 1766, // imageAtomicXor_01N20D00E >+ 1768, // imageAtomicXor_01Y20D00E >+ 1770, // imageAtomicXor_01J00D00E >+ 1772, // imageAtomicXor_01U00D00E >+ 1774, // imageAtomicXor_01f00D00E >+ 1776, // imageAtomicXor_01B20D00E >+ 1778, // imageAtomicXor_01M20D00E >+ 1780, // imageAtomicXor_01X20D00E >+ 1782, // imageAtomicXor_01H20D00E >+ 1784, // imageAtomicXor_01S20D00E >+ 1786, // imageAtomicXor_01d20D00E >+ 1788, // imageAtomicXor_01D00D00E >+ 1790, // imageAtomicXor_01O00D00E >+ 1792, // imageAtomicXor_01Z00D00E >+ 1794, // imageAtomicXor_01E10D00E >+ 1796, // imageAtomicXor_01P10D00E >+ 1798, // imageAtomicXor_01a10D00E >+ 1800, // imageAtomicXor_01I10D00E >+ 1802, // imageAtomicXor_01T10D00E >+ 1804, // imageAtomicXor_01e10D00E >+ 1806, // imageAtomicXor_01F10D00D00E >+ 1808, // imageAtomicXor_01Q10D00D00E >+ 1810, // imageAtomicXor_01b10D00D00E >+ 1812, // imageAtomicXor_01G20D00D00E >+ 1814, // imageAtomicXor_01R20D00D00E >+ 1816, // imageAtomicXor_01c20D00D00E >+ 1818, // imageAtomicXor_00z10D00D >+ 1820, // imageAtomicXor_01K10D00D >+ 1822, // imageAtomicXor_01V10D00D >+ 1824, // imageAtomicXor_01A20D00D >+ 1826, // imageAtomicXor_01L20D00D >+ 1828, // imageAtomicXor_01W20D00D >+ 1830, // imageAtomicXor_01C20D00D >+ 1832, // imageAtomicXor_01N20D00D >+ 1834, // imageAtomicXor_01Y20D00D >+ 1836, // imageAtomicXor_01J00D00D >+ 1838, // imageAtomicXor_01U00D00D >+ 1840, // imageAtomicXor_01f00D00D >+ 1842, // imageAtomicXor_01B20D00D >+ 1844, // imageAtomicXor_01M20D00D >+ 1846, // imageAtomicXor_01X20D00D >+ 1848, // imageAtomicXor_01H20D00D >+ 1850, // imageAtomicXor_01S20D00D >+ 1852, // imageAtomicXor_01d20D00D >+ 1854, // imageAtomicXor_01D00D00D >+ 1856, // imageAtomicXor_01O00D00D >+ 1858, // imageAtomicXor_01Z00D00D >+ 1860, // imageAtomicXor_01E10D00D >+ 1862, // imageAtomicXor_01P10D00D >+ 1864, // imageAtomicXor_01a10D00D >+ 1866, // imageAtomicXor_01I10D00D >+ 1868, // imageAtomicXor_01T10D00D >+ 1870, // imageAtomicXor_01e10D00D >+ 1872, // imageAtomicXor_01F10D00D00D >+ 1874, // imageAtomicXor_01Q10D00D00D >+ 1876, // imageAtomicXor_01b10D00D00D >+ 1878, // imageAtomicXor_01G20D00D00D >+ 1880, // imageAtomicXor_01R20D00D00D >+ 1882, // imageAtomicXor_01c20D00D00D >+ 1884, // imageAtomicExchange_00z10D00E >+ 1886, // imageAtomicExchange_01K10D00E >+ 1888, // imageAtomicExchange_01V10D00E >+ 1890, // imageAtomicExchange_01A20D00E >+ 1892, // imageAtomicExchange_01L20D00E >+ 1894, // imageAtomicExchange_01W20D00E >+ 1896, // imageAtomicExchange_01C20D00E >+ 1898, // imageAtomicExchange_01N20D00E >+ 1900, // imageAtomicExchange_01Y20D00E >+ 1902, // imageAtomicExchange_01J00D00E >+ 1904, // imageAtomicExchange_01U00D00E >+ 1906, // imageAtomicExchange_01f00D00E >+ 1908, // imageAtomicExchange_01B20D00E >+ 1910, // imageAtomicExchange_01M20D00E >+ 1912, // imageAtomicExchange_01X20D00E >+ 1914, // imageAtomicExchange_01H20D00E >+ 1916, // imageAtomicExchange_01S20D00E >+ 1918, // imageAtomicExchange_01d20D00E >+ 1920, // imageAtomicExchange_01D00D00E >+ 1922, // imageAtomicExchange_01O00D00E >+ 1924, // imageAtomicExchange_01Z00D00E >+ 1926, // imageAtomicExchange_01E10D00E >+ 1928, // imageAtomicExchange_01P10D00E >+ 1930, // imageAtomicExchange_01a10D00E >+ 1932, // imageAtomicExchange_01I10D00E >+ 1934, // imageAtomicExchange_01T10D00E >+ 1936, // imageAtomicExchange_01e10D00E >+ 1938, // imageAtomicExchange_01F10D00D00E >+ 1940, // imageAtomicExchange_01Q10D00D00E >+ 1942, // imageAtomicExchange_01b10D00D00E >+ 1944, // imageAtomicExchange_01G20D00D00E >+ 1946, // imageAtomicExchange_01R20D00D00E >+ 1948, // imageAtomicExchange_01c20D00D00E >+ 1950, // imageAtomicExchange_00z10D00D >+ 1952, // imageAtomicExchange_01K10D00D >+ 1954, // imageAtomicExchange_01V10D00D >+ 1956, // imageAtomicExchange_01A20D00D >+ 1958, // imageAtomicExchange_01L20D00D >+ 1960, // imageAtomicExchange_01W20D00D >+ 1962, // imageAtomicExchange_01C20D00D >+ 1964, // imageAtomicExchange_01N20D00D >+ 1966, // imageAtomicExchange_01Y20D00D >+ 1968, // imageAtomicExchange_01J00D00D >+ 1970, // imageAtomicExchange_01U00D00D >+ 1972, // imageAtomicExchange_01f00D00D >+ 1974, // imageAtomicExchange_01B20D00D >+ 1976, // imageAtomicExchange_01M20D00D >+ 1978, // imageAtomicExchange_01X20D00D >+ 1980, // imageAtomicExchange_01H20D00D >+ 1982, // imageAtomicExchange_01S20D00D >+ 1984, // imageAtomicExchange_01d20D00D >+ 1986, // imageAtomicExchange_01D00D00D >+ 1988, // imageAtomicExchange_01O00D00D >+ 1990, // imageAtomicExchange_01Z00D00D >+ 1992, // imageAtomicExchange_01E10D00D >+ 1994, // imageAtomicExchange_01P10D00D >+ 1996, // imageAtomicExchange_01a10D00D >+ 1998, // imageAtomicExchange_01I10D00D >+ 2000, // imageAtomicExchange_01T10D00D >+ 2002, // imageAtomicExchange_01e10D00D >+ 2004, // imageAtomicExchange_01F10D00D00D >+ 2006, // imageAtomicExchange_01Q10D00D00D >+ 2008, // imageAtomicExchange_01b10D00D00D >+ 2010, // imageAtomicExchange_01G20D00D00D >+ 2012, // imageAtomicExchange_01R20D00D00D >+ 2014, // imageAtomicExchange_01c20D00D00D >+ 2016, // imageAtomicExchange_00z10D00B >+ 2018, // imageAtomicExchange_01K10D00B >+ 2020, // imageAtomicExchange_01V10D00B >+ 2022, // imageAtomicExchange_01A20D00B >+ 2024, // imageAtomicExchange_01L20D00B >+ 2026, // imageAtomicExchange_01W20D00B >+ 2028, // imageAtomicExchange_01C20D00B >+ 2030, // imageAtomicExchange_01N20D00B >+ 2032, // imageAtomicExchange_01Y20D00B >+ 2034, // imageAtomicExchange_01J00D00B >+ 2036, // imageAtomicExchange_01U00D00B >+ 2038, // imageAtomicExchange_01f00D00B >+ 2040, // imageAtomicExchange_01B20D00B >+ 2042, // imageAtomicExchange_01M20D00B >+ 2044, // imageAtomicExchange_01X20D00B >+ 2046, // imageAtomicExchange_01H20D00B >+ 2048, // imageAtomicExchange_01S20D00B >+ 2050, // imageAtomicExchange_01d20D00B >+ 2052, // imageAtomicExchange_01D00D00B >+ 2054, // imageAtomicExchange_01O00D00B >+ 2056, // imageAtomicExchange_01Z00D00B >+ 2058, // imageAtomicExchange_01E10D00B >+ 2060, // imageAtomicExchange_01P10D00B >+ 2062, // imageAtomicExchange_01a10D00B >+ 2064, // imageAtomicExchange_01I10D00B >+ 2066, // imageAtomicExchange_01T10D00B >+ 2068, // imageAtomicExchange_01e10D00B >+ 2070, // imageAtomicExchange_01F10D00D00B >+ 2072, // imageAtomicExchange_01Q10D00D00B >+ 2074, // imageAtomicExchange_01b10D00D00B >+ 2076, // imageAtomicExchange_01G20D00D00B >+ 2078, // imageAtomicExchange_01R20D00D00B >+ 2080, // imageAtomicExchange_01c20D00D00B >+ 2082, // imageAtomicCompSwap_00z10D00E00E >+ 2084, // imageAtomicCompSwap_01K10D00E00E >+ 2086, // imageAtomicCompSwap_01V10D00E00E >+ 2088, // imageAtomicCompSwap_01A20D00E00E >+ 2090, // imageAtomicCompSwap_01L20D00E00E >+ 2092, // imageAtomicCompSwap_01W20D00E00E >+ 2094, // imageAtomicCompSwap_01C20D00E00E >+ 2096, // imageAtomicCompSwap_01N20D00E00E >+ 2098, // imageAtomicCompSwap_01Y20D00E00E >+ 2100, // imageAtomicCompSwap_01J00D00E00E >+ 2102, // imageAtomicCompSwap_01U00D00E00E >+ 2104, // imageAtomicCompSwap_01f00D00E00E >+ 2106, // imageAtomicCompSwap_01B20D00E00E >+ 2108, // imageAtomicCompSwap_01M20D00E00E >+ 2110, // imageAtomicCompSwap_01X20D00E00E >+ 2112, // imageAtomicCompSwap_01H20D00E00E >+ 2114, // imageAtomicCompSwap_01S20D00E00E >+ 2116, // imageAtomicCompSwap_01d20D00E00E >+ 2118, // imageAtomicCompSwap_01D00D00E00E >+ 2120, // imageAtomicCompSwap_01O00D00E00E >+ 2122, // imageAtomicCompSwap_01Z00D00E00E >+ 2124, // imageAtomicCompSwap_01E10D00E00E >+ 2126, // imageAtomicCompSwap_01P10D00E00E >+ 2128, // imageAtomicCompSwap_01a10D00E00E >+ 2130, // imageAtomicCompSwap_01I10D00E00E >+ 2132, // imageAtomicCompSwap_01T10D00E00E >+ 2134, // imageAtomicCompSwap_01e10D00E00E >+ 2136, // imageAtomicCompSwap_01F10D00D00E00E >+ 2138, // imageAtomicCompSwap_01Q10D00D00E00E >+ 2140, // imageAtomicCompSwap_01b10D00D00E00E >+ 2142, // imageAtomicCompSwap_01G20D00D00E00E >+ 2144, // imageAtomicCompSwap_01R20D00D00E00E >+ 2146, // imageAtomicCompSwap_01c20D00D00E00E >+ 2148, // imageAtomicCompSwap_00z10D00D00D >+ 2150, // imageAtomicCompSwap_01K10D00D00D >+ 2152, // imageAtomicCompSwap_01V10D00D00D >+ 2154, // imageAtomicCompSwap_01A20D00D00D >+ 2156, // imageAtomicCompSwap_01L20D00D00D >+ 2158, // imageAtomicCompSwap_01W20D00D00D >+ 2160, // imageAtomicCompSwap_01C20D00D00D >+ 2162, // imageAtomicCompSwap_01N20D00D00D >+ 2164, // imageAtomicCompSwap_01Y20D00D00D >+ 2166, // imageAtomicCompSwap_01J00D00D00D >+ 2168, // imageAtomicCompSwap_01U00D00D00D >+ 2170, // imageAtomicCompSwap_01f00D00D00D >+ 2172, // imageAtomicCompSwap_01B20D00D00D >+ 2174, // imageAtomicCompSwap_01M20D00D00D >+ 2176, // imageAtomicCompSwap_01X20D00D00D >+ 2178, // imageAtomicCompSwap_01H20D00D00D >+ 2180, // imageAtomicCompSwap_01S20D00D00D >+ 2182, // imageAtomicCompSwap_01d20D00D00D >+ 2184, // imageAtomicCompSwap_01D00D00D00D >+ 2186, // imageAtomicCompSwap_01O00D00D00D >+ 2188, // imageAtomicCompSwap_01Z00D00D00D >+ 2190, // imageAtomicCompSwap_01E10D00D00D >+ 2192, // imageAtomicCompSwap_01P10D00D00D >+ 2194, // imageAtomicCompSwap_01a10D00D00D >+ 2196, // imageAtomicCompSwap_01I10D00D00D >+ 2198, // imageAtomicCompSwap_01T10D00D00D >+ 2200, // imageAtomicCompSwap_01e10D00D00D >+ 2202, // imageAtomicCompSwap_01F10D00D00D00D >+ 2204, // imageAtomicCompSwap_01Q10D00D00D00D >+ 2206, // imageAtomicCompSwap_01b10D00D00D00D >+ 2208, // imageAtomicCompSwap_01G20D00D00D00D >+ 2210, // imageAtomicCompSwap_01R20D00D00D00D >+ 2212, // imageAtomicCompSwap_01c20D00D00D00D >+ 2214, // memoryBarrier_ >+ 2215, // memoryBarrierAtomicCounter_ >+ 2216, // memoryBarrierBuffer_ >+ 2217, // memoryBarrierImage_ >+ 2218, // barrier_ >+ 2221, // memoryBarrierShared_ >+ 2222, // groupMemoryBarrier_ >+ 2223, // EmitVertex_ >+ 2226, // EndPrimitive_ >+ 2229, // subpassLoad_01g >+ 2230, // subpassLoad_01h >+ 2231, // subpassLoad_01i >+ 2232, // subpassLoad_01j00D >+ 2233, // subpassLoad_01k00D >+ 2234, // subpassLoad_01l00D >+ 2235, // gl_DepthRangeParameters >+ 2236, // gl_DepthRange >+ 2237, // gl_NumSamples >+ 2239, // gl_MaxVertexAttribs >+ 2240, // gl_MaxVertexUniformVectors >+ 2241, // gl_MaxVertexTextureImageUnits >+ 2242, // gl_MaxCombinedTextureImageUnits >+ 2243, // gl_MaxTextureImageUnits >+ 2244, // gl_MaxFragmentUniformVectors >+ 2245, // gl_MaxVaryingVectors >+ 2246, // gl_MaxDrawBuffers >+ 2247, // gl_MaxDualSourceDrawBuffersEXT >+ 2248, // gl_MaxVertexOutputVectors >+ 2249, // gl_MaxFragmentInputVectors >+ 2250, // gl_MinProgramTexelOffset >+ 2251, // gl_MaxProgramTexelOffset >+ 2252, // gl_MaxImageUnits >+ 2253, // gl_MaxVertexImageUniforms >+ 2254, // gl_MaxFragmentImageUniforms >+ 2255, // gl_MaxComputeImageUniforms >+ 2256, // gl_MaxCombinedImageUniforms >+ 2257, // gl_MaxCombinedShaderOutputResources >+ 2258, // gl_MaxComputeWorkGroupCount >+ 2259, // gl_MaxComputeWorkGroupSize >+ 2260, // gl_MaxComputeUniformComponents >+ 2261, // gl_MaxComputeTextureImageUnits >+ 2262, // gl_MaxComputeAtomicCounters >+ 2263, // gl_MaxComputeAtomicCounterBuffers >+ 2264, // gl_MaxVertexAtomicCounters >+ 2265, // gl_MaxFragmentAtomicCounters >+ 2266, // gl_MaxCombinedAtomicCounters >+ 2267, // gl_MaxAtomicCounterBindings >+ 2268, // gl_MaxVertexAtomicCounterBuffers >+ 2269, // gl_MaxFragmentAtomicCounterBuffers >+ 2270, // gl_MaxCombinedAtomicCounterBuffers >+ 2271, // gl_MaxAtomicCounterBufferSize >+ 2272, // gl_MaxGeometryInputComponents >+ 2275, // gl_MaxGeometryOutputComponents >+ 2278, // gl_MaxGeometryImageUniforms >+ 2281, // gl_MaxGeometryTextureImageUnits >+ 2284, // gl_MaxGeometryOutputVertices >+ 2287, // gl_MaxGeometryTotalOutputComponents >+ 2290, // gl_MaxGeometryUniformComponents >+ 2293, // gl_MaxGeometryAtomicCounters >+ 2296, // gl_MaxGeometryAtomicCounterBuffers >+ 2299, // gl_MaxTessControlInputComponents >+ 2301, // gl_MaxTessControlOutputComponents >+ 2303, // gl_MaxTessControlTextureImageUnits >+ 2305, // gl_MaxTessControlUniformComponents >+ 2307, // gl_MaxTessControlTotalOutputComponents >+ 2309, // gl_MaxTessControlImageUniforms >+ 2311, // gl_MaxTessControlAtomicCounters >+ 2313, // gl_MaxTessControlAtomicCounterBuffers >+ 2315, // gl_MaxTessPatchComponents >+ 2317, // gl_MaxPatchVertices >+ 2319, // gl_MaxTessGenLevel >+ 2321, // gl_MaxTessEvaluationInputComponents >+ 2323, // gl_MaxTessEvaluationOutputComponents >+ 2325, // gl_MaxTessEvaluationTextureImageUnits >+ 2327, // gl_MaxTessEvaluationUniformComponents >+ 2329, // gl_MaxTessEvaluationImageUniforms >+ 2331, // gl_MaxTessEvaluationAtomicCounters >+ 2333, // gl_MaxTessEvaluationAtomicCounterBuffers >+ 2335, // gl_MaxSamples >+ 2337, // gl_MaxClipDistances >+ 2338, // gl_MaxCullDistances >+ 2339, // gl_MaxCombinedClipAndCullDistances >+ 2340, // gl_FragCoord >+ 2342, // gl_FrontFacing >+ 2343, // gl_PointCoord >+ 2344, // gl_FragColor >+ 2345, // gl_FragData >+ 2346, // gl_FragDepth >+ 2347, // gl_HelperInvocation >+ 2348, // gl_SecondaryFragColorEXT >+ 2349, // gl_SecondaryFragDataEXT >+ 2350, // gl_FragDepthEXT >+ 2351, // gl_LastFragData >+ 2354, // gl_LastFragColor >+ 2355, // gl_LastFragColorARM >+ 2356, // gl_PrimitiveID >+ 2366, // gl_Layer >+ 2372, // gl_SampleID >+ 2374, // gl_SamplePosition >+ 2376, // gl_SampleMaskIn >+ 2378, // gl_SampleMask >+ 2380, // gl_CullDistance >+ 2382, // gl_ClipDistance >+ 2384, // gl_Position >+ 2392, // gl_PointSize >+ 2394, // gl_InstanceID >+ 2395, // Empty >+ 2395, // gl_VertexID >+ 2396, // Empty >+ 2396, // Empty >+ 2396, // gl_DrawID >+ 2397, // gl_BaseVertex >+ 2398, // gl_BaseInstance >+ 2399, // angle_BaseVertex >+ 2400, // angle_BaseInstance >+ 2401, // gl_NumWorkGroups >+ 2402, // gl_WorkGroupSize >+ 2403, // gl_WorkGroupID >+ 2404, // gl_LocalInvocationID >+ 2405, // gl_GlobalInvocationID >+ 2406, // gl_LocalInvocationIndex >+ 2407, // gl_PrimitiveIDIn >+ 2410, // gl_InvocationID >+ 2415, // gl_PerVertex >+ 2422, // gl_in >+ 2429, // gl_PatchVerticesIn >+ 2433, // gl_TessLevelOuter >+ 2437, // gl_TessLevelInner >+ 2441, // gl_out >+ 2445, // gl_BoundingBoxEXT >+ 2447, // gl_TessCoord >+ 2448, // gl_ViewID_OVR > }; > > using Ext = TExtension; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.cpp >index f074415a364f3f56793fde659dcd18c397d0e095..a5e6c8efc8e47ed1ad292ead7f0d372bf83ae0f2 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/SymbolTable_autogen.cpp >@@ -31312,12 +31312,15 @@ constexpr SymbolRule kRules[] = { > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&textureSize_00b), > Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>( > &textureSizeExt_00b), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00Q), > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&textureSize_00Q), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &textureSizeExt_00Q), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00W), > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&textureSize_00W), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &textureSizeExt_00W), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&textureSize_00c), > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&textureSize_00c), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &textureSizeExt_00c), >@@ -31402,12 +31405,15 @@ constexpr SymbolRule kRules[] = { > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&texelFetch_00b10D00D), > Rule::Get<Spec::ESSL, 300, Shader::ALL, EXT_INDEX(ANGLE_texture_multisample)>( > &texelFetchExt_00b10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00Q20D00D), > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&texelFetch_00Q20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &texelFetchExt_00Q20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00W20D00D), > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&texelFetch_00W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &texelFetchExt_00W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&texelFetch_00c20D00D), > Rule::Get<Spec::GLSL, 150, Shader::ALL, 0>(&texelFetch_00c20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_texture_storage_multisample_2d_array)>( > &texelFetchExt_00c20D00D), >@@ -32503,1686 +32509,2247 @@ constexpr SymbolRule kRules[] = { > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageLoad_01G20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageLoad_01R20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageLoad_01c20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_00z10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01K10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01V10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01A20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01L20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01W20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01C20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01N20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Y20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01J00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01U00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01f00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01B20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01M20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01X20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01H20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01S20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01d20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01O00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Z00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01E10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01P10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01a10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01I10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01T10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01e10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01F10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Q10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01b10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01G20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01R20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01c20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_00z10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01K10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01V10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01A20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01L20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01W20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01C20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01N20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Y20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01J00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01U00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01f00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01B20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01M20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01X20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01H20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01S20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01d20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01O00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Z00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01E10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01P10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01a10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01I10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01T10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01e10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01F10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01Q10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01b10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01G20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01R20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAdd_01c20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAdd_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAddExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_00z10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01K10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01V10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01A20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01L20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01W20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01C20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01N20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Y20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01J00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01U00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01f00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01B20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01M20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01X20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01H20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01S20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01d20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01O00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Z00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01E10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01P10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01a10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01I10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01T10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01e10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01F10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Q10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01b10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01G20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01R20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01c20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_00z10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01K10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01V10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01A20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01L20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01W20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01C20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01N20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Y20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01J00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01U00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01f00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01B20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01M20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01X20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01H20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01S20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01d20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01O00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Z00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01E10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01P10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01a10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01I10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01T10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01e10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01F10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01Q10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01b10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01G20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01R20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMin_01c20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMin_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMinExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_00z10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01K10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01V10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01A20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01L20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01W20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01C20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01N20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Y20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01J00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01U00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01f00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01B20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01M20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01X20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01H20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01S20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01d20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01O00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Z00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01E10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01P10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01a10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01I10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01T10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01e10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01F10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Q10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01b10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01G20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01R20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01c20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_00z10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01K10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01V10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01A20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01L20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01W20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01C20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01N20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Y20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01J00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01U00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01f00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01B20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01M20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01X20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01H20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01S20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01d20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01O00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Z00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01E10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01P10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01a10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01I10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01T10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01e10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01F10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01Q10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01b10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01G20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01R20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicMax_01c20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicMax_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicMaxExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_00z10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01K10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01V10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01A20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01L20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01W20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01C20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01N20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Y20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01J00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01U00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01f00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01B20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01M20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01X20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01H20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01S20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01d20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01O00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Z00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01E10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01P10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01a10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01I10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01T10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01e10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01F10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Q10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01b10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01G20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01R20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01c20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_00z10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01K10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01V10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01A20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01L20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01W20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01C20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01N20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Y20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01J00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01U00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01f00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01B20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01M20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01X20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01H20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01S20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01d20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01O00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Z00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01E10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01P10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01a10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01I10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01T10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01e10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01F10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01Q10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01b10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01G20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01R20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicAnd_01c20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicAnd_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicAndExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_00z10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01K10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01V10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01A20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01L20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01W20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01C20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01N20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Y20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01J00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01U00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01f00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01B20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01M20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01X20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01H20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01S20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01d20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01O00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Z00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01E10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01P10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01a10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01I10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01T10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01e10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01F10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Q10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01b10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01G20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01R20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01c20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_00z10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01K10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01V10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01A20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01L20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01W20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01C20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01N20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Y20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01J00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01U00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01f00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01B20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01M20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01X20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01H20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01S20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01d20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01O00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Z00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01E10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01P10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01a10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01I10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01T10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01e10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01F10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01Q10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01b10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01G20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01R20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicOr_01c20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicOr_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicOrExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_00z10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01K10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01V10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01A20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01L20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01W20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01C20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01N20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Y20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01J00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01U00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01f00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01B20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01M20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01X20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01H20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01S20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01d20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01O00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Z00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01E10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01P10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01a10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01I10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01T10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01e10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01F10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Q10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01b10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01G20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01R20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01c20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_00z10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01K10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01V10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01A20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01L20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01W20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01C20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01N20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Y20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01J00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01U00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01f00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01B20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01M20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01X20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01H20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01S20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01d20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01O00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Z00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01E10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01P10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01a10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01I10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01T10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01e10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01F10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01Q10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01b10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01G20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01R20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicXor_01c20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicXor_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicXorExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_00z10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_00z10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_00z10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01K10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01K10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01K10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01V10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01V10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01V10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01A20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01A20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01A20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01L20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01L20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01L20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01W20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01W20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01W20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01C20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01C20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01C20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01N20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01N20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01N20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Y20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01J00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01J00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01J00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01U00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01U00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01U00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01f00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01f00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01f00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01B20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01B20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01B20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01M20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01M20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01M20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01X20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01X20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01X20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01H20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01H20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01H20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01S20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01S20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01S20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01d20D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01d20D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01d20D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01O00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01O00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01O00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Z00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01E10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01E10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01E10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01P10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01P10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01P10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01a10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01a10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01a10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01I10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01I10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01I10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01T10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01T10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01T10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01e10D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01e10D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01e10D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01F10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Q10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01b10D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01G20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01R20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01c20D00D00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_00z10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_00z10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_00z10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01K10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01K10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01K10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01V10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01V10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01V10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01A20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01A20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01A20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01L20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01L20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01L20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01W20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01W20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01W20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01C20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01C20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01C20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01N20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01N20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01N20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Y20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01J00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01J00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01J00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01U00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01U00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01U00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01f00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01f00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01f00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01B20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01B20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01B20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01M20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01M20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01M20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01X20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01X20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01X20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01H20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01H20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01H20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01S20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01S20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01S20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01d20D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01d20D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01d20D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01O00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01O00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01O00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Z00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01E10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01E10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01E10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01P10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01P10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01P10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01a10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01a10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01a10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01I10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01I10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01I10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01T10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01T10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01T10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01e10D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01e10D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01e10D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01F10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Q10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01b10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01G20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01R20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01c20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_00z10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_00z10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_00z10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01K10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01K10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01K10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01V10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01V10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01V10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01A20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01A20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01A20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01L20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01L20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01L20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01W20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01W20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01W20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01C20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01C20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01C20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01N20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01N20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01N20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01Y20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Y20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01J00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01J00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01J00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01U00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01U00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01U00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01f00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01f00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01f00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01B20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01B20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01B20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01M20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01M20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01M20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01X20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01X20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01X20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01H20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01H20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01H20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01S20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01S20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01S20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01d20D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01d20D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01d20D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01D00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01O00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01O00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01O00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01Z00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Z00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01E10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01E10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01E10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01P10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01P10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01P10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01a10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01a10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01a10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01I10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01I10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01I10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01T10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01T10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01T10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01e10D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01e10D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01e10D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01F10D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01F10D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01Q10D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01Q10D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01b10D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01b10D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01G20D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01G20D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01R20D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01R20D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00B), > Rule::Get<Spec::GLSL, 450, Shader::ALL, 0>(&imageAtomicExchange_01c20D00D00B), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicExchangeExt_01c20D00D00B), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_00z10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_00z10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_00z10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01K10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01K10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01K10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01V10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01V10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01V10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01A20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01A20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01A20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01L20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01L20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01L20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01W20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01W20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01W20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01C20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01C20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01C20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01N20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01N20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01N20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Y20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01Y20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Y20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01J00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01J00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01J00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01U00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01U00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01U00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01f00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01f00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01f00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01B20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01B20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01B20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01M20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01M20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01M20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01X20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01X20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01X20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01H20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01H20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01H20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01S20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01S20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01S20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01d20D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01d20D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01d20D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01D00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01O00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01O00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01O00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Z00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01Z00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Z00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01E10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01E10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01E10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01P10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01P10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01P10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01a10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01a10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01a10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01I10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01I10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01I10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01T10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01T10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01T10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01e10D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01e10D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01e10D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01F10D00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01F10D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01F10D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Q10D00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01Q10D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Q10D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01b10D00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01b10D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01b10D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01G20D00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01G20D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01G20D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01R20D00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01R20D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01R20D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01c20D00D00E00E), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01c20D00D00E00E), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01c20D00D00E00E), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_00z10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_00z10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_00z10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01K10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01K10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01K10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01V10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01V10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01V10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01A20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01A20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01A20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01L20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01L20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01L20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01W20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01W20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01W20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01C20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01C20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01C20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01N20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01N20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01N20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Y20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01Y20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Y20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01J00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01J00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01J00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01U00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01U00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01U00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01f00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01f00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01f00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01B20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01B20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01B20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01M20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01M20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01M20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01X20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01X20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01X20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01H20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01H20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01H20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01S20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01S20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01S20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01d20D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01d20D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01d20D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01D00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01O00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01O00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01O00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Z00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01Z00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Z00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01E10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01E10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01E10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01P10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01P10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01P10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01a10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01a10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01a10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01I10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01I10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01I10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01T10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01T10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01T10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01e10D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01e10D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01e10D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01F10D00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01F10D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01F10D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01Q10D00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01Q10D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01Q10D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01b10D00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01b10D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01b10D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01G20D00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01G20D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01G20D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01R20D00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01R20D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01R20D00D00D00D), >+ Rule::Get<Spec::ESSL, 320, Shader::ALL, 0>(&imageAtomicCompSwap_01c20D00D00D00D), > Rule::Get<Spec::GLSL, 420, Shader::ALL, 0>(&imageAtomicCompSwap_01c20D00D00D00D), > Rule::Get<Spec::ESSL, 310, Shader::ALL, EXT_INDEX(OES_shader_image_atomic)>( > &imageAtomicCompSwapExt_01c20D00D00D00D), >@@ -37721,1378 +38288,1378 @@ constexpr uint16_t kMangledOffsets[] = { > 1404, // textureSize_00V > 1407, // textureSize_00b > 1410, // textureSize_00Q >- 1412, // textureSize_00W >- 1414, // textureSize_00c >- 1416, // textureSize_00M00D >- 1417, // textureSize_00N00D >- 1418, // textureProjLod_00I20B00B >- 1420, // textureProjLod_00R20B00B >- 1422, // textureProjLod_00X20B00B >- 1424, // textureProjLod_00I30B00B >- 1426, // textureProjLod_00R30B00B >- 1428, // textureProjLod_00X30B00B >- 1430, // textureProjLod_00J30B00B >- 1432, // textureProjLod_00S30B00B >- 1434, // textureProjLod_00Y30B00B >- 1436, // textureProjLod_00d30B00B >- 1438, // textureProjLod_00g10B00B >- 1439, // textureProjLod_00o10B00B >- 1440, // textureProjLod_00t10B00B >- 1441, // textureProjLod_00g30B00B >- 1442, // textureProjLod_00o30B00B >- 1443, // textureProjLod_00t30B00B >- 1444, // textureProjLod_00m30B00B >- 1445, // texelFetch_00I10D00D >- 1447, // texelFetch_00R10D00D >- 1449, // texelFetch_00X10D00D >- 1451, // texelFetch_00J20D00D >- 1453, // texelFetch_00S20D00D >- 1455, // texelFetch_00Y20D00D >- 1457, // texelFetch_00L20D00D >- 1459, // texelFetch_00U20D00D >- 1461, // texelFetch_00a20D00D >- 1463, // texelFetch_00g00D00D >- 1464, // texelFetch_00o00D00D >- 1465, // texelFetch_00t00D00D >- 1466, // texelFetch_00O10D >- 1467, // texelFetch_00q10D >- 1468, // texelFetch_00v10D >- 1469, // texelFetch_00h10D00D >- 1470, // texelFetch_00p10D00D >- 1471, // texelFetch_00u10D00D >- 1472, // texelFetch_00j00D >- 1476, // texelFetch_00r00D >- 1480, // texelFetch_00w00D >- 1484, // texelFetch_00P10D00D >- 1487, // texelFetch_00V10D00D >- 1490, // texelFetch_00b10D00D >- 1493, // texelFetch_00Q20D00D >- 1495, // texelFetch_00W20D00D >- 1497, // texelFetch_00c20D00D >- 1499, // texelFetch_00M10D00D >- 1500, // texelFetch_00N10D00D >- 1501, // textureGrad_00I10B10B10B >- 1503, // textureGrad_00R10B10B10B >- 1505, // textureGrad_00X10B10B10B >- 1507, // textureGrad_00J20B20B20B >- 1509, // textureGrad_00S20B20B20B >- 1511, // textureGrad_00Y20B20B20B >- 1513, // textureGrad_00K20B20B20B >- 1515, // textureGrad_00T20B20B20B >- 1517, // textureGrad_00Z20B20B20B >- 1519, // textureGrad_00I00B00B00B >- 1520, // textureGrad_00R00B00B00B >- 1521, // textureGrad_00X00B00B00B >- 1522, // textureGrad_00O10B10B10B >- 1523, // textureGrad_00q10B10B10B >- 1524, // textureGrad_00v10B10B10B >- 1525, // textureGrad_00n20B10B10B >- 1526, // textureGrad_00d20B10B10B >- 1528, // textureGrad_00e30B20B20B >- 1530, // textureGrad_00L20B10B10B >- 1532, // textureGrad_00U20B10B10B >- 1534, // textureGrad_00a20B10B10B >- 1536, // textureGrad_00f30B10B10B >- 1538, // textureGrad_00m20B00B00B >- 1539, // textureGrad_00h10B00B00B >- 1540, // textureGrad_00p10B00B00B >- 1541, // textureGrad_00u10B00B00B >- 1542, // textureGrad_00i20B00B00B >- 1543, // textureGrad_00k30B20B20B >- 1547, // textureGrad_00s30B20B20B >- 1551, // textureGrad_00x30B20B20B >- 1555, // textureProjGrad_00I20B10B10B >- 1557, // textureProjGrad_00R20B10B10B >- 1559, // textureProjGrad_00X20B10B10B >- 1561, // textureProjGrad_00I30B10B10B >- 1563, // textureProjGrad_00R30B10B10B >- 1565, // textureProjGrad_00X30B10B10B >- 1567, // textureProjGrad_00J30B20B20B >- 1569, // textureProjGrad_00S30B20B20B >- 1571, // textureProjGrad_00Y30B20B20B >- 1573, // textureProjGrad_00d30B10B10B >- 1575, // textureProjGrad_00g10B00B00B >- 1576, // textureProjGrad_00o10B00B00B >- 1577, // textureProjGrad_00t10B00B00B >- 1578, // textureProjGrad_00g30B00B00B >- 1579, // textureProjGrad_00o30B00B00B >- 1580, // textureProjGrad_00t30B00B00B >- 1581, // textureProjGrad_00m30B00B00B >- 1582, // textureProjGrad_00O20B10B10B >- 1583, // textureProjGrad_00q20B10B10B >- 1584, // textureProjGrad_00v20B10B10B >- 1585, // textureProjGrad_00O30B10B10B >- 1586, // textureProjGrad_00q30B10B10B >- 1587, // textureProjGrad_00v30B10B10B >- 1588, // textureProjGrad_00n30B10B10B >- 1589, // textureQueryLevels_00g >- 1590, // textureQueryLevels_00o >- 1591, // textureQueryLevels_00t >- 1592, // textureQueryLevels_00I >- 1593, // textureQueryLevels_00R >- 1594, // textureQueryLevels_00X >- 1595, // textureQueryLevels_00J >- 1596, // textureQueryLevels_00S >- 1597, // textureQueryLevels_00Y >- 1598, // textureQueryLevels_00K >- 1599, // textureQueryLevels_00T >- 1600, // textureQueryLevels_00Z >- 1601, // textureQueryLevels_00h >- 1602, // textureQueryLevels_00p >- 1603, // textureQueryLevels_00u >- 1604, // textureQueryLevels_00L >- 1605, // textureQueryLevels_00U >- 1606, // textureQueryLevels_00a >- 1607, // textureQueryLevels_00k >- 1608, // textureQueryLevels_00s >- 1609, // textureQueryLevels_00x >- 1610, // textureQueryLevels_00m >- 1611, // textureQueryLevels_00d >- 1612, // textureQueryLevels_00e >- 1613, // textureQueryLevels_00i >- 1614, // textureQueryLevels_00f >- 1615, // textureQueryLevels_00l >- 1616, // textureSamples_00P >- 1617, // textureSamples_00V >- 1618, // textureSamples_00b >- 1619, // textureSamples_00Q >- 1620, // textureSamples_00W >- 1621, // textureSamples_00c >- 1622, // texture_00I10B00B >- 1624, // texture_00R10B00B >- 1626, // texture_00X10B00B >- 1628, // texture_00J20B00B >- 1630, // texture_00S20B00B >- 1632, // texture_00Y20B00B >- 1634, // texture_00K20B00B >- 1636, // texture_00T20B00B >- 1638, // texture_00Z20B00B >- 1640, // texture_00L20B00B >- 1642, // texture_00U20B00B >- 1644, // texture_00a20B00B >- 1646, // textureProj_00I20B00B >- 1648, // textureProj_00R20B00B >- 1650, // textureProj_00X20B00B >- 1652, // textureProj_00I30B00B >- 1654, // textureProj_00R30B00B >- 1656, // textureProj_00X30B00B >- 1658, // textureProj_00J30B00B >- 1660, // textureProj_00S30B00B >- 1662, // textureProj_00Y30B00B >- 1664, // texture_00d20B00B >- 1666, // texture_00e30B00B >- 1668, // textureProj_00d30B00B >- 1670, // texture_00g00B00B >- 1671, // texture_00o00B00B >- 1672, // texture_00t00B00B >- 1673, // texture_00m20B00B >- 1674, // texture_00h20B00B >- 1675, // texture_00p20B00B >- 1676, // texture_00u20B00B >- 1677, // texture_00i20B00B >- 1678, // texture_00f30B00B >- 1679, // textureProj_00g10B00B >- 1680, // textureProj_00o10B00B >- 1681, // textureProj_00t10B00B >- 1682, // textureProj_00g30B00B >- 1683, // textureProj_00o30B00B >- 1684, // textureProj_00t30B00B >- 1685, // textureProj_00m30B00B >- 1686, // texture_00k30B00B >- 1690, // texture_00s30B00B >- 1694, // texture_00x30B00B >- 1698, // texture_00M10B00B >- 1699, // textureProj_00M20B00B >- 1700, // textureProj_00M30B00B >- 1701, // texture_00N10B00B >- 1702, // textureProj_00N20B00B >- 1703, // textureProj_00N30B00B >- 1704, // textureQueryLod_00g00B >- 1705, // textureQueryLod_00o00B >- 1706, // textureQueryLod_00t00B >- 1707, // textureQueryLod_00I10B >- 1708, // textureQueryLod_00R10B >- 1709, // textureQueryLod_00X10B >- 1710, // textureQueryLod_00J20B >- 1711, // textureQueryLod_00S20B >- 1712, // textureQueryLod_00Y20B >- 1713, // textureQueryLod_00K20B >- 1714, // textureQueryLod_00T20B >- 1715, // textureQueryLod_00Z20B >- 1716, // textureQueryLod_00h00B >- 1717, // textureQueryLod_00p00B >- 1718, // textureQueryLod_00u00B >- 1719, // textureQueryLod_00L10B >- 1720, // textureQueryLod_00U10B >- 1721, // textureQueryLod_00a10B >- 1722, // textureQueryLod_00k20B >- 1723, // textureQueryLod_00s20B >- 1724, // textureQueryLod_00x20B >- 1725, // textureQueryLod_00m00B >- 1726, // textureQueryLod_00d10B >- 1727, // textureQueryLod_00e20B >- 1728, // textureQueryLod_00i00B >- 1729, // textureQueryLod_00f10B >- 1730, // textureQueryLod_00l20B >- 1731, // textureOffset_00I10B10D >- 1733, // textureOffset_00R10B10D >- 1735, // textureOffset_00X10B10D >- 1737, // textureOffset_00J20B20D >- 1739, // textureOffset_00S20B20D >- 1741, // textureOffset_00Y20B20D >- 1743, // textureOffset_00d20B10D >- 1745, // textureOffset_00L20B10D >- 1747, // textureOffset_00U20B10D >- 1749, // textureOffset_00a20B10D >- 1751, // textureOffset_00g00B00D >- 1752, // textureOffset_00o00B00D >- 1753, // textureOffset_00t00B00D >- 1754, // textureOffset_00O10B10D >- 1755, // textureOffset_00q10B10D >- 1756, // textureOffset_00v10B10D >- 1757, // textureOffset_00n20B10D >- 1758, // textureOffset_00m20B00D >- 1759, // textureOffset_00h10B00D >- 1760, // textureOffset_00p10B00D >- 1761, // textureOffset_00u10B00D >- 1762, // textureOffset_00i20B00D >- 1763, // textureOffset_00f30B10D >- 1764, // textureProjOffset_00I20B10D >- 1766, // textureProjOffset_00R20B10D >- 1768, // textureProjOffset_00X20B10D >- 1770, // textureProjOffset_00I30B10D >- 1772, // textureProjOffset_00R30B10D >- 1774, // textureProjOffset_00X30B10D >- 1776, // textureProjOffset_00J30B20D >- 1778, // textureProjOffset_00S30B20D >- 1780, // textureProjOffset_00Y30B20D >- 1782, // textureProjOffset_00d30B10D >- 1784, // textureProjOffset_00g10B00D >- 1785, // textureProjOffset_00o10B00D >- 1786, // textureProjOffset_00t10B00D >- 1787, // textureProjOffset_00g30B00D >- 1788, // textureProjOffset_00o30B00D >- 1789, // textureProjOffset_00t30B00D >- 1790, // textureProjOffset_00O20B10D >- 1791, // textureProjOffset_00q20B10D >- 1792, // textureProjOffset_00v20B10D >- 1793, // textureProjOffset_00O30B10D >- 1794, // textureProjOffset_00q30B10D >- 1795, // textureProjOffset_00v30B10D >- 1796, // textureProjOffset_00n30B10D >- 1797, // textureProjOffset_00m30B00D >- 1798, // textureLodOffset_00I10B00B10D >- 1800, // textureLodOffset_00R10B00B10D >- 1802, // textureLodOffset_00X10B00B10D >- 1804, // textureLodOffset_00J20B00B20D >- 1806, // textureLodOffset_00S20B00B20D >- 1808, // textureLodOffset_00Y20B00B20D >- 1810, // textureLodOffset_00d20B00B10D >- 1812, // textureLodOffset_00L20B00B10D >- 1814, // textureLodOffset_00U20B00B10D >- 1816, // textureLodOffset_00a20B00B10D >- 1818, // textureLodOffset_00g00B00B00D >- 1819, // textureLodOffset_00o00B00B00D >- 1820, // textureLodOffset_00t00B00B00D >- 1821, // textureLodOffset_00m20B00B00D >- 1822, // textureLodOffset_00h10B00B00D >- 1823, // textureLodOffset_00p10B00B00D >- 1824, // textureLodOffset_00u10B00B00D >- 1825, // textureLodOffset_00i20B00B00D >- 1826, // textureProjLodOffset_00I20B00B10D >- 1828, // textureProjLodOffset_00R20B00B10D >- 1830, // textureProjLodOffset_00X20B00B10D >- 1832, // textureProjLodOffset_00I30B00B10D >- 1834, // textureProjLodOffset_00R30B00B10D >- 1836, // textureProjLodOffset_00X30B00B10D >- 1838, // textureProjLodOffset_00J30B00B20D >- 1840, // textureProjLodOffset_00S30B00B20D >- 1842, // textureProjLodOffset_00Y30B00B20D >- 1844, // textureProjLodOffset_00d30B00B10D >- 1846, // textureProjLodOffset_00g10B00B00D >- 1847, // textureProjLodOffset_00o10B00B00D >- 1848, // textureProjLodOffset_00t10B00B00D >- 1849, // textureProjLodOffset_00g30B00B00D >- 1850, // textureProjLodOffset_00o30B00B00D >- 1851, // textureProjLodOffset_00t30B00B00D >- 1852, // textureProjLodOffset_00m30B00B00D >- 1853, // texelFetchOffset_00I10D00D10D >- 1855, // texelFetchOffset_00R10D00D10D >- 1857, // texelFetchOffset_00X10D00D10D >- 1859, // texelFetchOffset_00J20D00D20D >- 1861, // texelFetchOffset_00S20D00D20D >- 1863, // texelFetchOffset_00Y20D00D20D >- 1865, // texelFetchOffset_00L20D00D10D >- 1867, // texelFetchOffset_00U20D00D10D >- 1869, // texelFetchOffset_00a20D00D10D >- 1871, // texelFetchOffset_00g00D00D00D >- 1872, // texelFetchOffset_00o00D00D00D >- 1873, // texelFetchOffset_00t00D00D00D >- 1874, // texelFetchOffset_00O10D10D >- 1875, // texelFetchOffset_00q10D10D >- 1876, // texelFetchOffset_00v10D10D >- 1877, // texelFetchOffset_00h10D00D00D >- 1878, // texelFetchOffset_00p10D00D00D >- 1879, // texelFetchOffset_00u10D00D00D >- 1880, // textureGradOffset_00I10B10B10B10D >- 1882, // textureGradOffset_00R10B10B10B10D >- 1884, // textureGradOffset_00X10B10B10B10D >- 1886, // textureGradOffset_00J20B20B20B20D >- 1888, // textureGradOffset_00S20B20B20B20D >- 1890, // textureGradOffset_00Y20B20B20B20D >- 1892, // textureGradOffset_00d20B10B10B10D >- 1894, // textureGradOffset_00L20B10B10B10D >- 1896, // textureGradOffset_00U20B10B10B10D >- 1898, // textureGradOffset_00a20B10B10B10D >- 1900, // textureGradOffset_00f30B10B10B10D >- 1902, // textureGradOffset_00g00B00B00B00D >- 1903, // textureGradOffset_00o00B00B00B00D >- 1904, // textureGradOffset_00t00B00B00B00D >- 1905, // textureGradOffset_00O10B10B10B10D >- 1906, // textureGradOffset_00q10B10B10B10D >- 1907, // textureGradOffset_00v10B10B10B10D >- 1908, // textureGradOffset_00n20B10B10B10D >- 1909, // textureGradOffset_00m20B00B00B00D >- 1910, // textureGradOffset_00h10B00B00B00D >- 1911, // textureGradOffset_00p10B00B00B00D >- 1912, // textureGradOffset_00u10B00B00B00D >- 1913, // textureGradOffset_00i20B00B00B00D >- 1914, // textureProjGradOffset_00I20B10B10B10D >- 1916, // textureProjGradOffset_00R20B10B10B10D >- 1918, // textureProjGradOffset_00X20B10B10B10D >- 1920, // textureProjGradOffset_00I30B10B10B10D >- 1922, // textureProjGradOffset_00R30B10B10B10D >- 1924, // textureProjGradOffset_00X30B10B10B10D >- 1926, // textureProjGradOffset_00J30B20B20B20D >- 1928, // textureProjGradOffset_00S30B20B20B20D >- 1930, // textureProjGradOffset_00Y30B20B20B20D >- 1932, // textureProjGradOffset_00d30B10B10B10D >- 1934, // textureProjGradOffset_00g10B00B00B00D >- 1935, // textureProjGradOffset_00o10B00B00B00D >- 1936, // textureProjGradOffset_00t10B00B00B00D >- 1937, // textureProjGradOffset_00g30B00B00B00D >- 1938, // textureProjGradOffset_00o30B00B00B00D >- 1939, // textureProjGradOffset_00t30B00B00B00D >- 1940, // textureProjGradOffset_00O20B10B10B10D >- 1941, // textureProjGradOffset_00q20B10B10B10D >- 1942, // textureProjGradOffset_00v20B10B10B10D >- 1943, // textureProjGradOffset_00O30B10B10B10D >- 1944, // textureProjGradOffset_00q30B10B10B10D >- 1945, // textureProjGradOffset_00v30B10B10B10D >- 1946, // textureProjGradOffset_00n30B10B10B10D >- 1947, // textureProjGradOffset_00m30B00B00B00D >- 1948, // textureOffset_00I10B10D00B >- 1950, // textureOffset_00R10B10D00B >- 1952, // textureOffset_00X10B10D00B >- 1954, // textureOffset_00J20B20D00B >- 1956, // textureOffset_00S20B20D00B >- 1958, // textureOffset_00Y20B20D00B >- 1960, // textureOffset_00d20B10D00B >- 1962, // textureOffset_00L20B10D00B >- 1964, // textureOffset_00U20B10D00B >- 1966, // textureOffset_00a20B10D00B >- 1968, // textureOffset_00g00B00D00B >- 1969, // textureOffset_00o00B00D00B >- 1970, // textureOffset_00t00B00D00B >- 1971, // textureOffset_00m20B00D00B >- 1972, // textureOffset_00h10B00D00B >- 1973, // textureOffset_00p10B00D00B >- 1974, // textureOffset_00u10B00D00B >- 1975, // textureOffset_00i20B00D00B >- 1976, // textureProjOffset_00I20B10D00B >- 1978, // textureProjOffset_00R20B10D00B >- 1980, // textureProjOffset_00X20B10D00B >- 1982, // textureProjOffset_00I30B10D00B >- 1984, // textureProjOffset_00R30B10D00B >- 1986, // textureProjOffset_00X30B10D00B >- 1988, // textureProjOffset_00J30B20D00B >- 1990, // textureProjOffset_00S30B20D00B >- 1992, // textureProjOffset_00Y30B20D00B >- 1994, // textureProjOffset_00d30B10D00B >- 1996, // textureProjOffset_00g10B00D00B >- 1997, // textureProjOffset_00o10B00D00B >- 1998, // textureProjOffset_00t10B00D00B >- 1999, // textureProjOffset_00g30B00D00B >- 2000, // textureProjOffset_00o30B00D00B >- 2001, // textureProjOffset_00t30B00D00B >- 2002, // textureProjOffset_00m30B00D00B >- 2003, // textureGather_00I10B >- 2005, // textureGather_00R10B >- 2007, // textureGather_00X10B >- 2009, // textureGather_00I10B00D >- 2011, // textureGather_00R10B00D >- 2013, // textureGather_00X10B00D >- 2015, // textureGather_00L20B >- 2017, // textureGather_00U20B >- 2019, // textureGather_00a20B >- 2021, // textureGather_00L20B00D >- 2023, // textureGather_00U20B00D >- 2025, // textureGather_00a20B00D >- 2027, // textureGather_00K20B >- 2029, // textureGather_00T20B >- 2031, // textureGather_00Z20B >- 2033, // textureGather_00K20B00D >- 2035, // textureGather_00T20B00D >- 2037, // textureGather_00Z20B00D >- 2039, // textureGather_00k30B >- 2043, // textureGather_00s30B >- 2047, // textureGather_00x30B >- 2051, // textureGather_00k30B00D >- 2055, // textureGather_00s30B00D >- 2059, // textureGather_00x30B00D >- 2063, // textureGather_00l30B00B >- 2067, // textureGather_00O20B >- 2068, // textureGather_00q20B >- 2069, // textureGather_00v20B >- 2070, // textureGather_00O20B00D >- 2071, // textureGather_00q20B00D >- 2072, // textureGather_00v20B00D >- 2073, // textureGather_00n10B00B >- 2074, // textureGather_00d10B >- 2075, // textureGather_00d10B00B >- 2077, // textureGather_00f20B >- 2078, // textureGather_00f20B00B >- 2080, // textureGather_00e20B >- 2081, // textureGather_00e20B00B >- 2083, // textureGatherOffset_00I10B10D >- 2085, // textureGatherOffset_00R10B10D >- 2087, // textureGatherOffset_00X10B10D >- 2089, // textureGatherOffset_00L20B10D >- 2091, // textureGatherOffset_00U20B10D >- 2093, // textureGatherOffset_00a20B10D >- 2095, // textureGatherOffset_00d10B00B10D >- 2097, // textureGatherOffset_00f20B00B10D >- 2099, // textureGatherOffset_00O10B10D >- 2100, // textureGatherOffset_00q10B10D >- 2101, // textureGatherOffset_00v10B10D >- 2102, // textureGatherOffset_00n10B00B10D >- 2103, // textureGatherOffset_00I10B10D00D >- 2105, // textureGatherOffset_00R10B10D00D >- 2107, // textureGatherOffset_00X10B10D00D >- 2109, // textureGatherOffset_00L20B10D00D >- 2111, // textureGatherOffset_00U20B10D00D >- 2113, // textureGatherOffset_00a20B10D00D >- 2115, // textureGatherOffset_00O10B10D00D >- 2116, // textureGatherOffset_00q10B10D00D >- 2117, // textureGatherOffset_00v10B10D00D >- 2118, // textureGatherOffsets_00I10B10Dx4 >- 2121, // textureGatherOffsets_00R10B10Dx4 >- 2124, // textureGatherOffsets_00X10B10Dx4 >- 2127, // textureGatherOffsets_00L20B10Dx4 >- 2130, // textureGatherOffsets_00U20B10Dx4 >- 2133, // textureGatherOffsets_00a20B10Dx4 >- 2136, // textureGatherOffsets_00d10B00B10Dx4 >- 2139, // textureGatherOffsets_00f20B00B10Dx4 >- 2142, // textureGatherOffsets_00O10B10Dx4 >- 2143, // textureGatherOffsets_00q10B10Dx4 >- 2144, // textureGatherOffsets_00v10B10Dx4 >- 2145, // textureGatherOffsets_00n10B00B10Dx4 >- 2146, // textureGatherOffsets_00I10B10Dx400D >- 2149, // textureGatherOffsets_00R10B10Dx400D >- 2152, // textureGatherOffsets_00X10B10Dx400D >- 2155, // textureGatherOffsets_00L20B10Dx400D >- 2158, // textureGatherOffsets_00U20B10Dx400D >- 2161, // textureGatherOffsets_00a20B10Dx400D >- 2164, // textureGatherOffsets_00O10B10Dx400D >- 2165, // textureGatherOffsets_00q10B10Dx400D >- 2166, // textureGatherOffsets_00v10B10Dx400D >- 2167, // rgb_2_yuv_20B00H >- 2168, // yuv_2_rgb_20B00H >- 2169, // dFdx_00B >- 2172, // dFdx_10B >- 2175, // dFdx_20B >- 2178, // dFdx_30B >- 2181, // dFdy_00B >- 2184, // dFdy_10B >- 2187, // dFdy_20B >- 2190, // dFdy_30B >- 2193, // fwidth_00B >- 2196, // fwidth_10B >- 2199, // fwidth_20B >- 2202, // fwidth_30B >- 2205, // dFdxFine_00B >- 2206, // dFdxFine_10B >- 2207, // dFdxFine_20B >- 2208, // dFdxFine_30B >- 2209, // dFdyFine_00B >- 2210, // dFdyFine_10B >- 2211, // dFdyFine_20B >- 2212, // dFdyFine_30B >- 2213, // dFdxCoarse_00B >- 2214, // dFdxCoarse_10B >- 2215, // dFdxCoarse_20B >- 2216, // dFdxCoarse_30B >- 2217, // dFdyCoarse_00B >- 2218, // dFdyCoarse_10B >- 2219, // dFdyCoarse_20B >- 2220, // dFdyCoarse_30B >- 2221, // fwidthFine_00B >- 2222, // fwidthFine_10B >- 2223, // fwidthFine_20B >- 2224, // fwidthFine_30B >- 2225, // fwidthCoarse_00B >- 2226, // fwidthCoarse_10B >- 2227, // fwidthCoarse_20B >- 2228, // fwidthCoarse_30B >- 2229, // interpolateAtCentroid_00B >- 2232, // interpolateAtCentroid_10B >- 2235, // interpolateAtCentroid_20B >- 2238, // interpolateAtCentroid_30B >- 2241, // interpolateAtSample_00B00D >- 2244, // interpolateAtSample_10B00D >- 2247, // interpolateAtSample_20B00D >- 2250, // interpolateAtSample_30B00D >- 2253, // interpolateAtOffset_00B10B >- 2256, // interpolateAtOffset_10B10B >- 2259, // interpolateAtOffset_20B10B >- 2262, // interpolateAtOffset_30B10B >- 2265, // atomicCounter_00G >- 2267, // atomicCounterIncrement_00G >- 2269, // atomicCounterDecrement_00G >- 2271, // atomicCounterAdd_00G00E >- 2272, // atomicCounterSubtract_00G00E >- 2273, // atomicCounterMin_00G00E >- 2274, // atomicCounterMax_00G00E >- 2275, // atomicCounterAnd_00G00E >- 2276, // atomicCounterOr_00G00E >- 2277, // atomicCounterXor_00G00E >- 2278, // atomicCounterExchange_00G00E >- 2279, // atomicCounterCompSwap_00G00E00E >- 2280, // atomicAdd_00E00E >- 2282, // atomicAdd_00D00D >- 2284, // atomicMin_00E00E >- 2286, // atomicMin_00D00D >- 2288, // atomicMax_00E00E >- 2290, // atomicMax_00D00D >- 2292, // atomicAnd_00E00E >- 2294, // atomicAnd_00D00D >- 2296, // atomicOr_00E00E >- 2298, // atomicOr_00D00D >- 2300, // atomicXor_00E00E >- 2302, // atomicXor_00D00D >- 2304, // atomicExchange_00E00E >- 2306, // atomicExchange_00D00D >- 2308, // atomicCompSwap_00E00E00E >- 2310, // atomicCompSwap_00D00D00D >- 2312, // imageSize_00z >- 2314, // imageSize_01K >- 2316, // imageSize_01V >- 2318, // imageSize_01A >- 2320, // imageSize_01L >- 2322, // imageSize_01W >- 2324, // imageSize_01B >- 2326, // imageSize_01M >- 2328, // imageSize_01X >- 2330, // imageSize_01C >- 2332, // imageSize_01N >- 2334, // imageSize_01Y >- 2336, // imageSize_01H >- 2340, // imageSize_01S >- 2344, // imageSize_01d >- 2348, // imageSize_01J >- 2352, // imageSize_01U >- 2356, // imageSize_01f >- 2360, // imageSize_01D >- 2361, // imageSize_01O >- 2362, // imageSize_01Z >- 2363, // imageSize_01I >- 2364, // imageSize_01T >- 2365, // imageSize_01e >- 2366, // imageSize_01E >- 2367, // imageSize_01P >- 2368, // imageSize_01a >- 2369, // imageSize_01F >- 2370, // imageSize_01Q >- 2371, // imageSize_01b >- 2372, // imageSize_01G >- 2373, // imageSize_01R >- 2374, // imageSize_01c >- 2375, // imageSamples_01F >- 2376, // imageSamples_01Q >- 2377, // imageSamples_01b >- 2378, // imageSamples_01G >- 2379, // imageSamples_01R >- 2380, // imageSamples_01c >- 2381, // imageStore_00z10D30B >- 2383, // imageStore_01K10D30D >- 2385, // imageStore_01V10D30E >- 2387, // imageStore_01A20D30B >- 2389, // imageStore_01L20D30D >- 2391, // imageStore_01W20D30E >- 2393, // imageStore_01B20D30B >- 2395, // imageStore_01M20D30D >- 2397, // imageStore_01X20D30E >- 2399, // imageStore_01C20D30B >- 2401, // imageStore_01N20D30D >- 2403, // imageStore_01Y20D30E >- 2405, // imageStore_01H20D30B >- 2409, // imageStore_01S20D30D >- 2413, // imageStore_01d20D30E >- 2417, // imageStore_01J00D30B >- 2421, // imageStore_01U00D30D >- 2425, // imageStore_01f00D30E >- 2429, // imageStore_01D00D30B >- 2430, // imageStore_01O00D30D >- 2431, // imageStore_01Z00D30E >- 2432, // imageStore_01E10D30B >- 2433, // imageStore_01P10D30D >- 2434, // imageStore_01a10D30E >- 2435, // imageStore_01I10D30B >- 2436, // imageStore_01T10D30D >- 2437, // imageStore_01e10D30E >- 2438, // imageStore_01F10D00D30B >- 2439, // imageStore_01Q10D00D30D >- 2440, // imageStore_01b10D00D30E >- 2441, // imageStore_01G20D00D30B >- 2442, // imageStore_01R20D00D30D >- 2443, // imageStore_01c20D00D30E >- 2444, // imageLoad_00z10D >- 2446, // imageLoad_01K10D >- 2448, // imageLoad_01V10D >- 2450, // imageLoad_01A20D >- 2452, // imageLoad_01L20D >- 2454, // imageLoad_01W20D >- 2456, // imageLoad_01B20D >- 2458, // imageLoad_01M20D >- 2460, // imageLoad_01X20D >- 2462, // imageLoad_01C20D >- 2464, // imageLoad_01N20D >- 2466, // imageLoad_01Y20D >- 2468, // imageLoad_01H20D >- 2472, // imageLoad_01S20D >- 2476, // imageLoad_01d20D >- 2480, // imageLoad_01J00D >- 2484, // imageLoad_01U00D >- 2488, // imageLoad_01f00D >- 2492, // imageLoad_01D00D >- 2493, // imageLoad_01O00D >- 2494, // imageLoad_01Z00D >- 2495, // imageLoad_01E10D >- 2496, // imageLoad_01P10D >- 2497, // imageLoad_01a10D >- 2498, // imageLoad_01I10D >- 2499, // imageLoad_01T10D >- 2500, // imageLoad_01e10D >- 2501, // imageLoad_01F10D00D >- 2502, // imageLoad_01Q10D00D >- 2503, // imageLoad_01b10D00D >- 2504, // imageLoad_01G20D00D >- 2505, // imageLoad_01R20D00D >- 2506, // imageLoad_01c20D00D >- 2507, // imageAtomicAdd_00z10D00E >- 2509, // imageAtomicAdd_01K10D00E >- 2511, // imageAtomicAdd_01V10D00E >- 2513, // imageAtomicAdd_01A20D00E >- 2515, // imageAtomicAdd_01L20D00E >- 2517, // imageAtomicAdd_01W20D00E >- 2519, // imageAtomicAdd_01C20D00E >- 2521, // imageAtomicAdd_01N20D00E >- 2523, // imageAtomicAdd_01Y20D00E >- 2525, // imageAtomicAdd_01J00D00E >- 2527, // imageAtomicAdd_01U00D00E >- 2529, // imageAtomicAdd_01f00D00E >- 2531, // imageAtomicAdd_01B20D00E >- 2533, // imageAtomicAdd_01M20D00E >- 2535, // imageAtomicAdd_01X20D00E >- 2537, // imageAtomicAdd_01H20D00E >- 2539, // imageAtomicAdd_01S20D00E >- 2541, // imageAtomicAdd_01d20D00E >- 2543, // imageAtomicAdd_01D00D00E >- 2545, // imageAtomicAdd_01O00D00E >- 2547, // imageAtomicAdd_01Z00D00E >- 2549, // imageAtomicAdd_01E10D00E >- 2551, // imageAtomicAdd_01P10D00E >- 2553, // imageAtomicAdd_01a10D00E >- 2555, // imageAtomicAdd_01I10D00E >- 2557, // imageAtomicAdd_01T10D00E >- 2559, // imageAtomicAdd_01e10D00E >- 2561, // imageAtomicAdd_01F10D00D00E >- 2563, // imageAtomicAdd_01Q10D00D00E >- 2565, // imageAtomicAdd_01b10D00D00E >- 2567, // imageAtomicAdd_01G20D00D00E >- 2569, // imageAtomicAdd_01R20D00D00E >- 2571, // imageAtomicAdd_01c20D00D00E >- 2573, // imageAtomicAdd_00z10D00D >- 2575, // imageAtomicAdd_01K10D00D >- 2577, // imageAtomicAdd_01V10D00D >- 2579, // imageAtomicAdd_01A20D00D >- 2581, // imageAtomicAdd_01L20D00D >- 2583, // imageAtomicAdd_01W20D00D >- 2585, // imageAtomicAdd_01C20D00D >- 2587, // imageAtomicAdd_01N20D00D >- 2589, // imageAtomicAdd_01Y20D00D >- 2591, // imageAtomicAdd_01J00D00D >- 2593, // imageAtomicAdd_01U00D00D >- 2595, // imageAtomicAdd_01f00D00D >- 2597, // imageAtomicAdd_01B20D00D >- 2599, // imageAtomicAdd_01M20D00D >- 2601, // imageAtomicAdd_01X20D00D >- 2603, // imageAtomicAdd_01H20D00D >- 2605, // imageAtomicAdd_01S20D00D >- 2607, // imageAtomicAdd_01d20D00D >- 2609, // imageAtomicAdd_01D00D00D >- 2611, // imageAtomicAdd_01O00D00D >- 2613, // imageAtomicAdd_01Z00D00D >- 2615, // imageAtomicAdd_01E10D00D >- 2617, // imageAtomicAdd_01P10D00D >- 2619, // imageAtomicAdd_01a10D00D >- 2621, // imageAtomicAdd_01I10D00D >- 2623, // imageAtomicAdd_01T10D00D >- 2625, // imageAtomicAdd_01e10D00D >- 2627, // imageAtomicAdd_01F10D00D00D >- 2629, // imageAtomicAdd_01Q10D00D00D >- 2631, // imageAtomicAdd_01b10D00D00D >- 2633, // imageAtomicAdd_01G20D00D00D >- 2635, // imageAtomicAdd_01R20D00D00D >- 2637, // imageAtomicAdd_01c20D00D00D >- 2639, // imageAtomicMin_00z10D00E >- 2641, // imageAtomicMin_01K10D00E >- 2643, // imageAtomicMin_01V10D00E >- 2645, // imageAtomicMin_01A20D00E >- 2647, // imageAtomicMin_01L20D00E >- 2649, // imageAtomicMin_01W20D00E >- 2651, // imageAtomicMin_01C20D00E >- 2653, // imageAtomicMin_01N20D00E >- 2655, // imageAtomicMin_01Y20D00E >- 2657, // imageAtomicMin_01J00D00E >- 2659, // imageAtomicMin_01U00D00E >- 2661, // imageAtomicMin_01f00D00E >- 2663, // imageAtomicMin_01B20D00E >- 2665, // imageAtomicMin_01M20D00E >- 2667, // imageAtomicMin_01X20D00E >- 2669, // imageAtomicMin_01H20D00E >- 2671, // imageAtomicMin_01S20D00E >- 2673, // imageAtomicMin_01d20D00E >- 2675, // imageAtomicMin_01D00D00E >- 2677, // imageAtomicMin_01O00D00E >- 2679, // imageAtomicMin_01Z00D00E >- 2681, // imageAtomicMin_01E10D00E >- 2683, // imageAtomicMin_01P10D00E >- 2685, // imageAtomicMin_01a10D00E >- 2687, // imageAtomicMin_01I10D00E >- 2689, // imageAtomicMin_01T10D00E >- 2691, // imageAtomicMin_01e10D00E >- 2693, // imageAtomicMin_01F10D00D00E >- 2695, // imageAtomicMin_01Q10D00D00E >- 2697, // imageAtomicMin_01b10D00D00E >- 2699, // imageAtomicMin_01G20D00D00E >- 2701, // imageAtomicMin_01R20D00D00E >- 2703, // imageAtomicMin_01c20D00D00E >- 2705, // imageAtomicMin_00z10D00D >- 2707, // imageAtomicMin_01K10D00D >- 2709, // imageAtomicMin_01V10D00D >- 2711, // imageAtomicMin_01A20D00D >- 2713, // imageAtomicMin_01L20D00D >- 2715, // imageAtomicMin_01W20D00D >- 2717, // imageAtomicMin_01C20D00D >- 2719, // imageAtomicMin_01N20D00D >- 2721, // imageAtomicMin_01Y20D00D >- 2723, // imageAtomicMin_01J00D00D >- 2725, // imageAtomicMin_01U00D00D >- 2727, // imageAtomicMin_01f00D00D >- 2729, // imageAtomicMin_01B20D00D >- 2731, // imageAtomicMin_01M20D00D >- 2733, // imageAtomicMin_01X20D00D >- 2735, // imageAtomicMin_01H20D00D >- 2737, // imageAtomicMin_01S20D00D >- 2739, // imageAtomicMin_01d20D00D >- 2741, // imageAtomicMin_01D00D00D >- 2743, // imageAtomicMin_01O00D00D >- 2745, // imageAtomicMin_01Z00D00D >- 2747, // imageAtomicMin_01E10D00D >- 2749, // imageAtomicMin_01P10D00D >- 2751, // imageAtomicMin_01a10D00D >- 2753, // imageAtomicMin_01I10D00D >- 2755, // imageAtomicMin_01T10D00D >- 2757, // imageAtomicMin_01e10D00D >- 2759, // imageAtomicMin_01F10D00D00D >- 2761, // imageAtomicMin_01Q10D00D00D >- 2763, // imageAtomicMin_01b10D00D00D >- 2765, // imageAtomicMin_01G20D00D00D >- 2767, // imageAtomicMin_01R20D00D00D >- 2769, // imageAtomicMin_01c20D00D00D >- 2771, // imageAtomicMax_00z10D00E >- 2773, // imageAtomicMax_01K10D00E >- 2775, // imageAtomicMax_01V10D00E >- 2777, // imageAtomicMax_01A20D00E >- 2779, // imageAtomicMax_01L20D00E >- 2781, // imageAtomicMax_01W20D00E >- 2783, // imageAtomicMax_01C20D00E >- 2785, // imageAtomicMax_01N20D00E >- 2787, // imageAtomicMax_01Y20D00E >- 2789, // imageAtomicMax_01J00D00E >- 2791, // imageAtomicMax_01U00D00E >- 2793, // imageAtomicMax_01f00D00E >- 2795, // imageAtomicMax_01B20D00E >- 2797, // imageAtomicMax_01M20D00E >- 2799, // imageAtomicMax_01X20D00E >- 2801, // imageAtomicMax_01H20D00E >- 2803, // imageAtomicMax_01S20D00E >- 2805, // imageAtomicMax_01d20D00E >- 2807, // imageAtomicMax_01D00D00E >- 2809, // imageAtomicMax_01O00D00E >- 2811, // imageAtomicMax_01Z00D00E >- 2813, // imageAtomicMax_01E10D00E >- 2815, // imageAtomicMax_01P10D00E >- 2817, // imageAtomicMax_01a10D00E >- 2819, // imageAtomicMax_01I10D00E >- 2821, // imageAtomicMax_01T10D00E >- 2823, // imageAtomicMax_01e10D00E >- 2825, // imageAtomicMax_01F10D00D00E >- 2827, // imageAtomicMax_01Q10D00D00E >- 2829, // imageAtomicMax_01b10D00D00E >- 2831, // imageAtomicMax_01G20D00D00E >- 2833, // imageAtomicMax_01R20D00D00E >- 2835, // imageAtomicMax_01c20D00D00E >- 2837, // imageAtomicMax_00z10D00D >- 2839, // imageAtomicMax_01K10D00D >- 2841, // imageAtomicMax_01V10D00D >- 2843, // imageAtomicMax_01A20D00D >- 2845, // imageAtomicMax_01L20D00D >- 2847, // imageAtomicMax_01W20D00D >- 2849, // imageAtomicMax_01C20D00D >- 2851, // imageAtomicMax_01N20D00D >- 2853, // imageAtomicMax_01Y20D00D >- 2855, // imageAtomicMax_01J00D00D >- 2857, // imageAtomicMax_01U00D00D >- 2859, // imageAtomicMax_01f00D00D >- 2861, // imageAtomicMax_01B20D00D >- 2863, // imageAtomicMax_01M20D00D >- 2865, // imageAtomicMax_01X20D00D >- 2867, // imageAtomicMax_01H20D00D >- 2869, // imageAtomicMax_01S20D00D >- 2871, // imageAtomicMax_01d20D00D >- 2873, // imageAtomicMax_01D00D00D >- 2875, // imageAtomicMax_01O00D00D >- 2877, // imageAtomicMax_01Z00D00D >- 2879, // imageAtomicMax_01E10D00D >- 2881, // imageAtomicMax_01P10D00D >- 2883, // imageAtomicMax_01a10D00D >- 2885, // imageAtomicMax_01I10D00D >- 2887, // imageAtomicMax_01T10D00D >- 2889, // imageAtomicMax_01e10D00D >- 2891, // imageAtomicMax_01F10D00D00D >- 2893, // imageAtomicMax_01Q10D00D00D >- 2895, // imageAtomicMax_01b10D00D00D >- 2897, // imageAtomicMax_01G20D00D00D >- 2899, // imageAtomicMax_01R20D00D00D >- 2901, // imageAtomicMax_01c20D00D00D >- 2903, // imageAtomicAnd_00z10D00E >- 2905, // imageAtomicAnd_01K10D00E >- 2907, // imageAtomicAnd_01V10D00E >- 2909, // imageAtomicAnd_01A20D00E >- 2911, // imageAtomicAnd_01L20D00E >- 2913, // imageAtomicAnd_01W20D00E >- 2915, // imageAtomicAnd_01C20D00E >- 2917, // imageAtomicAnd_01N20D00E >- 2919, // imageAtomicAnd_01Y20D00E >- 2921, // imageAtomicAnd_01J00D00E >- 2923, // imageAtomicAnd_01U00D00E >- 2925, // imageAtomicAnd_01f00D00E >- 2927, // imageAtomicAnd_01B20D00E >- 2929, // imageAtomicAnd_01M20D00E >- 2931, // imageAtomicAnd_01X20D00E >- 2933, // imageAtomicAnd_01H20D00E >- 2935, // imageAtomicAnd_01S20D00E >- 2937, // imageAtomicAnd_01d20D00E >- 2939, // imageAtomicAnd_01D00D00E >- 2941, // imageAtomicAnd_01O00D00E >- 2943, // imageAtomicAnd_01Z00D00E >- 2945, // imageAtomicAnd_01E10D00E >- 2947, // imageAtomicAnd_01P10D00E >- 2949, // imageAtomicAnd_01a10D00E >- 2951, // imageAtomicAnd_01I10D00E >- 2953, // imageAtomicAnd_01T10D00E >- 2955, // imageAtomicAnd_01e10D00E >- 2957, // imageAtomicAnd_01F10D00D00E >- 2959, // imageAtomicAnd_01Q10D00D00E >- 2961, // imageAtomicAnd_01b10D00D00E >- 2963, // imageAtomicAnd_01G20D00D00E >- 2965, // imageAtomicAnd_01R20D00D00E >- 2967, // imageAtomicAnd_01c20D00D00E >- 2969, // imageAtomicAnd_00z10D00D >- 2971, // imageAtomicAnd_01K10D00D >- 2973, // imageAtomicAnd_01V10D00D >- 2975, // imageAtomicAnd_01A20D00D >- 2977, // imageAtomicAnd_01L20D00D >- 2979, // imageAtomicAnd_01W20D00D >- 2981, // imageAtomicAnd_01C20D00D >- 2983, // imageAtomicAnd_01N20D00D >- 2985, // imageAtomicAnd_01Y20D00D >- 2987, // imageAtomicAnd_01J00D00D >- 2989, // imageAtomicAnd_01U00D00D >- 2991, // imageAtomicAnd_01f00D00D >- 2993, // imageAtomicAnd_01B20D00D >- 2995, // imageAtomicAnd_01M20D00D >- 2997, // imageAtomicAnd_01X20D00D >- 2999, // imageAtomicAnd_01H20D00D >- 3001, // imageAtomicAnd_01S20D00D >- 3003, // imageAtomicAnd_01d20D00D >- 3005, // imageAtomicAnd_01D00D00D >- 3007, // imageAtomicAnd_01O00D00D >- 3009, // imageAtomicAnd_01Z00D00D >- 3011, // imageAtomicAnd_01E10D00D >- 3013, // imageAtomicAnd_01P10D00D >- 3015, // imageAtomicAnd_01a10D00D >- 3017, // imageAtomicAnd_01I10D00D >- 3019, // imageAtomicAnd_01T10D00D >- 3021, // imageAtomicAnd_01e10D00D >- 3023, // imageAtomicAnd_01F10D00D00D >- 3025, // imageAtomicAnd_01Q10D00D00D >- 3027, // imageAtomicAnd_01b10D00D00D >- 3029, // imageAtomicAnd_01G20D00D00D >- 3031, // imageAtomicAnd_01R20D00D00D >- 3033, // imageAtomicAnd_01c20D00D00D >- 3035, // imageAtomicOr_00z10D00E >- 3037, // imageAtomicOr_01K10D00E >- 3039, // imageAtomicOr_01V10D00E >- 3041, // imageAtomicOr_01A20D00E >- 3043, // imageAtomicOr_01L20D00E >- 3045, // imageAtomicOr_01W20D00E >- 3047, // imageAtomicOr_01C20D00E >- 3049, // imageAtomicOr_01N20D00E >- 3051, // imageAtomicOr_01Y20D00E >- 3053, // imageAtomicOr_01J00D00E >- 3055, // imageAtomicOr_01U00D00E >- 3057, // imageAtomicOr_01f00D00E >- 3059, // imageAtomicOr_01B20D00E >- 3061, // imageAtomicOr_01M20D00E >- 3063, // imageAtomicOr_01X20D00E >- 3065, // imageAtomicOr_01H20D00E >- 3067, // imageAtomicOr_01S20D00E >- 3069, // imageAtomicOr_01d20D00E >- 3071, // imageAtomicOr_01D00D00E >- 3073, // imageAtomicOr_01O00D00E >- 3075, // imageAtomicOr_01Z00D00E >- 3077, // imageAtomicOr_01E10D00E >- 3079, // imageAtomicOr_01P10D00E >- 3081, // imageAtomicOr_01a10D00E >- 3083, // imageAtomicOr_01I10D00E >- 3085, // imageAtomicOr_01T10D00E >- 3087, // imageAtomicOr_01e10D00E >- 3089, // imageAtomicOr_01F10D00D00E >- 3091, // imageAtomicOr_01Q10D00D00E >- 3093, // imageAtomicOr_01b10D00D00E >- 3095, // imageAtomicOr_01G20D00D00E >- 3097, // imageAtomicOr_01R20D00D00E >- 3099, // imageAtomicOr_01c20D00D00E >- 3101, // imageAtomicOr_00z10D00D >- 3103, // imageAtomicOr_01K10D00D >- 3105, // imageAtomicOr_01V10D00D >- 3107, // imageAtomicOr_01A20D00D >- 3109, // imageAtomicOr_01L20D00D >- 3111, // imageAtomicOr_01W20D00D >- 3113, // imageAtomicOr_01C20D00D >- 3115, // imageAtomicOr_01N20D00D >- 3117, // imageAtomicOr_01Y20D00D >- 3119, // imageAtomicOr_01J00D00D >- 3121, // imageAtomicOr_01U00D00D >- 3123, // imageAtomicOr_01f00D00D >- 3125, // imageAtomicOr_01B20D00D >- 3127, // imageAtomicOr_01M20D00D >- 3129, // imageAtomicOr_01X20D00D >- 3131, // imageAtomicOr_01H20D00D >- 3133, // imageAtomicOr_01S20D00D >- 3135, // imageAtomicOr_01d20D00D >- 3137, // imageAtomicOr_01D00D00D >- 3139, // imageAtomicOr_01O00D00D >- 3141, // imageAtomicOr_01Z00D00D >- 3143, // imageAtomicOr_01E10D00D >- 3145, // imageAtomicOr_01P10D00D >- 3147, // imageAtomicOr_01a10D00D >- 3149, // imageAtomicOr_01I10D00D >- 3151, // imageAtomicOr_01T10D00D >- 3153, // imageAtomicOr_01e10D00D >- 3155, // imageAtomicOr_01F10D00D00D >- 3157, // imageAtomicOr_01Q10D00D00D >- 3159, // imageAtomicOr_01b10D00D00D >- 3161, // imageAtomicOr_01G20D00D00D >- 3163, // imageAtomicOr_01R20D00D00D >- 3165, // imageAtomicOr_01c20D00D00D >- 3167, // imageAtomicXor_00z10D00E >- 3169, // imageAtomicXor_01K10D00E >- 3171, // imageAtomicXor_01V10D00E >- 3173, // imageAtomicXor_01A20D00E >- 3175, // imageAtomicXor_01L20D00E >- 3177, // imageAtomicXor_01W20D00E >- 3179, // imageAtomicXor_01C20D00E >- 3181, // imageAtomicXor_01N20D00E >- 3183, // imageAtomicXor_01Y20D00E >- 3185, // imageAtomicXor_01J00D00E >- 3187, // imageAtomicXor_01U00D00E >- 3189, // imageAtomicXor_01f00D00E >- 3191, // imageAtomicXor_01B20D00E >- 3193, // imageAtomicXor_01M20D00E >- 3195, // imageAtomicXor_01X20D00E >- 3197, // imageAtomicXor_01H20D00E >- 3199, // imageAtomicXor_01S20D00E >- 3201, // imageAtomicXor_01d20D00E >- 3203, // imageAtomicXor_01D00D00E >- 3205, // imageAtomicXor_01O00D00E >- 3207, // imageAtomicXor_01Z00D00E >- 3209, // imageAtomicXor_01E10D00E >- 3211, // imageAtomicXor_01P10D00E >- 3213, // imageAtomicXor_01a10D00E >- 3215, // imageAtomicXor_01I10D00E >- 3217, // imageAtomicXor_01T10D00E >- 3219, // imageAtomicXor_01e10D00E >- 3221, // imageAtomicXor_01F10D00D00E >- 3223, // imageAtomicXor_01Q10D00D00E >- 3225, // imageAtomicXor_01b10D00D00E >- 3227, // imageAtomicXor_01G20D00D00E >- 3229, // imageAtomicXor_01R20D00D00E >- 3231, // imageAtomicXor_01c20D00D00E >- 3233, // imageAtomicXor_00z10D00D >- 3235, // imageAtomicXor_01K10D00D >- 3237, // imageAtomicXor_01V10D00D >- 3239, // imageAtomicXor_01A20D00D >- 3241, // imageAtomicXor_01L20D00D >- 3243, // imageAtomicXor_01W20D00D >- 3245, // imageAtomicXor_01C20D00D >- 3247, // imageAtomicXor_01N20D00D >- 3249, // imageAtomicXor_01Y20D00D >- 3251, // imageAtomicXor_01J00D00D >- 3253, // imageAtomicXor_01U00D00D >- 3255, // imageAtomicXor_01f00D00D >- 3257, // imageAtomicXor_01B20D00D >- 3259, // imageAtomicXor_01M20D00D >- 3261, // imageAtomicXor_01X20D00D >- 3263, // imageAtomicXor_01H20D00D >- 3265, // imageAtomicXor_01S20D00D >- 3267, // imageAtomicXor_01d20D00D >- 3269, // imageAtomicXor_01D00D00D >- 3271, // imageAtomicXor_01O00D00D >- 3273, // imageAtomicXor_01Z00D00D >- 3275, // imageAtomicXor_01E10D00D >- 3277, // imageAtomicXor_01P10D00D >- 3279, // imageAtomicXor_01a10D00D >- 3281, // imageAtomicXor_01I10D00D >- 3283, // imageAtomicXor_01T10D00D >- 3285, // imageAtomicXor_01e10D00D >- 3287, // imageAtomicXor_01F10D00D00D >- 3289, // imageAtomicXor_01Q10D00D00D >- 3291, // imageAtomicXor_01b10D00D00D >- 3293, // imageAtomicXor_01G20D00D00D >- 3295, // imageAtomicXor_01R20D00D00D >- 3297, // imageAtomicXor_01c20D00D00D >- 3299, // imageAtomicExchange_00z10D00E >- 3301, // imageAtomicExchange_01K10D00E >- 3303, // imageAtomicExchange_01V10D00E >- 3305, // imageAtomicExchange_01A20D00E >- 3307, // imageAtomicExchange_01L20D00E >- 3309, // imageAtomicExchange_01W20D00E >- 3311, // imageAtomicExchange_01C20D00E >- 3313, // imageAtomicExchange_01N20D00E >- 3315, // imageAtomicExchange_01Y20D00E >- 3317, // imageAtomicExchange_01J00D00E >- 3319, // imageAtomicExchange_01U00D00E >- 3321, // imageAtomicExchange_01f00D00E >- 3323, // imageAtomicExchange_01B20D00E >- 3325, // imageAtomicExchange_01M20D00E >- 3327, // imageAtomicExchange_01X20D00E >- 3329, // imageAtomicExchange_01H20D00E >- 3331, // imageAtomicExchange_01S20D00E >- 3333, // imageAtomicExchange_01d20D00E >- 3335, // imageAtomicExchange_01D00D00E >- 3337, // imageAtomicExchange_01O00D00E >- 3339, // imageAtomicExchange_01Z00D00E >- 3341, // imageAtomicExchange_01E10D00E >- 3343, // imageAtomicExchange_01P10D00E >- 3345, // imageAtomicExchange_01a10D00E >- 3347, // imageAtomicExchange_01I10D00E >- 3349, // imageAtomicExchange_01T10D00E >- 3351, // imageAtomicExchange_01e10D00E >- 3353, // imageAtomicExchange_01F10D00D00E >- 3355, // imageAtomicExchange_01Q10D00D00E >- 3357, // imageAtomicExchange_01b10D00D00E >- 3359, // imageAtomicExchange_01G20D00D00E >- 3361, // imageAtomicExchange_01R20D00D00E >- 3363, // imageAtomicExchange_01c20D00D00E >- 3365, // imageAtomicExchange_00z10D00D >- 3367, // imageAtomicExchange_01K10D00D >- 3369, // imageAtomicExchange_01V10D00D >- 3371, // imageAtomicExchange_01A20D00D >- 3373, // imageAtomicExchange_01L20D00D >- 3375, // imageAtomicExchange_01W20D00D >- 3377, // imageAtomicExchange_01C20D00D >- 3379, // imageAtomicExchange_01N20D00D >- 3381, // imageAtomicExchange_01Y20D00D >- 3383, // imageAtomicExchange_01J00D00D >- 3385, // imageAtomicExchange_01U00D00D >- 3387, // imageAtomicExchange_01f00D00D >- 3389, // imageAtomicExchange_01B20D00D >- 3391, // imageAtomicExchange_01M20D00D >- 3393, // imageAtomicExchange_01X20D00D >- 3395, // imageAtomicExchange_01H20D00D >- 3397, // imageAtomicExchange_01S20D00D >- 3399, // imageAtomicExchange_01d20D00D >- 3401, // imageAtomicExchange_01D00D00D >- 3403, // imageAtomicExchange_01O00D00D >- 3405, // imageAtomicExchange_01Z00D00D >- 3407, // imageAtomicExchange_01E10D00D >- 3409, // imageAtomicExchange_01P10D00D >- 3411, // imageAtomicExchange_01a10D00D >- 3413, // imageAtomicExchange_01I10D00D >- 3415, // imageAtomicExchange_01T10D00D >- 3417, // imageAtomicExchange_01e10D00D >- 3419, // imageAtomicExchange_01F10D00D00D >- 3421, // imageAtomicExchange_01Q10D00D00D >- 3423, // imageAtomicExchange_01b10D00D00D >- 3425, // imageAtomicExchange_01G20D00D00D >- 3427, // imageAtomicExchange_01R20D00D00D >- 3429, // imageAtomicExchange_01c20D00D00D >- 3431, // imageAtomicExchange_00z10D00B >- 3433, // imageAtomicExchange_01K10D00B >- 3435, // imageAtomicExchange_01V10D00B >- 3437, // imageAtomicExchange_01A20D00B >- 3439, // imageAtomicExchange_01L20D00B >- 3441, // imageAtomicExchange_01W20D00B >- 3443, // imageAtomicExchange_01C20D00B >- 3445, // imageAtomicExchange_01N20D00B >- 3447, // imageAtomicExchange_01Y20D00B >- 3449, // imageAtomicExchange_01J00D00B >- 3451, // imageAtomicExchange_01U00D00B >- 3453, // imageAtomicExchange_01f00D00B >- 3455, // imageAtomicExchange_01B20D00B >- 3457, // imageAtomicExchange_01M20D00B >- 3459, // imageAtomicExchange_01X20D00B >- 3461, // imageAtomicExchange_01H20D00B >- 3463, // imageAtomicExchange_01S20D00B >- 3465, // imageAtomicExchange_01d20D00B >- 3467, // imageAtomicExchange_01D00D00B >- 3469, // imageAtomicExchange_01O00D00B >- 3471, // imageAtomicExchange_01Z00D00B >- 3473, // imageAtomicExchange_01E10D00B >- 3475, // imageAtomicExchange_01P10D00B >- 3477, // imageAtomicExchange_01a10D00B >- 3479, // imageAtomicExchange_01I10D00B >- 3481, // imageAtomicExchange_01T10D00B >- 3483, // imageAtomicExchange_01e10D00B >- 3485, // imageAtomicExchange_01F10D00D00B >- 3487, // imageAtomicExchange_01Q10D00D00B >- 3489, // imageAtomicExchange_01b10D00D00B >- 3491, // imageAtomicExchange_01G20D00D00B >- 3493, // imageAtomicExchange_01R20D00D00B >- 3495, // imageAtomicExchange_01c20D00D00B >- 3497, // imageAtomicCompSwap_00z10D00E00E >- 3499, // imageAtomicCompSwap_01K10D00E00E >- 3501, // imageAtomicCompSwap_01V10D00E00E >- 3503, // imageAtomicCompSwap_01A20D00E00E >- 3505, // imageAtomicCompSwap_01L20D00E00E >- 3507, // imageAtomicCompSwap_01W20D00E00E >- 3509, // imageAtomicCompSwap_01C20D00E00E >- 3511, // imageAtomicCompSwap_01N20D00E00E >- 3513, // imageAtomicCompSwap_01Y20D00E00E >- 3515, // imageAtomicCompSwap_01J00D00E00E >- 3517, // imageAtomicCompSwap_01U00D00E00E >- 3519, // imageAtomicCompSwap_01f00D00E00E >- 3521, // imageAtomicCompSwap_01B20D00E00E >- 3523, // imageAtomicCompSwap_01M20D00E00E >- 3525, // imageAtomicCompSwap_01X20D00E00E >- 3527, // imageAtomicCompSwap_01H20D00E00E >- 3529, // imageAtomicCompSwap_01S20D00E00E >- 3531, // imageAtomicCompSwap_01d20D00E00E >- 3533, // imageAtomicCompSwap_01D00D00E00E >- 3535, // imageAtomicCompSwap_01O00D00E00E >- 3537, // imageAtomicCompSwap_01Z00D00E00E >- 3539, // imageAtomicCompSwap_01E10D00E00E >- 3541, // imageAtomicCompSwap_01P10D00E00E >- 3543, // imageAtomicCompSwap_01a10D00E00E >- 3545, // imageAtomicCompSwap_01I10D00E00E >- 3547, // imageAtomicCompSwap_01T10D00E00E >- 3549, // imageAtomicCompSwap_01e10D00E00E >- 3551, // imageAtomicCompSwap_01F10D00D00E00E >- 3553, // imageAtomicCompSwap_01Q10D00D00E00E >- 3555, // imageAtomicCompSwap_01b10D00D00E00E >- 3557, // imageAtomicCompSwap_01G20D00D00E00E >- 3559, // imageAtomicCompSwap_01R20D00D00E00E >- 3561, // imageAtomicCompSwap_01c20D00D00E00E >- 3563, // imageAtomicCompSwap_00z10D00D00D >- 3565, // imageAtomicCompSwap_01K10D00D00D >- 3567, // imageAtomicCompSwap_01V10D00D00D >- 3569, // imageAtomicCompSwap_01A20D00D00D >- 3571, // imageAtomicCompSwap_01L20D00D00D >- 3573, // imageAtomicCompSwap_01W20D00D00D >- 3575, // imageAtomicCompSwap_01C20D00D00D >- 3577, // imageAtomicCompSwap_01N20D00D00D >- 3579, // imageAtomicCompSwap_01Y20D00D00D >- 3581, // imageAtomicCompSwap_01J00D00D00D >- 3583, // imageAtomicCompSwap_01U00D00D00D >- 3585, // imageAtomicCompSwap_01f00D00D00D >- 3587, // imageAtomicCompSwap_01B20D00D00D >- 3589, // imageAtomicCompSwap_01M20D00D00D >- 3591, // imageAtomicCompSwap_01X20D00D00D >- 3593, // imageAtomicCompSwap_01H20D00D00D >- 3595, // imageAtomicCompSwap_01S20D00D00D >- 3597, // imageAtomicCompSwap_01d20D00D00D >- 3599, // imageAtomicCompSwap_01D00D00D00D >- 3601, // imageAtomicCompSwap_01O00D00D00D >- 3603, // imageAtomicCompSwap_01Z00D00D00D >- 3605, // imageAtomicCompSwap_01E10D00D00D >- 3607, // imageAtomicCompSwap_01P10D00D00D >- 3609, // imageAtomicCompSwap_01a10D00D00D >- 3611, // imageAtomicCompSwap_01I10D00D00D >- 3613, // imageAtomicCompSwap_01T10D00D00D >- 3615, // imageAtomicCompSwap_01e10D00D00D >- 3617, // imageAtomicCompSwap_01F10D00D00D00D >- 3619, // imageAtomicCompSwap_01Q10D00D00D00D >- 3621, // imageAtomicCompSwap_01b10D00D00D00D >- 3623, // imageAtomicCompSwap_01G20D00D00D00D >- 3625, // imageAtomicCompSwap_01R20D00D00D00D >- 3627, // imageAtomicCompSwap_01c20D00D00D00D >- 3629, // noise1_00B >- 3630, // noise1_10B >- 3631, // noise1_20B >- 3632, // noise1_30B >- 3633, // noise2_00B >- 3634, // noise2_10B >- 3635, // noise2_20B >- 3636, // noise2_30B >- 3637, // noise3_00B >- 3638, // noise3_10B >- 3639, // noise3_20B >- 3640, // noise3_30B >- 3641, // noise4_00B >- 3642, // noise4_10B >- 3643, // noise4_20B >- 3644, // noise4_30B >- 3645, // memoryBarrier_ >- 3647, // memoryBarrierAtomicCounter_ >- 3649, // memoryBarrierBuffer_ >- 3651, // memoryBarrierImage_ >- 3653, // barrier_ >- 3657, // memoryBarrierShared_ >- 3659, // groupMemoryBarrier_ >- 3661, // EmitVertex_ >- 3665, // EndPrimitive_ >- 3669, // EmitStreamVertex_00D >- 3670, // EndStreamPrimitive_00D >- 3671, // subpassLoad_01g >- 3673, // subpassLoad_01h >- 3675, // subpassLoad_01i >- 3677, // subpassLoad_01j00D >- 3679, // subpassLoad_01k00D >- 3681, // subpassLoad_01l00D >- 3683, // anyInvocation_00F >- 3684, // allInvocations_00F >- 3685, // allInvocationsEqual_00F >- 3686, // gl_DepthRangeParameters >- 3688, // gl_DepthRange >- 3690, // gl_NumSamples >- 3693, // gl_MaxVertexAttribs >- 3695, // gl_MaxVertexUniformVectors >- 3697, // gl_MaxVertexTextureImageUnits >- 3699, // gl_MaxCombinedTextureImageUnits >- 3701, // gl_MaxTextureImageUnits >- 3703, // gl_MaxFragmentUniformVectors >- 3705, // gl_MaxVaryingVectors >- 3707, // gl_MaxDrawBuffers >- 3709, // gl_MaxDualSourceDrawBuffersEXT >- 3710, // gl_MaxVertexOutputVectors >- 3712, // gl_MaxFragmentInputVectors >- 3714, // gl_MinProgramTexelOffset >- 3716, // gl_MaxProgramTexelOffset >- 3718, // gl_MaxImageUnits >- 3720, // gl_MaxVertexImageUniforms >- 3722, // gl_MaxFragmentImageUniforms >- 3724, // gl_MaxComputeImageUniforms >- 3726, // gl_MaxCombinedImageUniforms >- 3728, // gl_MaxCombinedShaderOutputResources >- 3730, // gl_MaxComputeWorkGroupCount >- 3732, // gl_MaxComputeWorkGroupSize >- 3734, // gl_MaxComputeUniformComponents >- 3736, // gl_MaxComputeTextureImageUnits >- 3738, // gl_MaxComputeAtomicCounters >- 3740, // gl_MaxComputeAtomicCounterBuffers >- 3742, // gl_MaxVertexAtomicCounters >- 3744, // gl_MaxFragmentAtomicCounters >- 3746, // gl_MaxCombinedAtomicCounters >- 3748, // gl_MaxAtomicCounterBindings >- 3750, // gl_MaxVertexAtomicCounterBuffers >- 3752, // gl_MaxFragmentAtomicCounterBuffers >- 3754, // gl_MaxCombinedAtomicCounterBuffers >- 3756, // gl_MaxAtomicCounterBufferSize >- 3758, // gl_MaxGeometryInputComponents >- 3762, // gl_MaxGeometryOutputComponents >- 3766, // gl_MaxGeometryImageUniforms >- 3770, // gl_MaxGeometryTextureImageUnits >- 3774, // gl_MaxGeometryOutputVertices >- 3778, // gl_MaxGeometryTotalOutputComponents >- 3782, // gl_MaxGeometryUniformComponents >- 3786, // gl_MaxGeometryAtomicCounters >- 3790, // gl_MaxGeometryAtomicCounterBuffers >- 3794, // gl_MaxTessControlInputComponents >- 3797, // gl_MaxTessControlOutputComponents >- 3800, // gl_MaxTessControlTextureImageUnits >- 3803, // gl_MaxTessControlUniformComponents >- 3806, // gl_MaxTessControlTotalOutputComponents >- 3809, // gl_MaxTessControlImageUniforms >- 3812, // gl_MaxTessControlAtomicCounters >- 3815, // gl_MaxTessControlAtomicCounterBuffers >- 3818, // gl_MaxTessPatchComponents >- 3821, // gl_MaxPatchVertices >- 3824, // gl_MaxTessGenLevel >- 3827, // gl_MaxTessEvaluationInputComponents >- 3830, // gl_MaxTessEvaluationOutputComponents >- 3833, // gl_MaxTessEvaluationTextureImageUnits >- 3836, // gl_MaxTessEvaluationUniformComponents >- 3839, // gl_MaxTessEvaluationImageUniforms >- 3842, // gl_MaxTessEvaluationAtomicCounters >- 3845, // gl_MaxTessEvaluationAtomicCounterBuffers >- 3848, // gl_MaxSamples >- 3851, // gl_MaxClipDistances >- 3852, // gl_MaxCullDistances >- 3853, // gl_MaxCombinedClipAndCullDistances >- 3854, // gl_FragCoord >- 3858, // gl_FrontFacing >- 3860, // gl_PointCoord >- 3862, // gl_FragColor >- 3864, // gl_FragData >- 3866, // gl_FragDepth >- 3868, // gl_HelperInvocation >- 3870, // gl_SecondaryFragColorEXT >- 3871, // gl_SecondaryFragDataEXT >- 3872, // gl_FragDepthEXT >- 3873, // gl_LastFragData >- 3876, // gl_LastFragColor >- 3877, // gl_LastFragColorARM >- 3878, // gl_PrimitiveID >- 3892, // gl_Layer >- 3900, // gl_SampleID >- 3903, // gl_SamplePosition >- 3906, // gl_SampleMaskIn >- 3909, // gl_SampleMask >- 3912, // gl_CullDistance >- 3914, // gl_ClipDistance >- 3916, // gl_Position >- 3928, // gl_PointSize >- 3932, // gl_InstanceID >- 3934, // Empty >- 3934, // gl_VertexID >- 3936, // Empty >- 3936, // Empty >- 3936, // gl_DrawID >- 3937, // gl_BaseVertex >- 3938, // gl_BaseInstance >- 3939, // angle_BaseVertex >- 3940, // angle_BaseInstance >- 3941, // gl_NumWorkGroups >- 3943, // gl_WorkGroupSize >- 3945, // gl_WorkGroupID >- 3947, // gl_LocalInvocationID >- 3949, // gl_GlobalInvocationID >- 3951, // gl_LocalInvocationIndex >- 3953, // gl_PrimitiveIDIn >- 3957, // gl_InvocationID >- 3964, // gl_PerVertex >- 3974, // gl_in >- 3984, // gl_PatchVerticesIn >- 3990, // gl_TessLevelOuter >- 3996, // gl_TessLevelInner >- 4002, // gl_out >- 4008, // gl_BoundingBoxEXT >- 4011, // gl_TessCoord >- 4013, // gl_ViewID_OVR >+ 1413, // textureSize_00W >+ 1416, // textureSize_00c >+ 1419, // textureSize_00M00D >+ 1420, // textureSize_00N00D >+ 1421, // textureProjLod_00I20B00B >+ 1423, // textureProjLod_00R20B00B >+ 1425, // textureProjLod_00X20B00B >+ 1427, // textureProjLod_00I30B00B >+ 1429, // textureProjLod_00R30B00B >+ 1431, // textureProjLod_00X30B00B >+ 1433, // textureProjLod_00J30B00B >+ 1435, // textureProjLod_00S30B00B >+ 1437, // textureProjLod_00Y30B00B >+ 1439, // textureProjLod_00d30B00B >+ 1441, // textureProjLod_00g10B00B >+ 1442, // textureProjLod_00o10B00B >+ 1443, // textureProjLod_00t10B00B >+ 1444, // textureProjLod_00g30B00B >+ 1445, // textureProjLod_00o30B00B >+ 1446, // textureProjLod_00t30B00B >+ 1447, // textureProjLod_00m30B00B >+ 1448, // texelFetch_00I10D00D >+ 1450, // texelFetch_00R10D00D >+ 1452, // texelFetch_00X10D00D >+ 1454, // texelFetch_00J20D00D >+ 1456, // texelFetch_00S20D00D >+ 1458, // texelFetch_00Y20D00D >+ 1460, // texelFetch_00L20D00D >+ 1462, // texelFetch_00U20D00D >+ 1464, // texelFetch_00a20D00D >+ 1466, // texelFetch_00g00D00D >+ 1467, // texelFetch_00o00D00D >+ 1468, // texelFetch_00t00D00D >+ 1469, // texelFetch_00O10D >+ 1470, // texelFetch_00q10D >+ 1471, // texelFetch_00v10D >+ 1472, // texelFetch_00h10D00D >+ 1473, // texelFetch_00p10D00D >+ 1474, // texelFetch_00u10D00D >+ 1475, // texelFetch_00j00D >+ 1479, // texelFetch_00r00D >+ 1483, // texelFetch_00w00D >+ 1487, // texelFetch_00P10D00D >+ 1490, // texelFetch_00V10D00D >+ 1493, // texelFetch_00b10D00D >+ 1496, // texelFetch_00Q20D00D >+ 1499, // texelFetch_00W20D00D >+ 1502, // texelFetch_00c20D00D >+ 1505, // texelFetch_00M10D00D >+ 1506, // texelFetch_00N10D00D >+ 1507, // textureGrad_00I10B10B10B >+ 1509, // textureGrad_00R10B10B10B >+ 1511, // textureGrad_00X10B10B10B >+ 1513, // textureGrad_00J20B20B20B >+ 1515, // textureGrad_00S20B20B20B >+ 1517, // textureGrad_00Y20B20B20B >+ 1519, // textureGrad_00K20B20B20B >+ 1521, // textureGrad_00T20B20B20B >+ 1523, // textureGrad_00Z20B20B20B >+ 1525, // textureGrad_00I00B00B00B >+ 1526, // textureGrad_00R00B00B00B >+ 1527, // textureGrad_00X00B00B00B >+ 1528, // textureGrad_00O10B10B10B >+ 1529, // textureGrad_00q10B10B10B >+ 1530, // textureGrad_00v10B10B10B >+ 1531, // textureGrad_00n20B10B10B >+ 1532, // textureGrad_00d20B10B10B >+ 1534, // textureGrad_00e30B20B20B >+ 1536, // textureGrad_00L20B10B10B >+ 1538, // textureGrad_00U20B10B10B >+ 1540, // textureGrad_00a20B10B10B >+ 1542, // textureGrad_00f30B10B10B >+ 1544, // textureGrad_00m20B00B00B >+ 1545, // textureGrad_00h10B00B00B >+ 1546, // textureGrad_00p10B00B00B >+ 1547, // textureGrad_00u10B00B00B >+ 1548, // textureGrad_00i20B00B00B >+ 1549, // textureGrad_00k30B20B20B >+ 1553, // textureGrad_00s30B20B20B >+ 1557, // textureGrad_00x30B20B20B >+ 1561, // textureProjGrad_00I20B10B10B >+ 1563, // textureProjGrad_00R20B10B10B >+ 1565, // textureProjGrad_00X20B10B10B >+ 1567, // textureProjGrad_00I30B10B10B >+ 1569, // textureProjGrad_00R30B10B10B >+ 1571, // textureProjGrad_00X30B10B10B >+ 1573, // textureProjGrad_00J30B20B20B >+ 1575, // textureProjGrad_00S30B20B20B >+ 1577, // textureProjGrad_00Y30B20B20B >+ 1579, // textureProjGrad_00d30B10B10B >+ 1581, // textureProjGrad_00g10B00B00B >+ 1582, // textureProjGrad_00o10B00B00B >+ 1583, // textureProjGrad_00t10B00B00B >+ 1584, // textureProjGrad_00g30B00B00B >+ 1585, // textureProjGrad_00o30B00B00B >+ 1586, // textureProjGrad_00t30B00B00B >+ 1587, // textureProjGrad_00m30B00B00B >+ 1588, // textureProjGrad_00O20B10B10B >+ 1589, // textureProjGrad_00q20B10B10B >+ 1590, // textureProjGrad_00v20B10B10B >+ 1591, // textureProjGrad_00O30B10B10B >+ 1592, // textureProjGrad_00q30B10B10B >+ 1593, // textureProjGrad_00v30B10B10B >+ 1594, // textureProjGrad_00n30B10B10B >+ 1595, // textureQueryLevels_00g >+ 1596, // textureQueryLevels_00o >+ 1597, // textureQueryLevels_00t >+ 1598, // textureQueryLevels_00I >+ 1599, // textureQueryLevels_00R >+ 1600, // textureQueryLevels_00X >+ 1601, // textureQueryLevels_00J >+ 1602, // textureQueryLevels_00S >+ 1603, // textureQueryLevels_00Y >+ 1604, // textureQueryLevels_00K >+ 1605, // textureQueryLevels_00T >+ 1606, // textureQueryLevels_00Z >+ 1607, // textureQueryLevels_00h >+ 1608, // textureQueryLevels_00p >+ 1609, // textureQueryLevels_00u >+ 1610, // textureQueryLevels_00L >+ 1611, // textureQueryLevels_00U >+ 1612, // textureQueryLevels_00a >+ 1613, // textureQueryLevels_00k >+ 1614, // textureQueryLevels_00s >+ 1615, // textureQueryLevels_00x >+ 1616, // textureQueryLevels_00m >+ 1617, // textureQueryLevels_00d >+ 1618, // textureQueryLevels_00e >+ 1619, // textureQueryLevels_00i >+ 1620, // textureQueryLevels_00f >+ 1621, // textureQueryLevels_00l >+ 1622, // textureSamples_00P >+ 1623, // textureSamples_00V >+ 1624, // textureSamples_00b >+ 1625, // textureSamples_00Q >+ 1626, // textureSamples_00W >+ 1627, // textureSamples_00c >+ 1628, // texture_00I10B00B >+ 1630, // texture_00R10B00B >+ 1632, // texture_00X10B00B >+ 1634, // texture_00J20B00B >+ 1636, // texture_00S20B00B >+ 1638, // texture_00Y20B00B >+ 1640, // texture_00K20B00B >+ 1642, // texture_00T20B00B >+ 1644, // texture_00Z20B00B >+ 1646, // texture_00L20B00B >+ 1648, // texture_00U20B00B >+ 1650, // texture_00a20B00B >+ 1652, // textureProj_00I20B00B >+ 1654, // textureProj_00R20B00B >+ 1656, // textureProj_00X20B00B >+ 1658, // textureProj_00I30B00B >+ 1660, // textureProj_00R30B00B >+ 1662, // textureProj_00X30B00B >+ 1664, // textureProj_00J30B00B >+ 1666, // textureProj_00S30B00B >+ 1668, // textureProj_00Y30B00B >+ 1670, // texture_00d20B00B >+ 1672, // texture_00e30B00B >+ 1674, // textureProj_00d30B00B >+ 1676, // texture_00g00B00B >+ 1677, // texture_00o00B00B >+ 1678, // texture_00t00B00B >+ 1679, // texture_00m20B00B >+ 1680, // texture_00h20B00B >+ 1681, // texture_00p20B00B >+ 1682, // texture_00u20B00B >+ 1683, // texture_00i20B00B >+ 1684, // texture_00f30B00B >+ 1685, // textureProj_00g10B00B >+ 1686, // textureProj_00o10B00B >+ 1687, // textureProj_00t10B00B >+ 1688, // textureProj_00g30B00B >+ 1689, // textureProj_00o30B00B >+ 1690, // textureProj_00t30B00B >+ 1691, // textureProj_00m30B00B >+ 1692, // texture_00k30B00B >+ 1696, // texture_00s30B00B >+ 1700, // texture_00x30B00B >+ 1704, // texture_00M10B00B >+ 1705, // textureProj_00M20B00B >+ 1706, // textureProj_00M30B00B >+ 1707, // texture_00N10B00B >+ 1708, // textureProj_00N20B00B >+ 1709, // textureProj_00N30B00B >+ 1710, // textureQueryLod_00g00B >+ 1711, // textureQueryLod_00o00B >+ 1712, // textureQueryLod_00t00B >+ 1713, // textureQueryLod_00I10B >+ 1714, // textureQueryLod_00R10B >+ 1715, // textureQueryLod_00X10B >+ 1716, // textureQueryLod_00J20B >+ 1717, // textureQueryLod_00S20B >+ 1718, // textureQueryLod_00Y20B >+ 1719, // textureQueryLod_00K20B >+ 1720, // textureQueryLod_00T20B >+ 1721, // textureQueryLod_00Z20B >+ 1722, // textureQueryLod_00h00B >+ 1723, // textureQueryLod_00p00B >+ 1724, // textureQueryLod_00u00B >+ 1725, // textureQueryLod_00L10B >+ 1726, // textureQueryLod_00U10B >+ 1727, // textureQueryLod_00a10B >+ 1728, // textureQueryLod_00k20B >+ 1729, // textureQueryLod_00s20B >+ 1730, // textureQueryLod_00x20B >+ 1731, // textureQueryLod_00m00B >+ 1732, // textureQueryLod_00d10B >+ 1733, // textureQueryLod_00e20B >+ 1734, // textureQueryLod_00i00B >+ 1735, // textureQueryLod_00f10B >+ 1736, // textureQueryLod_00l20B >+ 1737, // textureOffset_00I10B10D >+ 1739, // textureOffset_00R10B10D >+ 1741, // textureOffset_00X10B10D >+ 1743, // textureOffset_00J20B20D >+ 1745, // textureOffset_00S20B20D >+ 1747, // textureOffset_00Y20B20D >+ 1749, // textureOffset_00d20B10D >+ 1751, // textureOffset_00L20B10D >+ 1753, // textureOffset_00U20B10D >+ 1755, // textureOffset_00a20B10D >+ 1757, // textureOffset_00g00B00D >+ 1758, // textureOffset_00o00B00D >+ 1759, // textureOffset_00t00B00D >+ 1760, // textureOffset_00O10B10D >+ 1761, // textureOffset_00q10B10D >+ 1762, // textureOffset_00v10B10D >+ 1763, // textureOffset_00n20B10D >+ 1764, // textureOffset_00m20B00D >+ 1765, // textureOffset_00h10B00D >+ 1766, // textureOffset_00p10B00D >+ 1767, // textureOffset_00u10B00D >+ 1768, // textureOffset_00i20B00D >+ 1769, // textureOffset_00f30B10D >+ 1770, // textureProjOffset_00I20B10D >+ 1772, // textureProjOffset_00R20B10D >+ 1774, // textureProjOffset_00X20B10D >+ 1776, // textureProjOffset_00I30B10D >+ 1778, // textureProjOffset_00R30B10D >+ 1780, // textureProjOffset_00X30B10D >+ 1782, // textureProjOffset_00J30B20D >+ 1784, // textureProjOffset_00S30B20D >+ 1786, // textureProjOffset_00Y30B20D >+ 1788, // textureProjOffset_00d30B10D >+ 1790, // textureProjOffset_00g10B00D >+ 1791, // textureProjOffset_00o10B00D >+ 1792, // textureProjOffset_00t10B00D >+ 1793, // textureProjOffset_00g30B00D >+ 1794, // textureProjOffset_00o30B00D >+ 1795, // textureProjOffset_00t30B00D >+ 1796, // textureProjOffset_00O20B10D >+ 1797, // textureProjOffset_00q20B10D >+ 1798, // textureProjOffset_00v20B10D >+ 1799, // textureProjOffset_00O30B10D >+ 1800, // textureProjOffset_00q30B10D >+ 1801, // textureProjOffset_00v30B10D >+ 1802, // textureProjOffset_00n30B10D >+ 1803, // textureProjOffset_00m30B00D >+ 1804, // textureLodOffset_00I10B00B10D >+ 1806, // textureLodOffset_00R10B00B10D >+ 1808, // textureLodOffset_00X10B00B10D >+ 1810, // textureLodOffset_00J20B00B20D >+ 1812, // textureLodOffset_00S20B00B20D >+ 1814, // textureLodOffset_00Y20B00B20D >+ 1816, // textureLodOffset_00d20B00B10D >+ 1818, // textureLodOffset_00L20B00B10D >+ 1820, // textureLodOffset_00U20B00B10D >+ 1822, // textureLodOffset_00a20B00B10D >+ 1824, // textureLodOffset_00g00B00B00D >+ 1825, // textureLodOffset_00o00B00B00D >+ 1826, // textureLodOffset_00t00B00B00D >+ 1827, // textureLodOffset_00m20B00B00D >+ 1828, // textureLodOffset_00h10B00B00D >+ 1829, // textureLodOffset_00p10B00B00D >+ 1830, // textureLodOffset_00u10B00B00D >+ 1831, // textureLodOffset_00i20B00B00D >+ 1832, // textureProjLodOffset_00I20B00B10D >+ 1834, // textureProjLodOffset_00R20B00B10D >+ 1836, // textureProjLodOffset_00X20B00B10D >+ 1838, // textureProjLodOffset_00I30B00B10D >+ 1840, // textureProjLodOffset_00R30B00B10D >+ 1842, // textureProjLodOffset_00X30B00B10D >+ 1844, // textureProjLodOffset_00J30B00B20D >+ 1846, // textureProjLodOffset_00S30B00B20D >+ 1848, // textureProjLodOffset_00Y30B00B20D >+ 1850, // textureProjLodOffset_00d30B00B10D >+ 1852, // textureProjLodOffset_00g10B00B00D >+ 1853, // textureProjLodOffset_00o10B00B00D >+ 1854, // textureProjLodOffset_00t10B00B00D >+ 1855, // textureProjLodOffset_00g30B00B00D >+ 1856, // textureProjLodOffset_00o30B00B00D >+ 1857, // textureProjLodOffset_00t30B00B00D >+ 1858, // textureProjLodOffset_00m30B00B00D >+ 1859, // texelFetchOffset_00I10D00D10D >+ 1861, // texelFetchOffset_00R10D00D10D >+ 1863, // texelFetchOffset_00X10D00D10D >+ 1865, // texelFetchOffset_00J20D00D20D >+ 1867, // texelFetchOffset_00S20D00D20D >+ 1869, // texelFetchOffset_00Y20D00D20D >+ 1871, // texelFetchOffset_00L20D00D10D >+ 1873, // texelFetchOffset_00U20D00D10D >+ 1875, // texelFetchOffset_00a20D00D10D >+ 1877, // texelFetchOffset_00g00D00D00D >+ 1878, // texelFetchOffset_00o00D00D00D >+ 1879, // texelFetchOffset_00t00D00D00D >+ 1880, // texelFetchOffset_00O10D10D >+ 1881, // texelFetchOffset_00q10D10D >+ 1882, // texelFetchOffset_00v10D10D >+ 1883, // texelFetchOffset_00h10D00D00D >+ 1884, // texelFetchOffset_00p10D00D00D >+ 1885, // texelFetchOffset_00u10D00D00D >+ 1886, // textureGradOffset_00I10B10B10B10D >+ 1888, // textureGradOffset_00R10B10B10B10D >+ 1890, // textureGradOffset_00X10B10B10B10D >+ 1892, // textureGradOffset_00J20B20B20B20D >+ 1894, // textureGradOffset_00S20B20B20B20D >+ 1896, // textureGradOffset_00Y20B20B20B20D >+ 1898, // textureGradOffset_00d20B10B10B10D >+ 1900, // textureGradOffset_00L20B10B10B10D >+ 1902, // textureGradOffset_00U20B10B10B10D >+ 1904, // textureGradOffset_00a20B10B10B10D >+ 1906, // textureGradOffset_00f30B10B10B10D >+ 1908, // textureGradOffset_00g00B00B00B00D >+ 1909, // textureGradOffset_00o00B00B00B00D >+ 1910, // textureGradOffset_00t00B00B00B00D >+ 1911, // textureGradOffset_00O10B10B10B10D >+ 1912, // textureGradOffset_00q10B10B10B10D >+ 1913, // textureGradOffset_00v10B10B10B10D >+ 1914, // textureGradOffset_00n20B10B10B10D >+ 1915, // textureGradOffset_00m20B00B00B00D >+ 1916, // textureGradOffset_00h10B00B00B00D >+ 1917, // textureGradOffset_00p10B00B00B00D >+ 1918, // textureGradOffset_00u10B00B00B00D >+ 1919, // textureGradOffset_00i20B00B00B00D >+ 1920, // textureProjGradOffset_00I20B10B10B10D >+ 1922, // textureProjGradOffset_00R20B10B10B10D >+ 1924, // textureProjGradOffset_00X20B10B10B10D >+ 1926, // textureProjGradOffset_00I30B10B10B10D >+ 1928, // textureProjGradOffset_00R30B10B10B10D >+ 1930, // textureProjGradOffset_00X30B10B10B10D >+ 1932, // textureProjGradOffset_00J30B20B20B20D >+ 1934, // textureProjGradOffset_00S30B20B20B20D >+ 1936, // textureProjGradOffset_00Y30B20B20B20D >+ 1938, // textureProjGradOffset_00d30B10B10B10D >+ 1940, // textureProjGradOffset_00g10B00B00B00D >+ 1941, // textureProjGradOffset_00o10B00B00B00D >+ 1942, // textureProjGradOffset_00t10B00B00B00D >+ 1943, // textureProjGradOffset_00g30B00B00B00D >+ 1944, // textureProjGradOffset_00o30B00B00B00D >+ 1945, // textureProjGradOffset_00t30B00B00B00D >+ 1946, // textureProjGradOffset_00O20B10B10B10D >+ 1947, // textureProjGradOffset_00q20B10B10B10D >+ 1948, // textureProjGradOffset_00v20B10B10B10D >+ 1949, // textureProjGradOffset_00O30B10B10B10D >+ 1950, // textureProjGradOffset_00q30B10B10B10D >+ 1951, // textureProjGradOffset_00v30B10B10B10D >+ 1952, // textureProjGradOffset_00n30B10B10B10D >+ 1953, // textureProjGradOffset_00m30B00B00B00D >+ 1954, // textureOffset_00I10B10D00B >+ 1956, // textureOffset_00R10B10D00B >+ 1958, // textureOffset_00X10B10D00B >+ 1960, // textureOffset_00J20B20D00B >+ 1962, // textureOffset_00S20B20D00B >+ 1964, // textureOffset_00Y20B20D00B >+ 1966, // textureOffset_00d20B10D00B >+ 1968, // textureOffset_00L20B10D00B >+ 1970, // textureOffset_00U20B10D00B >+ 1972, // textureOffset_00a20B10D00B >+ 1974, // textureOffset_00g00B00D00B >+ 1975, // textureOffset_00o00B00D00B >+ 1976, // textureOffset_00t00B00D00B >+ 1977, // textureOffset_00m20B00D00B >+ 1978, // textureOffset_00h10B00D00B >+ 1979, // textureOffset_00p10B00D00B >+ 1980, // textureOffset_00u10B00D00B >+ 1981, // textureOffset_00i20B00D00B >+ 1982, // textureProjOffset_00I20B10D00B >+ 1984, // textureProjOffset_00R20B10D00B >+ 1986, // textureProjOffset_00X20B10D00B >+ 1988, // textureProjOffset_00I30B10D00B >+ 1990, // textureProjOffset_00R30B10D00B >+ 1992, // textureProjOffset_00X30B10D00B >+ 1994, // textureProjOffset_00J30B20D00B >+ 1996, // textureProjOffset_00S30B20D00B >+ 1998, // textureProjOffset_00Y30B20D00B >+ 2000, // textureProjOffset_00d30B10D00B >+ 2002, // textureProjOffset_00g10B00D00B >+ 2003, // textureProjOffset_00o10B00D00B >+ 2004, // textureProjOffset_00t10B00D00B >+ 2005, // textureProjOffset_00g30B00D00B >+ 2006, // textureProjOffset_00o30B00D00B >+ 2007, // textureProjOffset_00t30B00D00B >+ 2008, // textureProjOffset_00m30B00D00B >+ 2009, // textureGather_00I10B >+ 2011, // textureGather_00R10B >+ 2013, // textureGather_00X10B >+ 2015, // textureGather_00I10B00D >+ 2017, // textureGather_00R10B00D >+ 2019, // textureGather_00X10B00D >+ 2021, // textureGather_00L20B >+ 2023, // textureGather_00U20B >+ 2025, // textureGather_00a20B >+ 2027, // textureGather_00L20B00D >+ 2029, // textureGather_00U20B00D >+ 2031, // textureGather_00a20B00D >+ 2033, // textureGather_00K20B >+ 2035, // textureGather_00T20B >+ 2037, // textureGather_00Z20B >+ 2039, // textureGather_00K20B00D >+ 2041, // textureGather_00T20B00D >+ 2043, // textureGather_00Z20B00D >+ 2045, // textureGather_00k30B >+ 2049, // textureGather_00s30B >+ 2053, // textureGather_00x30B >+ 2057, // textureGather_00k30B00D >+ 2061, // textureGather_00s30B00D >+ 2065, // textureGather_00x30B00D >+ 2069, // textureGather_00l30B00B >+ 2073, // textureGather_00O20B >+ 2074, // textureGather_00q20B >+ 2075, // textureGather_00v20B >+ 2076, // textureGather_00O20B00D >+ 2077, // textureGather_00q20B00D >+ 2078, // textureGather_00v20B00D >+ 2079, // textureGather_00n10B00B >+ 2080, // textureGather_00d10B >+ 2081, // textureGather_00d10B00B >+ 2083, // textureGather_00f20B >+ 2084, // textureGather_00f20B00B >+ 2086, // textureGather_00e20B >+ 2087, // textureGather_00e20B00B >+ 2089, // textureGatherOffset_00I10B10D >+ 2091, // textureGatherOffset_00R10B10D >+ 2093, // textureGatherOffset_00X10B10D >+ 2095, // textureGatherOffset_00L20B10D >+ 2097, // textureGatherOffset_00U20B10D >+ 2099, // textureGatherOffset_00a20B10D >+ 2101, // textureGatherOffset_00d10B00B10D >+ 2103, // textureGatherOffset_00f20B00B10D >+ 2105, // textureGatherOffset_00O10B10D >+ 2106, // textureGatherOffset_00q10B10D >+ 2107, // textureGatherOffset_00v10B10D >+ 2108, // textureGatherOffset_00n10B00B10D >+ 2109, // textureGatherOffset_00I10B10D00D >+ 2111, // textureGatherOffset_00R10B10D00D >+ 2113, // textureGatherOffset_00X10B10D00D >+ 2115, // textureGatherOffset_00L20B10D00D >+ 2117, // textureGatherOffset_00U20B10D00D >+ 2119, // textureGatherOffset_00a20B10D00D >+ 2121, // textureGatherOffset_00O10B10D00D >+ 2122, // textureGatherOffset_00q10B10D00D >+ 2123, // textureGatherOffset_00v10B10D00D >+ 2124, // textureGatherOffsets_00I10B10Dx4 >+ 2127, // textureGatherOffsets_00R10B10Dx4 >+ 2130, // textureGatherOffsets_00X10B10Dx4 >+ 2133, // textureGatherOffsets_00L20B10Dx4 >+ 2136, // textureGatherOffsets_00U20B10Dx4 >+ 2139, // textureGatherOffsets_00a20B10Dx4 >+ 2142, // textureGatherOffsets_00d10B00B10Dx4 >+ 2145, // textureGatherOffsets_00f20B00B10Dx4 >+ 2148, // textureGatherOffsets_00O10B10Dx4 >+ 2149, // textureGatherOffsets_00q10B10Dx4 >+ 2150, // textureGatherOffsets_00v10B10Dx4 >+ 2151, // textureGatherOffsets_00n10B00B10Dx4 >+ 2152, // textureGatherOffsets_00I10B10Dx400D >+ 2155, // textureGatherOffsets_00R10B10Dx400D >+ 2158, // textureGatherOffsets_00X10B10Dx400D >+ 2161, // textureGatherOffsets_00L20B10Dx400D >+ 2164, // textureGatherOffsets_00U20B10Dx400D >+ 2167, // textureGatherOffsets_00a20B10Dx400D >+ 2170, // textureGatherOffsets_00O10B10Dx400D >+ 2171, // textureGatherOffsets_00q10B10Dx400D >+ 2172, // textureGatherOffsets_00v10B10Dx400D >+ 2173, // rgb_2_yuv_20B00H >+ 2174, // yuv_2_rgb_20B00H >+ 2175, // dFdx_00B >+ 2178, // dFdx_10B >+ 2181, // dFdx_20B >+ 2184, // dFdx_30B >+ 2187, // dFdy_00B >+ 2190, // dFdy_10B >+ 2193, // dFdy_20B >+ 2196, // dFdy_30B >+ 2199, // fwidth_00B >+ 2202, // fwidth_10B >+ 2205, // fwidth_20B >+ 2208, // fwidth_30B >+ 2211, // dFdxFine_00B >+ 2212, // dFdxFine_10B >+ 2213, // dFdxFine_20B >+ 2214, // dFdxFine_30B >+ 2215, // dFdyFine_00B >+ 2216, // dFdyFine_10B >+ 2217, // dFdyFine_20B >+ 2218, // dFdyFine_30B >+ 2219, // dFdxCoarse_00B >+ 2220, // dFdxCoarse_10B >+ 2221, // dFdxCoarse_20B >+ 2222, // dFdxCoarse_30B >+ 2223, // dFdyCoarse_00B >+ 2224, // dFdyCoarse_10B >+ 2225, // dFdyCoarse_20B >+ 2226, // dFdyCoarse_30B >+ 2227, // fwidthFine_00B >+ 2228, // fwidthFine_10B >+ 2229, // fwidthFine_20B >+ 2230, // fwidthFine_30B >+ 2231, // fwidthCoarse_00B >+ 2232, // fwidthCoarse_10B >+ 2233, // fwidthCoarse_20B >+ 2234, // fwidthCoarse_30B >+ 2235, // interpolateAtCentroid_00B >+ 2238, // interpolateAtCentroid_10B >+ 2241, // interpolateAtCentroid_20B >+ 2244, // interpolateAtCentroid_30B >+ 2247, // interpolateAtSample_00B00D >+ 2250, // interpolateAtSample_10B00D >+ 2253, // interpolateAtSample_20B00D >+ 2256, // interpolateAtSample_30B00D >+ 2259, // interpolateAtOffset_00B10B >+ 2262, // interpolateAtOffset_10B10B >+ 2265, // interpolateAtOffset_20B10B >+ 2268, // interpolateAtOffset_30B10B >+ 2271, // atomicCounter_00G >+ 2273, // atomicCounterIncrement_00G >+ 2275, // atomicCounterDecrement_00G >+ 2277, // atomicCounterAdd_00G00E >+ 2278, // atomicCounterSubtract_00G00E >+ 2279, // atomicCounterMin_00G00E >+ 2280, // atomicCounterMax_00G00E >+ 2281, // atomicCounterAnd_00G00E >+ 2282, // atomicCounterOr_00G00E >+ 2283, // atomicCounterXor_00G00E >+ 2284, // atomicCounterExchange_00G00E >+ 2285, // atomicCounterCompSwap_00G00E00E >+ 2286, // atomicAdd_00E00E >+ 2288, // atomicAdd_00D00D >+ 2290, // atomicMin_00E00E >+ 2292, // atomicMin_00D00D >+ 2294, // atomicMax_00E00E >+ 2296, // atomicMax_00D00D >+ 2298, // atomicAnd_00E00E >+ 2300, // atomicAnd_00D00D >+ 2302, // atomicOr_00E00E >+ 2304, // atomicOr_00D00D >+ 2306, // atomicXor_00E00E >+ 2308, // atomicXor_00D00D >+ 2310, // atomicExchange_00E00E >+ 2312, // atomicExchange_00D00D >+ 2314, // atomicCompSwap_00E00E00E >+ 2316, // atomicCompSwap_00D00D00D >+ 2318, // imageSize_00z >+ 2320, // imageSize_01K >+ 2322, // imageSize_01V >+ 2324, // imageSize_01A >+ 2326, // imageSize_01L >+ 2328, // imageSize_01W >+ 2330, // imageSize_01B >+ 2332, // imageSize_01M >+ 2334, // imageSize_01X >+ 2336, // imageSize_01C >+ 2338, // imageSize_01N >+ 2340, // imageSize_01Y >+ 2342, // imageSize_01H >+ 2346, // imageSize_01S >+ 2350, // imageSize_01d >+ 2354, // imageSize_01J >+ 2358, // imageSize_01U >+ 2362, // imageSize_01f >+ 2366, // imageSize_01D >+ 2367, // imageSize_01O >+ 2368, // imageSize_01Z >+ 2369, // imageSize_01I >+ 2370, // imageSize_01T >+ 2371, // imageSize_01e >+ 2372, // imageSize_01E >+ 2373, // imageSize_01P >+ 2374, // imageSize_01a >+ 2375, // imageSize_01F >+ 2376, // imageSize_01Q >+ 2377, // imageSize_01b >+ 2378, // imageSize_01G >+ 2379, // imageSize_01R >+ 2380, // imageSize_01c >+ 2381, // imageSamples_01F >+ 2382, // imageSamples_01Q >+ 2383, // imageSamples_01b >+ 2384, // imageSamples_01G >+ 2385, // imageSamples_01R >+ 2386, // imageSamples_01c >+ 2387, // imageStore_00z10D30B >+ 2389, // imageStore_01K10D30D >+ 2391, // imageStore_01V10D30E >+ 2393, // imageStore_01A20D30B >+ 2395, // imageStore_01L20D30D >+ 2397, // imageStore_01W20D30E >+ 2399, // imageStore_01B20D30B >+ 2401, // imageStore_01M20D30D >+ 2403, // imageStore_01X20D30E >+ 2405, // imageStore_01C20D30B >+ 2407, // imageStore_01N20D30D >+ 2409, // imageStore_01Y20D30E >+ 2411, // imageStore_01H20D30B >+ 2415, // imageStore_01S20D30D >+ 2419, // imageStore_01d20D30E >+ 2423, // imageStore_01J00D30B >+ 2427, // imageStore_01U00D30D >+ 2431, // imageStore_01f00D30E >+ 2435, // imageStore_01D00D30B >+ 2436, // imageStore_01O00D30D >+ 2437, // imageStore_01Z00D30E >+ 2438, // imageStore_01E10D30B >+ 2439, // imageStore_01P10D30D >+ 2440, // imageStore_01a10D30E >+ 2441, // imageStore_01I10D30B >+ 2442, // imageStore_01T10D30D >+ 2443, // imageStore_01e10D30E >+ 2444, // imageStore_01F10D00D30B >+ 2445, // imageStore_01Q10D00D30D >+ 2446, // imageStore_01b10D00D30E >+ 2447, // imageStore_01G20D00D30B >+ 2448, // imageStore_01R20D00D30D >+ 2449, // imageStore_01c20D00D30E >+ 2450, // imageLoad_00z10D >+ 2452, // imageLoad_01K10D >+ 2454, // imageLoad_01V10D >+ 2456, // imageLoad_01A20D >+ 2458, // imageLoad_01L20D >+ 2460, // imageLoad_01W20D >+ 2462, // imageLoad_01B20D >+ 2464, // imageLoad_01M20D >+ 2466, // imageLoad_01X20D >+ 2468, // imageLoad_01C20D >+ 2470, // imageLoad_01N20D >+ 2472, // imageLoad_01Y20D >+ 2474, // imageLoad_01H20D >+ 2478, // imageLoad_01S20D >+ 2482, // imageLoad_01d20D >+ 2486, // imageLoad_01J00D >+ 2490, // imageLoad_01U00D >+ 2494, // imageLoad_01f00D >+ 2498, // imageLoad_01D00D >+ 2499, // imageLoad_01O00D >+ 2500, // imageLoad_01Z00D >+ 2501, // imageLoad_01E10D >+ 2502, // imageLoad_01P10D >+ 2503, // imageLoad_01a10D >+ 2504, // imageLoad_01I10D >+ 2505, // imageLoad_01T10D >+ 2506, // imageLoad_01e10D >+ 2507, // imageLoad_01F10D00D >+ 2508, // imageLoad_01Q10D00D >+ 2509, // imageLoad_01b10D00D >+ 2510, // imageLoad_01G20D00D >+ 2511, // imageLoad_01R20D00D >+ 2512, // imageLoad_01c20D00D >+ 2513, // imageAtomicAdd_00z10D00E >+ 2516, // imageAtomicAdd_01K10D00E >+ 2519, // imageAtomicAdd_01V10D00E >+ 2522, // imageAtomicAdd_01A20D00E >+ 2525, // imageAtomicAdd_01L20D00E >+ 2528, // imageAtomicAdd_01W20D00E >+ 2531, // imageAtomicAdd_01C20D00E >+ 2534, // imageAtomicAdd_01N20D00E >+ 2537, // imageAtomicAdd_01Y20D00E >+ 2540, // imageAtomicAdd_01J00D00E >+ 2543, // imageAtomicAdd_01U00D00E >+ 2546, // imageAtomicAdd_01f00D00E >+ 2549, // imageAtomicAdd_01B20D00E >+ 2552, // imageAtomicAdd_01M20D00E >+ 2555, // imageAtomicAdd_01X20D00E >+ 2558, // imageAtomicAdd_01H20D00E >+ 2561, // imageAtomicAdd_01S20D00E >+ 2564, // imageAtomicAdd_01d20D00E >+ 2567, // imageAtomicAdd_01D00D00E >+ 2570, // imageAtomicAdd_01O00D00E >+ 2573, // imageAtomicAdd_01Z00D00E >+ 2576, // imageAtomicAdd_01E10D00E >+ 2579, // imageAtomicAdd_01P10D00E >+ 2582, // imageAtomicAdd_01a10D00E >+ 2585, // imageAtomicAdd_01I10D00E >+ 2588, // imageAtomicAdd_01T10D00E >+ 2591, // imageAtomicAdd_01e10D00E >+ 2594, // imageAtomicAdd_01F10D00D00E >+ 2597, // imageAtomicAdd_01Q10D00D00E >+ 2600, // imageAtomicAdd_01b10D00D00E >+ 2603, // imageAtomicAdd_01G20D00D00E >+ 2606, // imageAtomicAdd_01R20D00D00E >+ 2609, // imageAtomicAdd_01c20D00D00E >+ 2612, // imageAtomicAdd_00z10D00D >+ 2615, // imageAtomicAdd_01K10D00D >+ 2618, // imageAtomicAdd_01V10D00D >+ 2621, // imageAtomicAdd_01A20D00D >+ 2624, // imageAtomicAdd_01L20D00D >+ 2627, // imageAtomicAdd_01W20D00D >+ 2630, // imageAtomicAdd_01C20D00D >+ 2633, // imageAtomicAdd_01N20D00D >+ 2636, // imageAtomicAdd_01Y20D00D >+ 2639, // imageAtomicAdd_01J00D00D >+ 2642, // imageAtomicAdd_01U00D00D >+ 2645, // imageAtomicAdd_01f00D00D >+ 2648, // imageAtomicAdd_01B20D00D >+ 2651, // imageAtomicAdd_01M20D00D >+ 2654, // imageAtomicAdd_01X20D00D >+ 2657, // imageAtomicAdd_01H20D00D >+ 2660, // imageAtomicAdd_01S20D00D >+ 2663, // imageAtomicAdd_01d20D00D >+ 2666, // imageAtomicAdd_01D00D00D >+ 2669, // imageAtomicAdd_01O00D00D >+ 2672, // imageAtomicAdd_01Z00D00D >+ 2675, // imageAtomicAdd_01E10D00D >+ 2678, // imageAtomicAdd_01P10D00D >+ 2681, // imageAtomicAdd_01a10D00D >+ 2684, // imageAtomicAdd_01I10D00D >+ 2687, // imageAtomicAdd_01T10D00D >+ 2690, // imageAtomicAdd_01e10D00D >+ 2693, // imageAtomicAdd_01F10D00D00D >+ 2696, // imageAtomicAdd_01Q10D00D00D >+ 2699, // imageAtomicAdd_01b10D00D00D >+ 2702, // imageAtomicAdd_01G20D00D00D >+ 2705, // imageAtomicAdd_01R20D00D00D >+ 2708, // imageAtomicAdd_01c20D00D00D >+ 2711, // imageAtomicMin_00z10D00E >+ 2714, // imageAtomicMin_01K10D00E >+ 2717, // imageAtomicMin_01V10D00E >+ 2720, // imageAtomicMin_01A20D00E >+ 2723, // imageAtomicMin_01L20D00E >+ 2726, // imageAtomicMin_01W20D00E >+ 2729, // imageAtomicMin_01C20D00E >+ 2732, // imageAtomicMin_01N20D00E >+ 2735, // imageAtomicMin_01Y20D00E >+ 2738, // imageAtomicMin_01J00D00E >+ 2741, // imageAtomicMin_01U00D00E >+ 2744, // imageAtomicMin_01f00D00E >+ 2747, // imageAtomicMin_01B20D00E >+ 2750, // imageAtomicMin_01M20D00E >+ 2753, // imageAtomicMin_01X20D00E >+ 2756, // imageAtomicMin_01H20D00E >+ 2759, // imageAtomicMin_01S20D00E >+ 2762, // imageAtomicMin_01d20D00E >+ 2765, // imageAtomicMin_01D00D00E >+ 2768, // imageAtomicMin_01O00D00E >+ 2771, // imageAtomicMin_01Z00D00E >+ 2774, // imageAtomicMin_01E10D00E >+ 2777, // imageAtomicMin_01P10D00E >+ 2780, // imageAtomicMin_01a10D00E >+ 2783, // imageAtomicMin_01I10D00E >+ 2786, // imageAtomicMin_01T10D00E >+ 2789, // imageAtomicMin_01e10D00E >+ 2792, // imageAtomicMin_01F10D00D00E >+ 2795, // imageAtomicMin_01Q10D00D00E >+ 2798, // imageAtomicMin_01b10D00D00E >+ 2801, // imageAtomicMin_01G20D00D00E >+ 2804, // imageAtomicMin_01R20D00D00E >+ 2807, // imageAtomicMin_01c20D00D00E >+ 2810, // imageAtomicMin_00z10D00D >+ 2813, // imageAtomicMin_01K10D00D >+ 2816, // imageAtomicMin_01V10D00D >+ 2819, // imageAtomicMin_01A20D00D >+ 2822, // imageAtomicMin_01L20D00D >+ 2825, // imageAtomicMin_01W20D00D >+ 2828, // imageAtomicMin_01C20D00D >+ 2831, // imageAtomicMin_01N20D00D >+ 2834, // imageAtomicMin_01Y20D00D >+ 2837, // imageAtomicMin_01J00D00D >+ 2840, // imageAtomicMin_01U00D00D >+ 2843, // imageAtomicMin_01f00D00D >+ 2846, // imageAtomicMin_01B20D00D >+ 2849, // imageAtomicMin_01M20D00D >+ 2852, // imageAtomicMin_01X20D00D >+ 2855, // imageAtomicMin_01H20D00D >+ 2858, // imageAtomicMin_01S20D00D >+ 2861, // imageAtomicMin_01d20D00D >+ 2864, // imageAtomicMin_01D00D00D >+ 2867, // imageAtomicMin_01O00D00D >+ 2870, // imageAtomicMin_01Z00D00D >+ 2873, // imageAtomicMin_01E10D00D >+ 2876, // imageAtomicMin_01P10D00D >+ 2879, // imageAtomicMin_01a10D00D >+ 2882, // imageAtomicMin_01I10D00D >+ 2885, // imageAtomicMin_01T10D00D >+ 2888, // imageAtomicMin_01e10D00D >+ 2891, // imageAtomicMin_01F10D00D00D >+ 2894, // imageAtomicMin_01Q10D00D00D >+ 2897, // imageAtomicMin_01b10D00D00D >+ 2900, // imageAtomicMin_01G20D00D00D >+ 2903, // imageAtomicMin_01R20D00D00D >+ 2906, // imageAtomicMin_01c20D00D00D >+ 2909, // imageAtomicMax_00z10D00E >+ 2912, // imageAtomicMax_01K10D00E >+ 2915, // imageAtomicMax_01V10D00E >+ 2918, // imageAtomicMax_01A20D00E >+ 2921, // imageAtomicMax_01L20D00E >+ 2924, // imageAtomicMax_01W20D00E >+ 2927, // imageAtomicMax_01C20D00E >+ 2930, // imageAtomicMax_01N20D00E >+ 2933, // imageAtomicMax_01Y20D00E >+ 2936, // imageAtomicMax_01J00D00E >+ 2939, // imageAtomicMax_01U00D00E >+ 2942, // imageAtomicMax_01f00D00E >+ 2945, // imageAtomicMax_01B20D00E >+ 2948, // imageAtomicMax_01M20D00E >+ 2951, // imageAtomicMax_01X20D00E >+ 2954, // imageAtomicMax_01H20D00E >+ 2957, // imageAtomicMax_01S20D00E >+ 2960, // imageAtomicMax_01d20D00E >+ 2963, // imageAtomicMax_01D00D00E >+ 2966, // imageAtomicMax_01O00D00E >+ 2969, // imageAtomicMax_01Z00D00E >+ 2972, // imageAtomicMax_01E10D00E >+ 2975, // imageAtomicMax_01P10D00E >+ 2978, // imageAtomicMax_01a10D00E >+ 2981, // imageAtomicMax_01I10D00E >+ 2984, // imageAtomicMax_01T10D00E >+ 2987, // imageAtomicMax_01e10D00E >+ 2990, // imageAtomicMax_01F10D00D00E >+ 2993, // imageAtomicMax_01Q10D00D00E >+ 2996, // imageAtomicMax_01b10D00D00E >+ 2999, // imageAtomicMax_01G20D00D00E >+ 3002, // imageAtomicMax_01R20D00D00E >+ 3005, // imageAtomicMax_01c20D00D00E >+ 3008, // imageAtomicMax_00z10D00D >+ 3011, // imageAtomicMax_01K10D00D >+ 3014, // imageAtomicMax_01V10D00D >+ 3017, // imageAtomicMax_01A20D00D >+ 3020, // imageAtomicMax_01L20D00D >+ 3023, // imageAtomicMax_01W20D00D >+ 3026, // imageAtomicMax_01C20D00D >+ 3029, // imageAtomicMax_01N20D00D >+ 3032, // imageAtomicMax_01Y20D00D >+ 3035, // imageAtomicMax_01J00D00D >+ 3038, // imageAtomicMax_01U00D00D >+ 3041, // imageAtomicMax_01f00D00D >+ 3044, // imageAtomicMax_01B20D00D >+ 3047, // imageAtomicMax_01M20D00D >+ 3050, // imageAtomicMax_01X20D00D >+ 3053, // imageAtomicMax_01H20D00D >+ 3056, // imageAtomicMax_01S20D00D >+ 3059, // imageAtomicMax_01d20D00D >+ 3062, // imageAtomicMax_01D00D00D >+ 3065, // imageAtomicMax_01O00D00D >+ 3068, // imageAtomicMax_01Z00D00D >+ 3071, // imageAtomicMax_01E10D00D >+ 3074, // imageAtomicMax_01P10D00D >+ 3077, // imageAtomicMax_01a10D00D >+ 3080, // imageAtomicMax_01I10D00D >+ 3083, // imageAtomicMax_01T10D00D >+ 3086, // imageAtomicMax_01e10D00D >+ 3089, // imageAtomicMax_01F10D00D00D >+ 3092, // imageAtomicMax_01Q10D00D00D >+ 3095, // imageAtomicMax_01b10D00D00D >+ 3098, // imageAtomicMax_01G20D00D00D >+ 3101, // imageAtomicMax_01R20D00D00D >+ 3104, // imageAtomicMax_01c20D00D00D >+ 3107, // imageAtomicAnd_00z10D00E >+ 3110, // imageAtomicAnd_01K10D00E >+ 3113, // imageAtomicAnd_01V10D00E >+ 3116, // imageAtomicAnd_01A20D00E >+ 3119, // imageAtomicAnd_01L20D00E >+ 3122, // imageAtomicAnd_01W20D00E >+ 3125, // imageAtomicAnd_01C20D00E >+ 3128, // imageAtomicAnd_01N20D00E >+ 3131, // imageAtomicAnd_01Y20D00E >+ 3134, // imageAtomicAnd_01J00D00E >+ 3137, // imageAtomicAnd_01U00D00E >+ 3140, // imageAtomicAnd_01f00D00E >+ 3143, // imageAtomicAnd_01B20D00E >+ 3146, // imageAtomicAnd_01M20D00E >+ 3149, // imageAtomicAnd_01X20D00E >+ 3152, // imageAtomicAnd_01H20D00E >+ 3155, // imageAtomicAnd_01S20D00E >+ 3158, // imageAtomicAnd_01d20D00E >+ 3161, // imageAtomicAnd_01D00D00E >+ 3164, // imageAtomicAnd_01O00D00E >+ 3167, // imageAtomicAnd_01Z00D00E >+ 3170, // imageAtomicAnd_01E10D00E >+ 3173, // imageAtomicAnd_01P10D00E >+ 3176, // imageAtomicAnd_01a10D00E >+ 3179, // imageAtomicAnd_01I10D00E >+ 3182, // imageAtomicAnd_01T10D00E >+ 3185, // imageAtomicAnd_01e10D00E >+ 3188, // imageAtomicAnd_01F10D00D00E >+ 3191, // imageAtomicAnd_01Q10D00D00E >+ 3194, // imageAtomicAnd_01b10D00D00E >+ 3197, // imageAtomicAnd_01G20D00D00E >+ 3200, // imageAtomicAnd_01R20D00D00E >+ 3203, // imageAtomicAnd_01c20D00D00E >+ 3206, // imageAtomicAnd_00z10D00D >+ 3209, // imageAtomicAnd_01K10D00D >+ 3212, // imageAtomicAnd_01V10D00D >+ 3215, // imageAtomicAnd_01A20D00D >+ 3218, // imageAtomicAnd_01L20D00D >+ 3221, // imageAtomicAnd_01W20D00D >+ 3224, // imageAtomicAnd_01C20D00D >+ 3227, // imageAtomicAnd_01N20D00D >+ 3230, // imageAtomicAnd_01Y20D00D >+ 3233, // imageAtomicAnd_01J00D00D >+ 3236, // imageAtomicAnd_01U00D00D >+ 3239, // imageAtomicAnd_01f00D00D >+ 3242, // imageAtomicAnd_01B20D00D >+ 3245, // imageAtomicAnd_01M20D00D >+ 3248, // imageAtomicAnd_01X20D00D >+ 3251, // imageAtomicAnd_01H20D00D >+ 3254, // imageAtomicAnd_01S20D00D >+ 3257, // imageAtomicAnd_01d20D00D >+ 3260, // imageAtomicAnd_01D00D00D >+ 3263, // imageAtomicAnd_01O00D00D >+ 3266, // imageAtomicAnd_01Z00D00D >+ 3269, // imageAtomicAnd_01E10D00D >+ 3272, // imageAtomicAnd_01P10D00D >+ 3275, // imageAtomicAnd_01a10D00D >+ 3278, // imageAtomicAnd_01I10D00D >+ 3281, // imageAtomicAnd_01T10D00D >+ 3284, // imageAtomicAnd_01e10D00D >+ 3287, // imageAtomicAnd_01F10D00D00D >+ 3290, // imageAtomicAnd_01Q10D00D00D >+ 3293, // imageAtomicAnd_01b10D00D00D >+ 3296, // imageAtomicAnd_01G20D00D00D >+ 3299, // imageAtomicAnd_01R20D00D00D >+ 3302, // imageAtomicAnd_01c20D00D00D >+ 3305, // imageAtomicOr_00z10D00E >+ 3308, // imageAtomicOr_01K10D00E >+ 3311, // imageAtomicOr_01V10D00E >+ 3314, // imageAtomicOr_01A20D00E >+ 3317, // imageAtomicOr_01L20D00E >+ 3320, // imageAtomicOr_01W20D00E >+ 3323, // imageAtomicOr_01C20D00E >+ 3326, // imageAtomicOr_01N20D00E >+ 3329, // imageAtomicOr_01Y20D00E >+ 3332, // imageAtomicOr_01J00D00E >+ 3335, // imageAtomicOr_01U00D00E >+ 3338, // imageAtomicOr_01f00D00E >+ 3341, // imageAtomicOr_01B20D00E >+ 3344, // imageAtomicOr_01M20D00E >+ 3347, // imageAtomicOr_01X20D00E >+ 3350, // imageAtomicOr_01H20D00E >+ 3353, // imageAtomicOr_01S20D00E >+ 3356, // imageAtomicOr_01d20D00E >+ 3359, // imageAtomicOr_01D00D00E >+ 3362, // imageAtomicOr_01O00D00E >+ 3365, // imageAtomicOr_01Z00D00E >+ 3368, // imageAtomicOr_01E10D00E >+ 3371, // imageAtomicOr_01P10D00E >+ 3374, // imageAtomicOr_01a10D00E >+ 3377, // imageAtomicOr_01I10D00E >+ 3380, // imageAtomicOr_01T10D00E >+ 3383, // imageAtomicOr_01e10D00E >+ 3386, // imageAtomicOr_01F10D00D00E >+ 3389, // imageAtomicOr_01Q10D00D00E >+ 3392, // imageAtomicOr_01b10D00D00E >+ 3395, // imageAtomicOr_01G20D00D00E >+ 3398, // imageAtomicOr_01R20D00D00E >+ 3401, // imageAtomicOr_01c20D00D00E >+ 3404, // imageAtomicOr_00z10D00D >+ 3407, // imageAtomicOr_01K10D00D >+ 3410, // imageAtomicOr_01V10D00D >+ 3413, // imageAtomicOr_01A20D00D >+ 3416, // imageAtomicOr_01L20D00D >+ 3419, // imageAtomicOr_01W20D00D >+ 3422, // imageAtomicOr_01C20D00D >+ 3425, // imageAtomicOr_01N20D00D >+ 3428, // imageAtomicOr_01Y20D00D >+ 3431, // imageAtomicOr_01J00D00D >+ 3434, // imageAtomicOr_01U00D00D >+ 3437, // imageAtomicOr_01f00D00D >+ 3440, // imageAtomicOr_01B20D00D >+ 3443, // imageAtomicOr_01M20D00D >+ 3446, // imageAtomicOr_01X20D00D >+ 3449, // imageAtomicOr_01H20D00D >+ 3452, // imageAtomicOr_01S20D00D >+ 3455, // imageAtomicOr_01d20D00D >+ 3458, // imageAtomicOr_01D00D00D >+ 3461, // imageAtomicOr_01O00D00D >+ 3464, // imageAtomicOr_01Z00D00D >+ 3467, // imageAtomicOr_01E10D00D >+ 3470, // imageAtomicOr_01P10D00D >+ 3473, // imageAtomicOr_01a10D00D >+ 3476, // imageAtomicOr_01I10D00D >+ 3479, // imageAtomicOr_01T10D00D >+ 3482, // imageAtomicOr_01e10D00D >+ 3485, // imageAtomicOr_01F10D00D00D >+ 3488, // imageAtomicOr_01Q10D00D00D >+ 3491, // imageAtomicOr_01b10D00D00D >+ 3494, // imageAtomicOr_01G20D00D00D >+ 3497, // imageAtomicOr_01R20D00D00D >+ 3500, // imageAtomicOr_01c20D00D00D >+ 3503, // imageAtomicXor_00z10D00E >+ 3506, // imageAtomicXor_01K10D00E >+ 3509, // imageAtomicXor_01V10D00E >+ 3512, // imageAtomicXor_01A20D00E >+ 3515, // imageAtomicXor_01L20D00E >+ 3518, // imageAtomicXor_01W20D00E >+ 3521, // imageAtomicXor_01C20D00E >+ 3524, // imageAtomicXor_01N20D00E >+ 3527, // imageAtomicXor_01Y20D00E >+ 3530, // imageAtomicXor_01J00D00E >+ 3533, // imageAtomicXor_01U00D00E >+ 3536, // imageAtomicXor_01f00D00E >+ 3539, // imageAtomicXor_01B20D00E >+ 3542, // imageAtomicXor_01M20D00E >+ 3545, // imageAtomicXor_01X20D00E >+ 3548, // imageAtomicXor_01H20D00E >+ 3551, // imageAtomicXor_01S20D00E >+ 3554, // imageAtomicXor_01d20D00E >+ 3557, // imageAtomicXor_01D00D00E >+ 3560, // imageAtomicXor_01O00D00E >+ 3563, // imageAtomicXor_01Z00D00E >+ 3566, // imageAtomicXor_01E10D00E >+ 3569, // imageAtomicXor_01P10D00E >+ 3572, // imageAtomicXor_01a10D00E >+ 3575, // imageAtomicXor_01I10D00E >+ 3578, // imageAtomicXor_01T10D00E >+ 3581, // imageAtomicXor_01e10D00E >+ 3584, // imageAtomicXor_01F10D00D00E >+ 3587, // imageAtomicXor_01Q10D00D00E >+ 3590, // imageAtomicXor_01b10D00D00E >+ 3593, // imageAtomicXor_01G20D00D00E >+ 3596, // imageAtomicXor_01R20D00D00E >+ 3599, // imageAtomicXor_01c20D00D00E >+ 3602, // imageAtomicXor_00z10D00D >+ 3605, // imageAtomicXor_01K10D00D >+ 3608, // imageAtomicXor_01V10D00D >+ 3611, // imageAtomicXor_01A20D00D >+ 3614, // imageAtomicXor_01L20D00D >+ 3617, // imageAtomicXor_01W20D00D >+ 3620, // imageAtomicXor_01C20D00D >+ 3623, // imageAtomicXor_01N20D00D >+ 3626, // imageAtomicXor_01Y20D00D >+ 3629, // imageAtomicXor_01J00D00D >+ 3632, // imageAtomicXor_01U00D00D >+ 3635, // imageAtomicXor_01f00D00D >+ 3638, // imageAtomicXor_01B20D00D >+ 3641, // imageAtomicXor_01M20D00D >+ 3644, // imageAtomicXor_01X20D00D >+ 3647, // imageAtomicXor_01H20D00D >+ 3650, // imageAtomicXor_01S20D00D >+ 3653, // imageAtomicXor_01d20D00D >+ 3656, // imageAtomicXor_01D00D00D >+ 3659, // imageAtomicXor_01O00D00D >+ 3662, // imageAtomicXor_01Z00D00D >+ 3665, // imageAtomicXor_01E10D00D >+ 3668, // imageAtomicXor_01P10D00D >+ 3671, // imageAtomicXor_01a10D00D >+ 3674, // imageAtomicXor_01I10D00D >+ 3677, // imageAtomicXor_01T10D00D >+ 3680, // imageAtomicXor_01e10D00D >+ 3683, // imageAtomicXor_01F10D00D00D >+ 3686, // imageAtomicXor_01Q10D00D00D >+ 3689, // imageAtomicXor_01b10D00D00D >+ 3692, // imageAtomicXor_01G20D00D00D >+ 3695, // imageAtomicXor_01R20D00D00D >+ 3698, // imageAtomicXor_01c20D00D00D >+ 3701, // imageAtomicExchange_00z10D00E >+ 3704, // imageAtomicExchange_01K10D00E >+ 3707, // imageAtomicExchange_01V10D00E >+ 3710, // imageAtomicExchange_01A20D00E >+ 3713, // imageAtomicExchange_01L20D00E >+ 3716, // imageAtomicExchange_01W20D00E >+ 3719, // imageAtomicExchange_01C20D00E >+ 3722, // imageAtomicExchange_01N20D00E >+ 3725, // imageAtomicExchange_01Y20D00E >+ 3728, // imageAtomicExchange_01J00D00E >+ 3731, // imageAtomicExchange_01U00D00E >+ 3734, // imageAtomicExchange_01f00D00E >+ 3737, // imageAtomicExchange_01B20D00E >+ 3740, // imageAtomicExchange_01M20D00E >+ 3743, // imageAtomicExchange_01X20D00E >+ 3746, // imageAtomicExchange_01H20D00E >+ 3749, // imageAtomicExchange_01S20D00E >+ 3752, // imageAtomicExchange_01d20D00E >+ 3755, // imageAtomicExchange_01D00D00E >+ 3758, // imageAtomicExchange_01O00D00E >+ 3761, // imageAtomicExchange_01Z00D00E >+ 3764, // imageAtomicExchange_01E10D00E >+ 3767, // imageAtomicExchange_01P10D00E >+ 3770, // imageAtomicExchange_01a10D00E >+ 3773, // imageAtomicExchange_01I10D00E >+ 3776, // imageAtomicExchange_01T10D00E >+ 3779, // imageAtomicExchange_01e10D00E >+ 3782, // imageAtomicExchange_01F10D00D00E >+ 3785, // imageAtomicExchange_01Q10D00D00E >+ 3788, // imageAtomicExchange_01b10D00D00E >+ 3791, // imageAtomicExchange_01G20D00D00E >+ 3794, // imageAtomicExchange_01R20D00D00E >+ 3797, // imageAtomicExchange_01c20D00D00E >+ 3800, // imageAtomicExchange_00z10D00D >+ 3803, // imageAtomicExchange_01K10D00D >+ 3806, // imageAtomicExchange_01V10D00D >+ 3809, // imageAtomicExchange_01A20D00D >+ 3812, // imageAtomicExchange_01L20D00D >+ 3815, // imageAtomicExchange_01W20D00D >+ 3818, // imageAtomicExchange_01C20D00D >+ 3821, // imageAtomicExchange_01N20D00D >+ 3824, // imageAtomicExchange_01Y20D00D >+ 3827, // imageAtomicExchange_01J00D00D >+ 3830, // imageAtomicExchange_01U00D00D >+ 3833, // imageAtomicExchange_01f00D00D >+ 3836, // imageAtomicExchange_01B20D00D >+ 3839, // imageAtomicExchange_01M20D00D >+ 3842, // imageAtomicExchange_01X20D00D >+ 3845, // imageAtomicExchange_01H20D00D >+ 3848, // imageAtomicExchange_01S20D00D >+ 3851, // imageAtomicExchange_01d20D00D >+ 3854, // imageAtomicExchange_01D00D00D >+ 3857, // imageAtomicExchange_01O00D00D >+ 3860, // imageAtomicExchange_01Z00D00D >+ 3863, // imageAtomicExchange_01E10D00D >+ 3866, // imageAtomicExchange_01P10D00D >+ 3869, // imageAtomicExchange_01a10D00D >+ 3872, // imageAtomicExchange_01I10D00D >+ 3875, // imageAtomicExchange_01T10D00D >+ 3878, // imageAtomicExchange_01e10D00D >+ 3881, // imageAtomicExchange_01F10D00D00D >+ 3884, // imageAtomicExchange_01Q10D00D00D >+ 3887, // imageAtomicExchange_01b10D00D00D >+ 3890, // imageAtomicExchange_01G20D00D00D >+ 3893, // imageAtomicExchange_01R20D00D00D >+ 3896, // imageAtomicExchange_01c20D00D00D >+ 3899, // imageAtomicExchange_00z10D00B >+ 3902, // imageAtomicExchange_01K10D00B >+ 3905, // imageAtomicExchange_01V10D00B >+ 3908, // imageAtomicExchange_01A20D00B >+ 3911, // imageAtomicExchange_01L20D00B >+ 3914, // imageAtomicExchange_01W20D00B >+ 3917, // imageAtomicExchange_01C20D00B >+ 3920, // imageAtomicExchange_01N20D00B >+ 3923, // imageAtomicExchange_01Y20D00B >+ 3926, // imageAtomicExchange_01J00D00B >+ 3929, // imageAtomicExchange_01U00D00B >+ 3932, // imageAtomicExchange_01f00D00B >+ 3935, // imageAtomicExchange_01B20D00B >+ 3938, // imageAtomicExchange_01M20D00B >+ 3941, // imageAtomicExchange_01X20D00B >+ 3944, // imageAtomicExchange_01H20D00B >+ 3947, // imageAtomicExchange_01S20D00B >+ 3950, // imageAtomicExchange_01d20D00B >+ 3953, // imageAtomicExchange_01D00D00B >+ 3956, // imageAtomicExchange_01O00D00B >+ 3959, // imageAtomicExchange_01Z00D00B >+ 3962, // imageAtomicExchange_01E10D00B >+ 3965, // imageAtomicExchange_01P10D00B >+ 3968, // imageAtomicExchange_01a10D00B >+ 3971, // imageAtomicExchange_01I10D00B >+ 3974, // imageAtomicExchange_01T10D00B >+ 3977, // imageAtomicExchange_01e10D00B >+ 3980, // imageAtomicExchange_01F10D00D00B >+ 3983, // imageAtomicExchange_01Q10D00D00B >+ 3986, // imageAtomicExchange_01b10D00D00B >+ 3989, // imageAtomicExchange_01G20D00D00B >+ 3992, // imageAtomicExchange_01R20D00D00B >+ 3995, // imageAtomicExchange_01c20D00D00B >+ 3998, // imageAtomicCompSwap_00z10D00E00E >+ 4001, // imageAtomicCompSwap_01K10D00E00E >+ 4004, // imageAtomicCompSwap_01V10D00E00E >+ 4007, // imageAtomicCompSwap_01A20D00E00E >+ 4010, // imageAtomicCompSwap_01L20D00E00E >+ 4013, // imageAtomicCompSwap_01W20D00E00E >+ 4016, // imageAtomicCompSwap_01C20D00E00E >+ 4019, // imageAtomicCompSwap_01N20D00E00E >+ 4022, // imageAtomicCompSwap_01Y20D00E00E >+ 4025, // imageAtomicCompSwap_01J00D00E00E >+ 4028, // imageAtomicCompSwap_01U00D00E00E >+ 4031, // imageAtomicCompSwap_01f00D00E00E >+ 4034, // imageAtomicCompSwap_01B20D00E00E >+ 4037, // imageAtomicCompSwap_01M20D00E00E >+ 4040, // imageAtomicCompSwap_01X20D00E00E >+ 4043, // imageAtomicCompSwap_01H20D00E00E >+ 4046, // imageAtomicCompSwap_01S20D00E00E >+ 4049, // imageAtomicCompSwap_01d20D00E00E >+ 4052, // imageAtomicCompSwap_01D00D00E00E >+ 4055, // imageAtomicCompSwap_01O00D00E00E >+ 4058, // imageAtomicCompSwap_01Z00D00E00E >+ 4061, // imageAtomicCompSwap_01E10D00E00E >+ 4064, // imageAtomicCompSwap_01P10D00E00E >+ 4067, // imageAtomicCompSwap_01a10D00E00E >+ 4070, // imageAtomicCompSwap_01I10D00E00E >+ 4073, // imageAtomicCompSwap_01T10D00E00E >+ 4076, // imageAtomicCompSwap_01e10D00E00E >+ 4079, // imageAtomicCompSwap_01F10D00D00E00E >+ 4082, // imageAtomicCompSwap_01Q10D00D00E00E >+ 4085, // imageAtomicCompSwap_01b10D00D00E00E >+ 4088, // imageAtomicCompSwap_01G20D00D00E00E >+ 4091, // imageAtomicCompSwap_01R20D00D00E00E >+ 4094, // imageAtomicCompSwap_01c20D00D00E00E >+ 4097, // imageAtomicCompSwap_00z10D00D00D >+ 4100, // imageAtomicCompSwap_01K10D00D00D >+ 4103, // imageAtomicCompSwap_01V10D00D00D >+ 4106, // imageAtomicCompSwap_01A20D00D00D >+ 4109, // imageAtomicCompSwap_01L20D00D00D >+ 4112, // imageAtomicCompSwap_01W20D00D00D >+ 4115, // imageAtomicCompSwap_01C20D00D00D >+ 4118, // imageAtomicCompSwap_01N20D00D00D >+ 4121, // imageAtomicCompSwap_01Y20D00D00D >+ 4124, // imageAtomicCompSwap_01J00D00D00D >+ 4127, // imageAtomicCompSwap_01U00D00D00D >+ 4130, // imageAtomicCompSwap_01f00D00D00D >+ 4133, // imageAtomicCompSwap_01B20D00D00D >+ 4136, // imageAtomicCompSwap_01M20D00D00D >+ 4139, // imageAtomicCompSwap_01X20D00D00D >+ 4142, // imageAtomicCompSwap_01H20D00D00D >+ 4145, // imageAtomicCompSwap_01S20D00D00D >+ 4148, // imageAtomicCompSwap_01d20D00D00D >+ 4151, // imageAtomicCompSwap_01D00D00D00D >+ 4154, // imageAtomicCompSwap_01O00D00D00D >+ 4157, // imageAtomicCompSwap_01Z00D00D00D >+ 4160, // imageAtomicCompSwap_01E10D00D00D >+ 4163, // imageAtomicCompSwap_01P10D00D00D >+ 4166, // imageAtomicCompSwap_01a10D00D00D >+ 4169, // imageAtomicCompSwap_01I10D00D00D >+ 4172, // imageAtomicCompSwap_01T10D00D00D >+ 4175, // imageAtomicCompSwap_01e10D00D00D >+ 4178, // imageAtomicCompSwap_01F10D00D00D00D >+ 4181, // imageAtomicCompSwap_01Q10D00D00D00D >+ 4184, // imageAtomicCompSwap_01b10D00D00D00D >+ 4187, // imageAtomicCompSwap_01G20D00D00D00D >+ 4190, // imageAtomicCompSwap_01R20D00D00D00D >+ 4193, // imageAtomicCompSwap_01c20D00D00D00D >+ 4196, // noise1_00B >+ 4197, // noise1_10B >+ 4198, // noise1_20B >+ 4199, // noise1_30B >+ 4200, // noise2_00B >+ 4201, // noise2_10B >+ 4202, // noise2_20B >+ 4203, // noise2_30B >+ 4204, // noise3_00B >+ 4205, // noise3_10B >+ 4206, // noise3_20B >+ 4207, // noise3_30B >+ 4208, // noise4_00B >+ 4209, // noise4_10B >+ 4210, // noise4_20B >+ 4211, // noise4_30B >+ 4212, // memoryBarrier_ >+ 4214, // memoryBarrierAtomicCounter_ >+ 4216, // memoryBarrierBuffer_ >+ 4218, // memoryBarrierImage_ >+ 4220, // barrier_ >+ 4224, // memoryBarrierShared_ >+ 4226, // groupMemoryBarrier_ >+ 4228, // EmitVertex_ >+ 4232, // EndPrimitive_ >+ 4236, // EmitStreamVertex_00D >+ 4237, // EndStreamPrimitive_00D >+ 4238, // subpassLoad_01g >+ 4240, // subpassLoad_01h >+ 4242, // subpassLoad_01i >+ 4244, // subpassLoad_01j00D >+ 4246, // subpassLoad_01k00D >+ 4248, // subpassLoad_01l00D >+ 4250, // anyInvocation_00F >+ 4251, // allInvocations_00F >+ 4252, // allInvocationsEqual_00F >+ 4253, // gl_DepthRangeParameters >+ 4255, // gl_DepthRange >+ 4257, // gl_NumSamples >+ 4260, // gl_MaxVertexAttribs >+ 4262, // gl_MaxVertexUniformVectors >+ 4264, // gl_MaxVertexTextureImageUnits >+ 4266, // gl_MaxCombinedTextureImageUnits >+ 4268, // gl_MaxTextureImageUnits >+ 4270, // gl_MaxFragmentUniformVectors >+ 4272, // gl_MaxVaryingVectors >+ 4274, // gl_MaxDrawBuffers >+ 4276, // gl_MaxDualSourceDrawBuffersEXT >+ 4277, // gl_MaxVertexOutputVectors >+ 4279, // gl_MaxFragmentInputVectors >+ 4281, // gl_MinProgramTexelOffset >+ 4283, // gl_MaxProgramTexelOffset >+ 4285, // gl_MaxImageUnits >+ 4287, // gl_MaxVertexImageUniforms >+ 4289, // gl_MaxFragmentImageUniforms >+ 4291, // gl_MaxComputeImageUniforms >+ 4293, // gl_MaxCombinedImageUniforms >+ 4295, // gl_MaxCombinedShaderOutputResources >+ 4297, // gl_MaxComputeWorkGroupCount >+ 4299, // gl_MaxComputeWorkGroupSize >+ 4301, // gl_MaxComputeUniformComponents >+ 4303, // gl_MaxComputeTextureImageUnits >+ 4305, // gl_MaxComputeAtomicCounters >+ 4307, // gl_MaxComputeAtomicCounterBuffers >+ 4309, // gl_MaxVertexAtomicCounters >+ 4311, // gl_MaxFragmentAtomicCounters >+ 4313, // gl_MaxCombinedAtomicCounters >+ 4315, // gl_MaxAtomicCounterBindings >+ 4317, // gl_MaxVertexAtomicCounterBuffers >+ 4319, // gl_MaxFragmentAtomicCounterBuffers >+ 4321, // gl_MaxCombinedAtomicCounterBuffers >+ 4323, // gl_MaxAtomicCounterBufferSize >+ 4325, // gl_MaxGeometryInputComponents >+ 4329, // gl_MaxGeometryOutputComponents >+ 4333, // gl_MaxGeometryImageUniforms >+ 4337, // gl_MaxGeometryTextureImageUnits >+ 4341, // gl_MaxGeometryOutputVertices >+ 4345, // gl_MaxGeometryTotalOutputComponents >+ 4349, // gl_MaxGeometryUniformComponents >+ 4353, // gl_MaxGeometryAtomicCounters >+ 4357, // gl_MaxGeometryAtomicCounterBuffers >+ 4361, // gl_MaxTessControlInputComponents >+ 4364, // gl_MaxTessControlOutputComponents >+ 4367, // gl_MaxTessControlTextureImageUnits >+ 4370, // gl_MaxTessControlUniformComponents >+ 4373, // gl_MaxTessControlTotalOutputComponents >+ 4376, // gl_MaxTessControlImageUniforms >+ 4379, // gl_MaxTessControlAtomicCounters >+ 4382, // gl_MaxTessControlAtomicCounterBuffers >+ 4385, // gl_MaxTessPatchComponents >+ 4388, // gl_MaxPatchVertices >+ 4391, // gl_MaxTessGenLevel >+ 4394, // gl_MaxTessEvaluationInputComponents >+ 4397, // gl_MaxTessEvaluationOutputComponents >+ 4400, // gl_MaxTessEvaluationTextureImageUnits >+ 4403, // gl_MaxTessEvaluationUniformComponents >+ 4406, // gl_MaxTessEvaluationImageUniforms >+ 4409, // gl_MaxTessEvaluationAtomicCounters >+ 4412, // gl_MaxTessEvaluationAtomicCounterBuffers >+ 4415, // gl_MaxSamples >+ 4418, // gl_MaxClipDistances >+ 4419, // gl_MaxCullDistances >+ 4420, // gl_MaxCombinedClipAndCullDistances >+ 4421, // gl_FragCoord >+ 4425, // gl_FrontFacing >+ 4427, // gl_PointCoord >+ 4429, // gl_FragColor >+ 4431, // gl_FragData >+ 4433, // gl_FragDepth >+ 4435, // gl_HelperInvocation >+ 4437, // gl_SecondaryFragColorEXT >+ 4438, // gl_SecondaryFragDataEXT >+ 4439, // gl_FragDepthEXT >+ 4440, // gl_LastFragData >+ 4443, // gl_LastFragColor >+ 4444, // gl_LastFragColorARM >+ 4445, // gl_PrimitiveID >+ 4459, // gl_Layer >+ 4467, // gl_SampleID >+ 4470, // gl_SamplePosition >+ 4473, // gl_SampleMaskIn >+ 4476, // gl_SampleMask >+ 4479, // gl_CullDistance >+ 4481, // gl_ClipDistance >+ 4483, // gl_Position >+ 4495, // gl_PointSize >+ 4499, // gl_InstanceID >+ 4501, // Empty >+ 4501, // gl_VertexID >+ 4503, // Empty >+ 4503, // Empty >+ 4503, // gl_DrawID >+ 4504, // gl_BaseVertex >+ 4505, // gl_BaseInstance >+ 4506, // angle_BaseVertex >+ 4507, // angle_BaseInstance >+ 4508, // gl_NumWorkGroups >+ 4510, // gl_WorkGroupSize >+ 4512, // gl_WorkGroupID >+ 4514, // gl_LocalInvocationID >+ 4516, // gl_GlobalInvocationID >+ 4518, // gl_LocalInvocationIndex >+ 4520, // gl_PrimitiveIDIn >+ 4524, // gl_InvocationID >+ 4531, // gl_PerVertex >+ 4541, // gl_in >+ 4551, // gl_PatchVerticesIn >+ 4557, // gl_TessLevelOuter >+ 4563, // gl_TessLevelInner >+ 4569, // gl_out >+ 4575, // gl_BoundingBoxEXT >+ 4578, // gl_TessCoord >+ 4580, // gl_ViewID_OVR > }; > > using Ext = TExtension; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetal.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetal.cpp >index d25b72aa4dc46d3cfe997b599b730ef533e5da8e..df4c90bd353563544d42b49659cda34f698177d1 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetal.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetal.cpp >@@ -192,7 +192,7 @@ bool TranslatorMetal::transformDepthBeforeCorrection(TIntermBlock *root, > TIntermSwizzle *positionZ = new TIntermSwizzle(positionRef, swizzleOffsetZ); > > // Create a ref to "depthRange.reserved" >- TIntermBinary *viewportZScale = driverUniforms->getDepthRangeReservedFieldRef(); >+ TIntermTyped *viewportZScale = driverUniforms->getDepthRangeReservedFieldRef(); > > // Create the expression "gl_Position.z * depthRange.reserved". > TIntermBinary *zScale = new TIntermBinary(EOpMul, positionZ->deepCopy(), viewportZScale); >@@ -248,7 +248,7 @@ ANGLE_NO_DISCARD bool TranslatorMetal::insertSampleMaskWritingLogic( > sampleMaskWriteFunc->addParameter(maskArg); > > // coverageMask >- TIntermBinary *coverageMask = driverUniforms->getCoverageMaskFieldRef(); >+ TIntermTyped *coverageMask = driverUniforms->getCoverageMaskFieldRef(); > > // Insert this code to the end of main() > // if (ANGLECoverageMaskEnabled) >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalConstantNames.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalConstantNames.cpp >index 515cc6e0980f5c2e17b4d7e4fe814ddb2fdba02d..b1352fa2638bbcf411f666a5a36e7ff744864214 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalConstantNames.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalConstantNames.cpp >@@ -1,5 +1,5 @@ > // >-// Copyright 2019 The ANGLE Project Authors. All rights reserved. >+// Copyright 2022 The ANGLE Project Authors. All rights reserved. > // Use of this source code is governed by a BSD-style license that can be > // found in the LICENSE file. > // >@@ -19,6 +19,7 @@ namespace mtl > /** extern */ > const char kCoverageMaskEnabledConstName[] = "ANGLECoverageMaskEnabled"; > const char kRasterizerDiscardEnabledConstName[] = "ANGLERasterizerDisabled"; >+const char kDepthWriteEnabledConstName[] = "ANGLEDepthWriteEnabled"; > } // namespace mtl > > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.cpp >index 9da5ad2880825ca858207e458c2d93e574d53b97..59581015003429af6257abb85c9c82f5dea87589 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect.cpp >@@ -202,7 +202,7 @@ ANGLE_NO_DISCARD bool ReplaceGLDepthRangeWithDriverUniform(TCompiler *compiler, > symbolTable->findBuiltIn(ImmutableString("gl_DepthRange"), 0)); > > // ANGLEUniforms.depthRange >- TIntermBinary *angleEmulatedDepthRangeRef = driverUniforms->getDepthRangeRef(); >+ TIntermTyped *angleEmulatedDepthRangeRef = driverUniforms->getDepthRangeRef(); > > // Use this variable instead of gl_DepthRange everywhere. > return ReplaceVariableWithTyped(compiler, root, depthRangeVar, angleEmulatedDepthRangeRef); >@@ -233,8 +233,8 @@ ANGLE_NO_DISCARD bool RotateAndFlipBuiltinVariable(TCompiler *compiler, > TIntermSwizzle *builtinXY = new TIntermSwizzle(builtinRef, swizzleOffsetXY); > > // Create a symbol reference to our new variable that will hold the modified builtin. >- const TType *type = StaticType::GetForVec<EbtFloat, EbpHigh>( >- EvqGlobal, static_cast<unsigned char>(builtin->getType().getNominalSize())); >+ const TType *type = >+ StaticType::GetForVec<EbtFloat, EbpHigh>(EvqGlobal, builtin->getType().getNominalSize()); > TVariable *replacementVar = > new TVariable(symbolTable, flippedVariableName.rawName(), type, SymbolType::AngleInternal); > DeclareGlobalVariable(root, replacementVar); >@@ -296,7 +296,7 @@ ANGLE_NO_DISCARD bool InsertFragCoordCorrection(TCompiler *compiler, > flipXY = driverUniforms->getFlipXYRef(); > } > >- TIntermBinary *pivot = specConst->getHalfRenderArea(); >+ TIntermTyped *pivot = specConst->getHalfRenderArea(); > if (!pivot) > { > pivot = driverUniforms->getHalfRenderAreaRef(); >@@ -505,8 +505,8 @@ ANGLE_NO_DISCARD bool TranslatorMetalDirect::insertSampleMaskWritingLogic( > // ANGLE_writeSampleMask(ANGLE_angleUniforms.coverageMask, > // ANGLE_fragmentOut.gl_SampleMask); > // } >- TIntermSequence *args = new TIntermSequence; >- TIntermBinary *coverageMask = driverUniforms.getCoverageMaskFieldRef(); >+ TIntermSequence *args = new TIntermSequence; >+ TIntermTyped *coverageMask = driverUniforms.getCoverageMaskFieldRef(); > args->push_back(coverageMask); > const TIntermSymbol *gl_SampleMask = FindSymbolNode(&root, ImmutableString("gl_SampleMask")); > args->push_back(gl_SampleMask->deepCopy()); >@@ -576,7 +576,7 @@ bool TranslatorMetalDirect::transformDepthBeforeCorrection(TIntermBlock *root, > TIntermSwizzle *positionZ = new TIntermSwizzle(positionRef, swizzleOffsetZ); > > // Create a ref to "depthRange.reserved" >- TIntermBinary *viewportZScale = driverUniforms->getDepthRangeReservedFieldRef(); >+ TIntermTyped *viewportZScale = driverUniforms->getDepthRangeReservedFieldRef(); > > // Create the expression "gl_Position.z * depthRange.reserved". > TIntermBinary *zScale = new TIntermBinary(EOpMul, positionZ->deepCopy(), viewportZScale); >@@ -1007,7 +1007,7 @@ bool TranslatorMetalDirect::translateImpl(TInfoSinkBase &sink, > > if (getShaderType() == GL_VERTEX_SHADER) > { >- auto negFlipY = driverUniforms->getNegFlipYRef(); >+ TIntermTyped *negFlipY = driverUniforms->getNegFlipYRef(); > > if (!AppendVertexShaderPositionYCorrectionToMain(this, root, &getSymbolTable(), negFlipY)) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp >index dc20e62ad9fa15fe9693213ea7ea2561aab9dec7..bb3d2779d77d6a57c8195cbf23c0cd9b3edbc1e6 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/AstHelpers.cpp >@@ -426,7 +426,7 @@ TIntermTyped &sh::CoerceSimple(TBasicType toBasicType, > case TBasicType::EbtUInt: > { > TIntermSequence *argsSequence = new TIntermSequence(); >- for (int i = 0; i < fromType.getNominalSize(); i++) >+ for (uint8_t i = 0; i < fromType.getNominalSize(); i++) > { > TIntermTyped &fromTypeSwizzle = SubVector(fromNode, i, i + 1); > TIntermAggregate *boolConstructor = TIntermAggregate::CreateConstructor( >@@ -479,7 +479,7 @@ TIntermTyped &sh::CoerceSimple(const TType &toType, > case TBasicType::EbtUInt: > { > TIntermSequence *argsSequence = new TIntermSequence(); >- for (int i = 0; i < fromType.getNominalSize(); i++) >+ for (uint8_t i = 0; i < fromType.getNominalSize(); i++) > { > TIntermTyped &fromTypeSwizzle = SubVector(fromNode, i, i + 1); > TIntermAggregate *boolConstructor = TIntermAggregate::CreateConstructor( >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp >index f9bb4e91a455cd513829562b1279126c12bfefa1..25c911e766f32812c80b69b5f9b3d95b3f8f521a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/EmitMetal.cpp >@@ -961,11 +961,12 @@ void GenMetalTraverser::emitType(const TType &type, const EmitTypeConfig &etConf > > if (type.isVector()) > { >- mOut << type.getNominalSize(); >+ mOut << static_cast<uint32_t>(type.getNominalSize()); > } > else if (type.isMatrix()) > { >- mOut << type.getCols() << "x" << type.getRows(); >+ mOut << static_cast<uint32_t>(type.getCols()) << "x" >+ << static_cast<uint32_t>(type.getRows()); > } > > if (!isUBO) >@@ -1057,7 +1058,8 @@ void GenMetalTraverser::emitFieldDeclaration(const TField &field, > break; > > case TQualifier::EvqFragDepth: >- mOut << " [[depth(any)]]"; >+ mOut << " [[depth(any), function_constant(" << sh::mtl::kDepthWriteEnabledConstName >+ << ")]]"; > break; > > case TQualifier::EvqSampleMask: >@@ -1531,10 +1533,10 @@ bool GenMetalTraverser::visitBinary(Visit, TIntermBinary *binaryNode) > } > else > { >- int maxSize; >+ uint32_t maxSize; > if (leftType.isArray()) > { >- maxSize = static_cast<int>(leftType.getOutermostArraySize()) - 1; >+ maxSize = leftType.getOutermostArraySize() - 1; > } > else > { >@@ -1886,16 +1888,22 @@ GenMetalTraverser::FuncToName GenMetalTraverser::BuildFuncToName() > putAngle("texture1DLod"); > putAngle("texture1DProjLod"); > putAngle("texture2D"); >+ putAngle("texture2DGradEXT"); > putAngle("texture2DLod"); >+ putAngle("texture2DLodEXT"); > putAngle("texture2DProj"); >- putAngle("texture2DRect"); >+ putAngle("texture2DProjGradEXT"); > putAngle("texture2DProjLod"); >+ putAngle("texture2DProjLodEXT"); >+ putAngle("texture2DRect"); > putAngle("texture2DRectProj"); > putAngle("texture3D"); > putAngle("texture3DLod"); > putAngle("texture3DProjLod"); > putAngle("textureCube"); >+ putAngle("textureCubeGradEXT"); > putAngle("textureCubeLod"); >+ putAngle("textureCubeLodEXT"); > putAngle("textureCubeProjLod"); > putAngle("textureGrad"); > putAngle("textureGradOffset"); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..e564c45d4ad3a963d42f4d2d81d27edf63211479 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.cpp >@@ -0,0 +1,73 @@ >+// >+// Copyright 2022 The ANGLE Project Authors. All rights reserved. >+// Use of this source code is governed by a BSD-style license that can be >+// found in the LICENSE file. >+// >+// GuardFragDepthWrite: Guards use of frag depth behind the function constant >+// ANGLEDepthWriteEnabled to ensure it is only used when a valid depth buffer >+// is bound. >+ >+#include "compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.h" >+#include "compiler/translator/TranslatorMetalDirect/AstHelpers.h" >+#include "compiler/translator/tree_util/BuiltIn.h" >+#include "compiler/translator/tree_util/IntermRebuild.h" >+ >+using namespace sh; >+ >+//////////////////////////////////////////////////////////////////////////////// >+ >+namespace >+{ >+ >+class Rewriter : public TIntermRebuild >+{ >+ public: >+ Rewriter(TCompiler &compiler) : TIntermRebuild(compiler, false, true) {} >+ >+ PostResult visitBinaryPost(TIntermBinary &node) override >+ { >+ if (TIntermSymbol *leftSymbolNode = node.getLeft()->getAsSymbolNode()) >+ { >+ if (leftSymbolNode->getType().getQualifier() == TQualifier::EvqFragDepth) >+ { >+ // This transformation leaves the tree in an inconsistent state by using a variable >+ // that's defined in text, outside of the knowledge of the AST. >+ // FIXME(jcunningham): remove once function constants (specconst) are implemented >+ // with the metal translator. >+ mCompiler.disableValidateVariableReferences(); >+ >+ TSymbolTable *symbolTable = &mCompiler.getSymbolTable(); >+ >+ // Create kDepthWriteEnabled variable reference. >+ TType *boolType = new TType(EbtBool); >+ boolType->setQualifier(EvqConst); >+ TVariable *depthWriteEnabledVar = new TVariable( >+ symbolTable, sh::ImmutableString(sh::mtl::kDepthWriteEnabledConstName), >+ boolType, SymbolType::AngleInternal); >+ >+ TIntermBlock *innerif = new TIntermBlock; >+ innerif->appendStatement(&node); >+ >+ TIntermSymbol *depthWriteEnabled = new TIntermSymbol(depthWriteEnabledVar); >+ TIntermIfElse *ifCall = new TIntermIfElse(depthWriteEnabled, innerif, nullptr); >+ return ifCall; >+ } >+ } >+ >+ return node; >+ } >+}; >+ >+} // anonymous namespace >+ >+//////////////////////////////////////////////////////////////////////////////// >+ >+bool sh::GuardFragDepthWrite(TCompiler &compiler, TIntermBlock &root) >+{ >+ Rewriter rewriter(compiler); >+ if (!rewriter.rebuildRoot(root)) >+ { >+ return false; >+ } >+ return true; >+} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.h b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.h >new file mode 100644 >index 0000000000000000000000000000000000000000..5eb2816a92f8781b4fbd9d91793d933606d27484 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/GuardFragDepthWrite.h >@@ -0,0 +1,21 @@ >+// >+// Copyright 2022 The ANGLE Project Authors. All rights reserved. >+// Use of this source code is governed by a BSD-style license that can be >+// found in the LICENSE file. >+// >+ >+#ifndef COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_GUARDFRAGDEPTHWRITE_H_ >+#define COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_GUARDFRAGDEPTHWRITE_H_ >+ >+#include "compiler/translator/Compiler.h" >+#include "compiler/translator/TranslatorMetalDirect/ProgramPrelude.h" >+#include "compiler/translator/TranslatorMetalDirect/SymbolEnv.h" >+ >+namespace sh >+{ >+ >+ANGLE_NO_DISCARD bool GuardFragDepthWrite(TCompiler &compiler, TIntermBlock &root); >+ >+} // namespace sh >+ >+#endif // COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_GUARDFRAGDEPTHWRITE_H_ >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp >index 299a2f9cdcfc479764a023e44a66374f87a98cfb..60758fbe8f45b609799af915943e166d2e697e8c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.cpp >@@ -743,10 +743,10 @@ bool SplitMatrixColumns(ConvertStructState &state, > return false; > } > >- const int cols = type.getCols(); >- TType &rowType = DropColumns(type); >+ const uint8_t cols = type.getCols(); >+ TType &rowType = DropColumns(type); > >- for (int c = 0; c < cols; ++c) >+ for (uint8_t c = 0; c < cols; ++c) > { > state.pushPath(c); > >@@ -775,30 +775,30 @@ bool SaturateMatrixRows(ConvertStructState &state, > { > return false; > } >- const bool isRowMajor = type.getLayoutQualifier().matrixPacking == EmpRowMajor; >- const int rows = type.getRows(); >- const int saturation = state.config.saturateMatrixRows(field); >+ const bool isRowMajor = type.getLayoutQualifier().matrixPacking == EmpRowMajor; >+ const uint8_t rows = type.getRows(); >+ const uint8_t saturation = state.config.saturateMatrixRows(field); > if (saturation <= rows && !isRowMajor) > { > return false; > } > >- const int cols = type.getCols(); >- TType &satType = SetMatrixRowDim(type, saturation); >+ const uint8_t cols = type.getCols(); >+ TType &satType = SetMatrixRowDim(type, saturation); > state.addModifiedField(field, satType, storage, packing, state.symbolEnv.isPointer(field)); > if (state.symbolEnv.isPointer(field)) > { > state.symbolEnv.removePointer(field); > } > >- for (int c = 0; c < cols; ++c) >+ for (uint8_t c = 0; c < cols; ++c) > { >- for (int r = 0; r < rows; ++r) >+ for (uint8_t r = 0; r < rows; ++r) > { > state.addConversion([=](Access::Env &, OriginalAccess &o, ModifiedAccess &m) { >- int firstModifiedIndex = isRowMajor ? r : c; >- int secondModifiedIndex = isRowMajor ? c : r; >- auto &o_ = AccessIndex(AccessIndex(o, c), r); >+ uint8_t firstModifiedIndex = isRowMajor ? r : c; >+ uint8_t secondModifiedIndex = isRowMajor ? c : r; >+ auto &o_ = AccessIndex(AccessIndex(o, c), r); > auto &m_ = AccessIndex(AccessIndex(m, firstModifiedIndex), secondModifiedIndex); > return Access{o_, m_}; > }); >@@ -852,8 +852,8 @@ bool SaturateScalarOrVectorCommon(ConvertStructState &state, > } > const auto saturator = > array ? state.config.saturateScalarOrVectorArrays : state.config.saturateScalarOrVector; >- const int dim = type.getNominalSize(); >- const int saturation = saturator(field); >+ const uint8_t dim = type.getNominalSize(); >+ const uint8_t saturation = saturator(field); > if (saturation <= dim) > { > return false; >@@ -871,7 +871,7 @@ bool SaturateScalarOrVectorCommon(ConvertStructState &state, > state.symbolEnv.removePointer(field); > } > >- for (int d = 0; d < dim; ++d) >+ for (uint8_t d = 0; d < dim; ++d) > { > state.addConversion([=](Access::Env &env, OriginalAccess &o, ModifiedAccess &m) { > auto &o_ = dim > 1 ? AccessIndex(o, d) : o; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.h b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.h >index 8e14bfcc1f02805e8e248798772372494779b035..8dbccd9fae6499649e8b926caa15291915ad5aa2 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ModifyStruct.h >@@ -42,9 +42,9 @@ class ModifyStructConfig > { > // Valid return values are [0, 1, 2, 3, 4]. > // If original dim >= return value, the field remains untouched. >- using Func = int (*)(const TField &); >- static int DontSaturate(const TField &) { return 0; } >- static int FullySaturate(const TField &) { return 4; } >+ using Func = uint8_t (*)(const TField &); >+ static uint8_t DontSaturate(const TField &) { return 0; } >+ static uint8_t FullySaturate(const TField &) { return 4; } > }; > > public: >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp >index 5a7c71451c5697a3fa33c0ed1573b6271d8e627b..46bb7687448b83dcaa6c4e6520f2a989edeffd97 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/Pipeline.cpp >@@ -303,8 +303,8 @@ static bool CompareBy(Compare op, const T &x, const T &y) > } > } > >-template <TBasicType BT, Compare Cmp, int MatchDim, int NewDim> >-static int SaturateVectorOf(const TField &field) >+template <TBasicType BT, Compare Cmp, uint8_t MatchDim, uint8_t NewDim> >+static uint8_t SaturateVectorOf(const TField &field) > { > static_assert(NewDim >= MatchDim, ""); > >@@ -357,20 +357,20 @@ ModifyStructConfig Pipeline::externalStructModifyConfig() const > config.inlineArray = Pred::True; > config.splitMatrixColumns = Pred::True; > config.inlineStruct = Pred::True; >- config.saturateScalarOrVector = [](const TField &field) { >+ config.saturateScalarOrVector = [](const TField &field) -> uint8_t { > if (field.type()->getQualifier() == TQualifier::EvqSampleMask) > { > return 1; > } >- if (int s = SaturateVectorOf<TBasicType::EbtInt, LT, 4, 4>(field)) >+ if (uint8_t s = SaturateVectorOf<TBasicType::EbtInt, LT, 4, 4>(field)) > { > return s; > } >- if (int s = SaturateVectorOf<TBasicType::EbtUInt, LT, 4, 4>(field)) >+ if (uint8_t s = SaturateVectorOf<TBasicType::EbtUInt, LT, 4, 4>(field)) > { > return s; > } >- if (int s = SaturateVectorOf<TBasicType::EbtFloat, LT, 4, 4>(field)) >+ if (uint8_t s = SaturateVectorOf<TBasicType::EbtFloat, LT, 4, 4>(field)) > { > return s; > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp >index d0b9674137fba8d98675448a1a8d9c546854fc08..09417b6a623710cc53e6bd69724d55914a655a1f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/ProgramPrelude.cpp >@@ -30,6 +30,7 @@ class ProgramPrelude : public TIntermTraverser > ProgramPrelude(TInfoSinkBase &out, const ProgramPreludeConfig &ppc) > : TIntermTraverser(true, false, false), mOut(out) > { >+ include_metal_stdlib(); > ALWAYS_INLINE(); > int_clamp(); > if (ppc.hasStructEq) >@@ -103,6 +104,7 @@ class ProgramPrelude : public TIntermTraverser > private: > void ALWAYS_INLINE(); > >+ void include_metal_stdlib(); > void include_metal_atomic(); > void include_metal_common(); > void include_metal_geometric(); >@@ -200,16 +202,22 @@ class ProgramPrelude : public TIntermTraverser > void texture1DProj(); > void texture1DProjLod(); > void texture2D(); >+ void texture2DGradEXT(); > void texture2DLod(); >+ void texture2DLodEXT(); > void texture2DProj(); >+ void texture2DProjGradEXT(); > void texture2DProjLod(); >+ void texture2DProjLodEXT(); > void texture2DRect(); > void texture2DRectProj(); > void texture3DLod(); > void texture3DProj(); > void texture3DProjLod(); > void textureCube(); >+ void textureCubeGradEXT(); > void textureCubeLod(); >+ void textureCubeLodEXT(); > void textureCubeProj(); > void textureCubeProjLod(); > void textureGrad(); >@@ -289,6 +297,7 @@ class ProgramPrelude : public TIntermTraverser > > //////////////////////////////////////////////////////////////////////////////// > >+PROGRAM_PRELUDE_INCLUDE(metal_stdlib) > PROGRAM_PRELUDE_INCLUDE(metal_atomic) > PROGRAM_PRELUDE_INCLUDE(metal_common) > PROGRAM_PRELUDE_INCLUDE(metal_geometric) >@@ -1498,11 +1507,13 @@ PROGRAM_PRELUDE_DECLARE(functionConstants, > #define ANGLE_SAMPLE_COMPARE_LOD_INDEX 1 > #define ANGLE_RASTERIZATION_DISCARD_INDEX 2 > #define ANGLE_COVERAGE_MASK_ENABLED_INDEX 3 >+#define ANGLE_DEPTH_WRITE_ENABLED_INDEX 4 > > constant bool ANGLEUseSampleCompareGradient [[function_constant(ANGLE_SAMPLE_COMPARE_GRADIENT_INDEX)]]; > constant bool ANGLEUseSampleCompareLod [[function_constant(ANGLE_SAMPLE_COMPARE_LOD_INDEX)]]; > constant bool ANGLERasterizerDisabled [[function_constant(ANGLE_RASTERIZATION_DISCARD_INDEX)]]; > constant bool ANGLECoverageMaskEnabled [[function_constant(ANGLE_COVERAGE_MASK_ENABLED_INDEX)]]; >+constant bool ANGLEDepthWriteEnabled [[function_constant(ANGLE_DEPTH_WRITE_ENABLED_INDEX)]]; > )") > > PROGRAM_PRELUDE_DECLARE(texelFetch, >@@ -1881,6 +1892,23 @@ ANGLE_ALWAYS_INLINE auto ANGLE_texture2D_impl( > )", > textureEnv()) > >+PROGRAM_PRELUDE_DECLARE(texture2DGradEXT, >+ R"( >+#define ANGLE_texture2DGradEXT(env, ...) ANGLE_texture2DGradEXT_impl(*env.texture, *env.sampler, __VA_ARGS__) >+ >+template <typename Texture> >+ANGLE_ALWAYS_INLINE auto ANGLE_texture2DGradEXT_impl( >+ thread Texture &texture, >+ thread metal::sampler const &sampler, >+ metal::float2 const coord, >+ metal::float2 const dPdx, >+ metal::float2 const dPdy) >+{ >+ return texture.sample(sampler, coord, metal::gradient2d(dPdx, dPdy)); >+} >+)", >+ textureEnv()) >+ > PROGRAM_PRELUDE_DECLARE(texture2DRect, > R"( > #define ANGLE_texture2DRect(env, ...) ANGLE_texture2DRect_impl(*env.texture, *env.sampler, __VA_ARGS__) >@@ -1911,6 +1939,12 @@ ANGLE_ALWAYS_INLINE auto ANGLE_texture2DLod_impl( > )", > textureEnv()) > >+PROGRAM_PRELUDE_DECLARE(texture2DLodEXT, >+ R"( >+#define ANGLE_texture2DLodEXT ANGLE_texture2DLod >+)", >+ texture2DLod()) >+ > PROGRAM_PRELUDE_DECLARE(texture2DProj, > R"( > #define ANGLE_texture2DProj(env, ...) ANGLE_texture2DProj_impl(*env.texture, *env.sampler, __VA_ARGS__) >@@ -1937,6 +1971,34 @@ ANGLE_ALWAYS_INLINE auto ANGLE_texture2DProj_impl( > )", > textureEnv()) > >+PROGRAM_PRELUDE_DECLARE(texture2DProjGradEXT, >+ R"( >+#define ANGLE_texture2DProjGradEXT(env, ...) ANGLE_texture2DProjGradEXT_impl(*env.texture, *env.sampler, __VA_ARGS__) >+ >+template <typename Texture> >+ANGLE_ALWAYS_INLINE auto ANGLE_texture2DProjGradEXT_impl( >+ thread Texture &texture, >+ thread metal::sampler const &sampler, >+ metal::float3 const coord, >+ metal::float2 const dPdx, >+ metal::float2 const dPdy) >+{ >+ return texture.sample(sampler, coord.xy/coord.z, metal::gradient2d(dPdx, dPdy)); >+} >+ >+template <typename Texture> >+ANGLE_ALWAYS_INLINE auto ANGLE_texture2DProjGradEXT_impl( >+ thread Texture &texture, >+ thread metal::sampler const &sampler, >+ metal::float4 const coord, >+ metal::float2 const dPdx, >+ metal::float2 const dPdy) >+{ >+ return texture.sample(sampler, coord.xy/coord.w, metal::gradient2d(dPdx, dPdy)); >+} >+)", >+ textureEnv()) >+ > PROGRAM_PRELUDE_DECLARE(texture2DRectProj, > R"( > #define ANGLE_texture2DRectProj(env, ...) ANGLE_texture2DRectProj_impl(*env.texture, *env.sampler, __VA_ARGS__) >@@ -1986,6 +2048,12 @@ ANGLE_ALWAYS_INLINE auto ANGLE_texture2DProjLod_impl( > )", > textureEnv()) > >+PROGRAM_PRELUDE_DECLARE(texture2DProjLodEXT, >+ R"( >+#define ANGLE_texture2DProjLodEXT ANGLE_texture2DProjLod >+)", >+ texture2DProjLod()) >+ > PROGRAM_PRELUDE_DECLARE(texture3DLod, > R"( > #define ANGLE_texture3DLod(env, ...) ANGLE_texture3DLod_impl(*env.texture, *env.sampler, __VA_ARGS__) >@@ -2059,6 +2127,23 @@ ANGLE_ALWAYS_INLINE auto ANGLE_textureCube_impl( > )", > textureEnv()) > >+PROGRAM_PRELUDE_DECLARE(textureCubeGradEXT, >+ R"( >+#define ANGLE_textureCubeGradEXT(env, ...) ANGLE_textureCubeGradEXT_impl(*env.texture, *env.sampler, __VA_ARGS__) >+ >+template <typename T> >+ANGLE_ALWAYS_INLINE auto ANGLE_textureCubeGradEXT_impl( >+ thread metal::texturecube<T> &texture, >+ thread metal::sampler const &sampler, >+ metal::float3 const coord, >+ metal::float3 const dPdx, >+ metal::float3 const dPdy) >+{ >+ return texture.sample(sampler, coord, metal::gradientcube(dPdx, dPdy)); >+} >+)", >+ textureEnv()) >+ > PROGRAM_PRELUDE_DECLARE(textureCubeLod, > R"( > #define ANGLE_textureCubeLod(env, ...) ANGLE_textureCubeLod_impl(*env.texture, *env.sampler, __VA_ARGS__) >@@ -2075,6 +2160,12 @@ ANGLE_ALWAYS_INLINE auto ANGLE_textureCubeLod_impl( > )", > textureEnv()) > >+PROGRAM_PRELUDE_DECLARE(textureCubeLodEXT, >+ R"( >+#define ANGLE_textureCubeLodEXT ANGLE_textureCubeLod >+)", >+ textureCubeLod()) >+ > PROGRAM_PRELUDE_DECLARE(textureCubeProj, > R"( > #define ANGLE_textureCubeProj(env, ...) ANGLE_textureCubeProj_impl(*env.texture, *env.sampler, __VA_ARGS__) >@@ -3082,7 +3173,7 @@ ProgramPrelude::FuncToEmitter ProgramPrelude::BuildFuncToEmitter() > GetTextureTypeName(func.getParam(0)->getType().getBasicType()).rawName(); > const TType &coord = func.getParam(1)->getType(); > const TBasicType coordBasic = coord.getBasicType(); >- const int coordN = coord.getNominalSize(); >+ const uint8_t coordN = coord.getNominalSize(); > const bool bias = func.getParamCount() >= 3; > if (textureName.beginsWith("metal::depth2d<")) > { >@@ -3158,26 +3249,32 @@ ProgramPrelude::FuncToEmitter ProgramPrelude::BuildFuncToEmitter() > putBuiltIn("texture1DProj", EMIT_METHOD(texture1DProj)); > putBuiltIn("texture1DProjLod", EMIT_METHOD(texture1DProjLod)); > putBuiltIn("texture2D", EMIT_METHOD(texture2D)); >+ putBuiltIn("texture2DGradEXT", EMIT_METHOD(texture2DGradEXT)); > putBuiltIn("texture2DLod", EMIT_METHOD(texture2DLod)); >+ putBuiltIn("texture2DLodEXT", EMIT_METHOD(texture2DLodEXT)); > putBuiltIn("texture2DProj", EMIT_METHOD(texture2DProj)); >+ putBuiltIn("texture2DProjGradEXT", EMIT_METHOD(texture2DProjGradEXT)); >+ putBuiltIn("texture2DProjLod", EMIT_METHOD(texture2DProjLod)); >+ putBuiltIn("texture2DProjLodEXT", EMIT_METHOD(texture2DProjLodEXT)); > putBuiltIn("texture2DRect", EMIT_METHOD(texture2DRect)); > putBuiltIn("texture2DRectProj", EMIT_METHOD(texture2DRectProj)); > putBuiltIn("texture3DLod", EMIT_METHOD(texture3DLod)); > putBuiltIn("texture3DProj", EMIT_METHOD(texture3DProj)); > putBuiltIn("texture3DProjLod", EMIT_METHOD(texture3DProjLod)); > putBuiltIn("textureCube", EMIT_METHOD(textureCube)); >+ putBuiltIn("textureCubeGradEXT", EMIT_METHOD(textureCubeGradEXT)); > putBuiltIn("textureCubeLod", EMIT_METHOD(textureCubeLod)); >+ putBuiltIn("textureCubeLodEXT", EMIT_METHOD(textureCubeLodEXT)); > putBuiltIn("textureCubeProj", EMIT_METHOD(textureCubeProj)); > putBuiltIn("textureCubeProjLod", EMIT_METHOD(textureCubeProjLod)); >- putBuiltIn("texture2DProjLod", EMIT_METHOD(texture2DProjLod)); > putBuiltIn("textureGrad", [](ProgramPrelude &pp, const TFunction &func) { > const ImmutableString textureName = > GetTextureTypeName(func.getParam(0)->getType().getBasicType()).rawName(); > const TType &coord = func.getParam(1)->getType(); > const TBasicType coordBasic = coord.getBasicType(); >- const int coordN = coord.getNominalSize(); >+ const uint8_t coordN = coord.getNominalSize(); > const TType &dPdx = func.getParam(2)->getType(); >- const int dPdxN = dPdx.getNominalSize(); >+ const uint8_t dPdxN = dPdx.getNominalSize(); > if (textureName.beginsWith("metal::depth2d<")) > { > if (coordBasic == TBasicType::EbtFloat && coordN == 3 && dPdxN == 2) >@@ -3225,9 +3322,9 @@ ProgramPrelude::FuncToEmitter ProgramPrelude::BuildFuncToEmitter() > GetTextureTypeName(func.getParam(0)->getType().getBasicType()).rawName(); > const TType &coord = func.getParam(1)->getType(); > const TBasicType coordBasic = coord.getBasicType(); >- const int coordN = coord.getNominalSize(); >+ const uint8_t coordN = coord.getNominalSize(); > const TType &dPdx = func.getParam(2)->getType(); >- const int dPdxN = dPdx.getNominalSize(); >+ const uint8_t dPdxN = dPdx.getNominalSize(); > if (textureName.beginsWith("metal::depth2d<")) > { > if (coordBasic == TBasicType::EbtFloat && coordN == 3 && dPdxN == 2) >@@ -3275,7 +3372,7 @@ ProgramPrelude::FuncToEmitter ProgramPrelude::BuildFuncToEmitter() > GetTextureTypeName(func.getParam(0)->getType().getBasicType()).rawName(); > const TType &coord = func.getParam(1)->getType(); > const TBasicType coordBasic = coord.getBasicType(); >- const int coordN = coord.getNominalSize(); >+ const uint8_t coordN = coord.getNominalSize(); > if (textureName.beginsWith("metal::depth2d<")) > { > if (coordBasic == TBasicType::EbtFloat && coordN == 3) >@@ -3312,9 +3409,9 @@ ProgramPrelude::FuncToEmitter ProgramPrelude::BuildFuncToEmitter() > GetTextureTypeName(func.getParam(0)->getType().getBasicType()).rawName(); > const TType &coord = func.getParam(1)->getType(); > const TBasicType coordBasic = coord.getBasicType(); >- const int coordN = coord.getNominalSize(); >+ const uint8_t coordN = coord.getNominalSize(); > const TType &dPdx = func.getParam(2)->getType(); >- const int dPdxN = dPdx.getNominalSize(); >+ const uint8_t dPdxN = dPdx.getNominalSize(); > if (textureName.beginsWith("metal::depth2d<")) > { > if (coordBasic == TBasicType::EbtFloat && coordN == 4 && dPdxN == 2) >@@ -3344,9 +3441,9 @@ ProgramPrelude::FuncToEmitter ProgramPrelude::BuildFuncToEmitter() > GetTextureTypeName(func.getParam(0)->getType().getBasicType()).rawName(); > const TType &coord = func.getParam(1)->getType(); > const TBasicType coordBasic = coord.getBasicType(); >- const int coordN = coord.getNominalSize(); >+ const uint8_t coordN = coord.getNominalSize(); > const TType &dPdx = func.getParam(2)->getType(); >- const int dPdxN = dPdx.getNominalSize(); >+ const uint8_t dPdxN = dPdx.getNominalSize(); > if (textureName.beginsWith("metal::depth2d<")) > { > if (coordBasic == TBasicType::EbtFloat && coordN == 4 && dPdxN == 2) >@@ -3376,7 +3473,7 @@ ProgramPrelude::FuncToEmitter ProgramPrelude::BuildFuncToEmitter() > GetTextureTypeName(func.getParam(0)->getType().getBasicType()).rawName(); > const TType &coord = func.getParam(1)->getType(); > const TBasicType coordBasic = coord.getBasicType(); >- const int coordN = coord.getNominalSize(); >+ const uint8_t coordN = coord.getNominalSize(); > if (textureName.beginsWith("metal::depth2d<")) > { > if (coordBasic == TBasicType::EbtFloat && coordN == 4) >@@ -3856,7 +3953,8 @@ void ProgramPrelude::visitVariable(const Name &name, const TType &type) > } > else > { >- if (name.rawName() == sh::mtl::kRasterizerDiscardEnabledConstName) >+ if (name.rawName() == sh::mtl::kRasterizerDiscardEnabledConstName || >+ name.rawName() == sh::mtl::kDepthWriteEnabledConstName) > { > functionConstants(); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp >index b255727f511afbf2d9712d9664fc205f0e91e918..23b616f38f4c7a5cc4fa0960b639e248d5ab2950 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorMetalDirect/SymbolEnv.cpp >@@ -240,15 +240,15 @@ Name SymbolEnv::TemplateName::fullName(std::string &buffer) const > buffer += type.getBasicString(); > if (type.isVector()) > { >- snprintf(argBuffer, sizeof(argBuffer), "%i", type.getNominalSize()); >+ snprintf(argBuffer, sizeof(argBuffer), "%u", type.getNominalSize()); > buffer += argBuffer; > } > else if (type.isMatrix()) > { >- snprintf(argBuffer, sizeof(argBuffer), "%i", type.getCols()); >+ snprintf(argBuffer, sizeof(argBuffer), "%u", type.getCols()); > buffer += argBuffer; > buffer += "x"; >- snprintf(argBuffer, sizeof(argBuffer), "%i", type.getRows()); >+ snprintf(argBuffer, sizeof(argBuffer), "%u", type.getRows()); > buffer += argBuffer; > } > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp >index 0928850242bc19abe717cacf9a5b21ef36415cc2..d5c224ceb1581d3f3ee02126d920632ff6573b06 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/TranslatorVulkan.cpp >@@ -205,7 +205,7 @@ ANGLE_NO_DISCARD bool RotateAndFlipBuiltinVariable(TCompiler *compiler, > // Create a symbol reference to our new variable that will hold the modified builtin. > TType *type = new TType(builtin->getType()); > type->setQualifier(EvqGlobal); >- type->setPrimarySize(static_cast<unsigned char>(builtin->getType().getNominalSize())); >+ type->setPrimarySize(builtin->getType().getNominalSize()); > TVariable *replacementVar = > new TVariable(symbolTable, flippedVariableName, type, SymbolType::AngleInternal); > DeclareGlobalVariable(root, replacementVar); >@@ -267,7 +267,7 @@ ANGLE_NO_DISCARD bool ReplaceGLDepthRangeWithDriverUniform(TCompiler *compiler, > symbolTable->findBuiltIn(ImmutableString("gl_DepthRange"), 0)); > > // ANGLEUniforms.depthRange >- TIntermBinary *angleEmulatedDepthRangeRef = driverUniforms->getDepthRangeRef(); >+ TIntermTyped *angleEmulatedDepthRangeRef = driverUniforms->getDepthRangeRef(); > > // Use this variable instead of gl_DepthRange everywhere. > return ReplaceVariableWithTyped(compiler, root, depthRangeVar, angleEmulatedDepthRangeRef); >@@ -338,7 +338,7 @@ ANGLE_NO_DISCARD bool AddBresenhamEmulationVS(TCompiler *compiler, > // Do perspective divide (get normalized device coords) > // "vec2 ndc = gl_Position.xy / gl_Position.w" > const TType *vec2Type = StaticType::GetTemporary<EbtFloat, EbpHigh, 2>(); >- TIntermBinary *viewportRef = driverUniforms->getViewportRef(); >+ TIntermTyped *viewportRef = driverUniforms->getViewportRef(); > TIntermSymbol *glPos = new TIntermSymbol(BuiltInVariable::gl_Position()); > TIntermSwizzle *glPosXY = CreateSwizzle(glPos, 0, 1); > TIntermSwizzle *glPosW = CreateSwizzle(glPos->deepCopy(), 3); >@@ -428,10 +428,10 @@ ANGLE_NO_DISCARD bool AddXfbEmulationSupport(TCompiler *compiler, > > // Create references to gl_VertexIndex, gl_InstanceIndex, ANGLEUniforms.xfbVerticesPerInstance > // and ANGLEUniforms.xfbBufferOffsets. >- TIntermSymbol *vertexIndex = new TIntermSymbol(BuiltInVariable::gl_VertexIndex()); >- TIntermSymbol *instanceIndex = new TIntermSymbol(BuiltInVariable::gl_InstanceIndex()); >- TIntermBinary *xfbVerticesPerInstance = driverUniforms->getXfbVerticesPerInstance(); >- TIntermBinary *xfbBufferOffsets = driverUniforms->getXfbBufferOffsets(); >+ TIntermSymbol *vertexIndex = new TIntermSymbol(BuiltInVariable::gl_VertexIndex()); >+ TIntermSymbol *instanceIndex = new TIntermSymbol(BuiltInVariable::gl_InstanceIndex()); >+ TIntermTyped *xfbVerticesPerInstance = driverUniforms->getXfbVerticesPerInstance(); >+ TIntermTyped *xfbBufferOffsets = driverUniforms->getXfbBufferOffsets(); > > // gl_InstanceIndex * ANGLEUniforms.xfbVerticesPerInstance > TIntermBinary *xfbInstanceIndex = >@@ -487,19 +487,9 @@ ANGLE_NO_DISCARD bool AddXfbEmulationSupport(TCompiler *compiler, > > // Create the following logic and add it at the end of main(): > // >- // if (ANGLEUniforms.xfbActiveUnpaused) >- // { >- // ANGLECaptureXfb(); >- // } >+ // ANGLECaptureXfb(); > // > >- // Create a reference ANGLEUniforms.xfbActiveUnpaused >- TIntermBinary *xfbActiveUnpaused = driverUniforms->getXfbActiveUnpaused(); >- >- // ANGLEUniforms.xfbActiveUnpaused != 0 >- TIntermBinary *isXfbActiveUnpaused = >- new TIntermBinary(EOpNotEqual, xfbActiveUnpaused, CreateUIntNode(0)); >- > // Create the function call > TIntermAggregate *captureXfbCall = > TIntermAggregate::CreateFunctionCall(*xfbCaptureFunction, {}); >@@ -515,11 +505,8 @@ ANGLE_NO_DISCARD bool AddXfbEmulationSupport(TCompiler *compiler, > TIntermAggregate::CreateFunctionCall(*getOffsetsFunction, &ivec4Zero); > captureXfbBlock->appendStatement(getOffsetsCall); > >- // Create the if >- TIntermIfElse *captureXfb = new TIntermIfElse(isXfbActiveUnpaused, captureXfbBlock, nullptr); >- > // Run it at the end of the shader. >- if (!RunAtTheEndOfShader(compiler, root, captureXfb, symbolTable)) >+ if (!RunAtTheEndOfShader(compiler, root, captureXfbBlock, symbolTable)) > { > return false; > } >@@ -626,7 +613,7 @@ ANGLE_NO_DISCARD bool InsertFragCoordCorrection(TCompiler *compiler, > flipXY = driverUniforms->getFlipXYRef(); > } > >- TIntermBinary *pivot = specConst->getHalfRenderArea(); >+ TIntermTyped *pivot = specConst->getHalfRenderArea(); > if (!pivot) > { > pivot = driverUniforms->getHalfRenderAreaRef(); >@@ -691,7 +678,7 @@ ANGLE_NO_DISCARD bool AddBresenhamEmulationFS(TCompiler *compiler, > TVariable *anglePosition = AddANGLEPositionVaryingDeclaration(root, symbolTable, EvqVaryingIn); > const TType *vec2Type = StaticType::GetTemporary<EbtFloat, EbpHigh, 2>(); > >- TIntermBinary *viewportRef = driverUniforms->getViewportRef(); >+ TIntermTyped *viewportRef = driverUniforms->getViewportRef(); > > // vec2 p = ((ANGLEPosition * 0.5) + 0.5) * viewport.zw + viewport.xy > TIntermSwizzle *viewportXY = CreateSwizzle(viewportRef->deepCopy(), 0, 1); >@@ -1189,7 +1176,7 @@ bool TranslatorVulkan::translateImpl(TInfoSinkBase &sink, > > if (hasGLSampleMask) > { >- TIntermBinary *numSamples = driverUniforms->getNumSamplesRef(); >+ TIntermTyped *numSamples = driverUniforms->getNumSamplesRef(); > if (!RewriteSampleMask(this, root, &getSymbolTable(), numSamples)) > { > return false; >@@ -1200,7 +1187,7 @@ bool TranslatorVulkan::translateImpl(TInfoSinkBase &sink, > const TVariable *numSamplesVar = > static_cast<const TVariable *>(getSymbolTable().findBuiltIn( > ImmutableString("gl_NumSamples"), getShaderVersion())); >- TIntermBinary *numSamples = driverUniforms->getNumSamplesRef(); >+ TIntermTyped *numSamples = driverUniforms->getNumSamplesRef(); > if (!ReplaceVariableWithTyped(this, root, numSamplesVar, numSamples)) > { > return false; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp >index 1f6e8e0cf48bfcd30c554931a46167a25cf7878a..10f1b194d5c3cb02b8a9ecf383c7ab4909aa599f 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.cpp >@@ -163,11 +163,9 @@ const char *getBasicString(TBasicType t) > // TType implementation. > TType::TType() : TType(EbtVoid, 0, 0) {} > >-TType::TType(TBasicType t, unsigned char ps, unsigned char ss) >- : TType(t, EbpUndefined, EvqGlobal, ps, ss) >-{} >+TType::TType(TBasicType t, uint8_t ps, uint8_t ss) : TType(t, EbpUndefined, EvqGlobal, ps, ss) {} > >-TType::TType(TBasicType t, TPrecision p, TQualifier q, unsigned char ps, unsigned char ss) >+TType::TType(TBasicType t, TPrecision p, TQualifier q, uint8_t ps, uint8_t ss) > : TType(t, p, q, ps, ss, TSpan<const unsigned int>(), nullptr) > {} > >@@ -632,7 +630,7 @@ void TType::setBasicType(TBasicType t) > } > } > >-void TType::setPrimarySize(unsigned char ps) >+void TType::setPrimarySize(uint8_t ps) > { > if (primarySize != ps) > { >@@ -642,7 +640,7 @@ void TType::setPrimarySize(unsigned char ps) > } > } > >-void TType::setSecondarySize(unsigned char ss) >+void TType::setSecondarySize(uint8_t ss) > { > if (secondarySize != ss) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h >index 55a4f71bad7031d3761635a5bbe6163d24b16ea2..e53fbaa28f64316c737bf929d3adaa7fa2cfaf0a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/Types.h >@@ -93,12 +93,8 @@ class TType > public: > POOL_ALLOCATOR_NEW_DELETE > TType(); >- explicit TType(TBasicType t, unsigned char ps = 1, unsigned char ss = 1); >- TType(TBasicType t, >- TPrecision p, >- TQualifier q = EvqTemporary, >- unsigned char ps = 1, >- unsigned char ss = 1); >+ explicit TType(TBasicType t, uint8_t ps = 1, uint8_t ss = 1); >+ TType(TBasicType t, TPrecision p, TQualifier q = EvqTemporary, uint8_t ps = 1, uint8_t ss = 1); > explicit TType(const TPublicType &p); > TType(const TStructure *userDef, bool isStructSpecifier); > TType(const TInterfaceBlock *interfaceBlockIn, >@@ -110,8 +106,8 @@ class TType > constexpr TType(TBasicType t, > TPrecision p, > TQualifier q, >- unsigned char ps, >- unsigned char ss, >+ uint8_t ps, >+ uint8_t ss, > const TSpan<const unsigned int> arraySizes, > const char *mangledName) > : type(t), >@@ -174,20 +170,20 @@ class TType > TLayoutQualifier getLayoutQualifier() const { return layoutQualifier; } > void setLayoutQualifier(TLayoutQualifier lq) { layoutQualifier = lq; } > >- int getNominalSize() const { return primarySize; } >- int getSecondarySize() const { return secondarySize; } >- int getCols() const >+ uint8_t getNominalSize() const { return primarySize; } >+ uint8_t getSecondarySize() const { return secondarySize; } >+ uint8_t getCols() const > { > ASSERT(isMatrix()); > return primarySize; > } >- int getRows() const >+ uint8_t getRows() const > { > ASSERT(isMatrix()); > return secondarySize; > } >- void setPrimarySize(unsigned char ps); >- void setSecondarySize(unsigned char ss); >+ void setPrimarySize(uint8_t ps); >+ void setSecondarySize(uint8_t ss); > > // Full size of single instance of type > size_t getObjectSize() const; >@@ -257,7 +253,7 @@ class TType > > const TStructure *getStruct() const { return mStructure; } > >- static constexpr char GetSizeMangledName(unsigned char primarySize, unsigned char secondarySize) >+ static constexpr char GetSizeMangledName(uint8_t primarySize, uint8_t secondarySize) > { > unsigned int sizeKey = (secondarySize - 1u) * 4u + primarySize - 1u; > if (sizeKey < 10u) >@@ -378,8 +374,8 @@ class TType > > TMemoryQualifier memoryQualifier; > TLayoutQualifier layoutQualifier; >- unsigned char primarySize; // size of vector or cols matrix >- unsigned char secondarySize; // rows of a matrix >+ uint8_t primarySize; // size of vector or cols matrix >+ uint8_t secondarySize; // rows of a matrix > > // Used to make an array type. Outermost array size is stored at the end of the vector. Having 0 > // in this vector means an unsized array. >@@ -412,8 +408,8 @@ class TType > struct TTypeSpecifierNonArray > { > TBasicType type; >- unsigned char primarySize; // size of vector or cols of matrix >- unsigned char secondarySize; // rows of matrix >+ uint8_t primarySize; // size of vector or cols of matrix >+ uint8_t secondarySize; // rows of matrix > const TStructure *userDef; > TSourceLoc line; > >@@ -443,9 +439,9 @@ struct TTypeSpecifierNonArray > isStructSpecifier = aIsStructSpecifier; > } > >- void setAggregate(unsigned char size) { primarySize = size; } >+ void setAggregate(uint8_t size) { primarySize = size; } > >- void setMatrix(unsigned char columns, unsigned char rows) >+ void setMatrix(uint8_t columns, uint8_t rows) > { > ASSERT(columns > 1 && rows > 1 && columns <= 4 && rows <= 4); > primarySize = columns; >@@ -477,8 +473,8 @@ struct TPublicType > TBasicType getBasicType() const { return typeSpecifierNonArray.type; } > void setBasicType(TBasicType basicType) { typeSpecifierNonArray.type = basicType; } > >- unsigned char getPrimarySize() const { return typeSpecifierNonArray.primarySize; } >- unsigned char getSecondarySize() const { return typeSpecifierNonArray.secondarySize; } >+ uint8_t getPrimarySize() const { return typeSpecifierNonArray.primarySize; } >+ uint8_t getSecondarySize() const { return typeSpecifierNonArray.secondarySize; } > > const TStructure *getUserDef() const { return typeSpecifierNonArray.userDef; } > const TSourceLoc &getLine() const { return typeSpecifierNonArray.line; } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp >index 80315f82ba55458efe95d233cc9320048e87a336..f147a642164bae7005687da1b7d05a50354ae3ea 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/UtilsHLSL.cpp >@@ -906,8 +906,8 @@ TString TypeString(const TType &type) > } > else if (type.isMatrix()) > { >- int cols = type.getCols(); >- int rows = type.getRows(); >+ uint8_t cols = type.getCols(); >+ uint8_t rows = type.getRows(); > return "float" + str(cols) + "x" + str(rows); > } > else >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_function_declarations.txt b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_function_declarations.txt >index 7dceeeb739d6a3de938441b921a823f6e736d45b..9cb9e39918ee331a16df8367303a62ace90f4b2d 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_function_declarations.txt >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/builtin_function_declarations.txt >@@ -596,7 +596,7 @@ GROUP BEGIN Texture {"queryFunction": true} > ivec2 textureSize(gsampler2DMS); > DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "hasSideEffects": "true", "essl_extension": "ANGLE_texture_multisample", "suffix": "Ext"} > ivec2 textureSize(gsampler2DMS); >- DEFAULT METADATA {"glsl_level": "GLSL1_5_BUILTINS", "hasSideEffects": "true"} >+ DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "glsl_level": "GLSL1_5_BUILTINS", "hasSideEffects": "true"} > ivec3 textureSize(gsampler2DMSArray); > DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": "true", "essl_extension": "OES_texture_storage_multisample_2d_array", "suffix": "Ext"} > ivec3 textureSize(gsampler2DMSArray); >@@ -631,7 +631,7 @@ GROUP BEGIN Texture {"queryFunction": true} > gvec4 texelFetch(gsampler2DMS, ivec2, int); > DEFAULT METADATA {"essl_level": "ESSL3_BUILTINS", "hasSideEffects": "true", "essl_extension": "ANGLE_texture_multisample", "suffix": "Ext"} > gvec4 texelFetch(gsampler2DMS, ivec2, int); >- DEFAULT METADATA {"glsl_level": "GLSL1_5_BUILTINS", "hasSideEffects": "true"} >+ DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "glsl_level": "GLSL1_5_BUILTINS", "hasSideEffects": "true"} > gvec4 texelFetch(gsampler2DMSArray, ivec3, int); > DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": "true", "essl_extension": "OES_texture_storage_multisample_2d_array", "suffix": "Ext"} > gvec4 texelFetch(gsampler2DMSArray, ivec3, int); >@@ -1104,7 +1104,7 @@ GROUP BEGIN Image {"queryFunction": true} > int imageSamples(readonly writeonly gimage2DMSArray); > > GROUP BEGIN Atomic {"queryFunction": true} >- DEFAULT METADATA {"glsl_level": "GLSL4_2_BUILTINS", "hasSideEffects": "true"} >+ DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "glsl_level": "GLSL4_2_BUILTINS", "hasSideEffects": "true"} > uint imageAtomicAdd(IMAGE_PARAMS, uint); > int imageAtomicAdd(IMAGE_PARAMS, int); > uint imageAtomicMin(IMAGE_PARAMS, uint); >@@ -1119,9 +1119,9 @@ GROUP BEGIN Image {"queryFunction": true} > int imageAtomicXor(IMAGE_PARAMS, int); > uint imageAtomicExchange(IMAGE_PARAMS, uint); > int imageAtomicExchange(IMAGE_PARAMS, int); >- DEFAULT METADATA {"glsl_level": "GLSL4_5_BUILTINS", "hasSideEffects": "true"} >+ DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "glsl_level": "GLSL4_5_BUILTINS", "hasSideEffects": "true"} > int imageAtomicExchange(IMAGE_PARAMS, float); >- DEFAULT METADATA {"glsl_level": "GLSL4_2_BUILTINS", "hasSideEffects": "true"} >+ DEFAULT METADATA {"essl_level": "ESSL3_2_BUILTINS", "glsl_level": "GLSL4_2_BUILTINS", "hasSideEffects": "true"} > uint imageAtomicCompSwap(IMAGE_PARAMS, uint, uint); > int imageAtomicCompSwap(IMAGE_PARAMS, int, int); > DEFAULT METADATA {"essl_level": "ESSL3_1_BUILTINS", "hasSideEffects": "true", "essl_extension": "OES_shader_image_atomic", "suffix": "Ext"} >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp >index 6d3a1e42f6557311ebdd16953627ac7bf781465f..5c45e1fb598d1eb275a9ef07cd524c37f7ee42e0 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ConvertUnsupportedConstructorsToFunctionCalls.cpp >@@ -59,10 +59,10 @@ void AppendVectorFromScalarArgument(const TType &type, > TFunction &function, > TIntermSequence *returnCtorArgs) > { >- const int vectorSize = type.getNominalSize(); >- const TVariable *var = function.getParam(0); >- TIntermSymbol *v = new TIntermSymbol(var); >- for (int i = 0; i < vectorSize; ++i) >+ const uint8_t vectorSize = type.getNominalSize(); >+ const TVariable *var = function.getParam(0); >+ TIntermSymbol *v = new TIntermSymbol(var); >+ for (uint8_t i = 0; i < vectorSize; ++i) > { > returnCtorArgs->push_back(v->deepCopy()); > } >@@ -77,8 +77,8 @@ void AppendValuesFromMultipleArguments(int numValuesNeeded, > { > size_t numParameters = function.getParamCount(); > size_t paramIndex = 0; >- int colIndex = 0; >- int rowIndex = 0; >+ uint8_t colIndex = 0; >+ uint8_t rowIndex = 0; > > for (int i = 0; i < numValuesNeeded && paramIndex < numParameters; ++i) > { >@@ -122,13 +122,13 @@ void AppendMatrixFromScalarArgument(const TType &type, > TFunction &function, > TIntermSequence *returnCtorArgs) > { >- const TVariable *var = function.getParam(0); >- TIntermSymbol *v = new TIntermSymbol(var); >- const int numCols = type.getNominalSize(); >- const int numRows = type.getSecondarySize(); >- for (int col = 0; col < numCols; ++col) >+ const TVariable *var = function.getParam(0); >+ TIntermSymbol *v = new TIntermSymbol(var); >+ const uint8_t numCols = type.getNominalSize(); >+ const uint8_t numRows = type.getSecondarySize(); >+ for (uint8_t col = 0; col < numCols; ++col) > { >- for (int row = 0; row < numRows; ++row) >+ for (uint8_t row = 0; row < numRows; ++row) > { > if (col == row) > { >@@ -149,15 +149,15 @@ void AppendMatrixFromMatrixArgument(const TType &type, > TFunction &function, > TIntermSequence *returnCtorArgs) > { >- const TVariable *var = function.getParam(0); >- TIntermSymbol *v = new TIntermSymbol(var); >- const int dstCols = type.getNominalSize(); >- const int dstRows = type.getSecondarySize(); >- const int srcCols = v->getNominalSize(); >- const int srcRows = v->getSecondarySize(); >- for (int dstCol = 0; dstCol < dstCols; ++dstCol) >+ const TVariable *var = function.getParam(0); >+ TIntermSymbol *v = new TIntermSymbol(var); >+ const uint8_t dstCols = type.getNominalSize(); >+ const uint8_t dstRows = type.getSecondarySize(); >+ const uint8_t srcCols = v->getNominalSize(); >+ const uint8_t srcRows = v->getSecondarySize(); >+ for (uint8_t dstCol = 0; dstCol < dstCols; ++dstCol) > { >- for (int dstRow = 0; dstRow < dstRows; ++dstRow) >+ for (uint8_t dstRow = 0; dstRow < dstRows; ++dstRow) > { > if (dstRow < srcRows && dstCol < srcCols) > { >@@ -252,8 +252,7 @@ class Rebuild : public TIntermRebuild > { > TIntermTyped &arg = *arguments[i]->getAsTyped(); > TType *argType = new TType(arg.getBasicType(), arg.getPrecision(), EvqParamIn, >- static_cast<unsigned char>(arg.getNominalSize()), >- static_cast<unsigned char>(arg.getSecondarySize())); >+ arg.getNominalSize(), arg.getSecondarySize()); > TVariable *var = CreateTempVariable(&mSymbolTable, argType); > function->addParameter(var); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp >index ca00f525a190c49b9212e6bd6305c5de39bf214b..45335044c9407266f0cd09bb3915496a5c0c718c 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/RemoveDynamicIndexing.cpp >@@ -44,7 +44,8 @@ std::string GetIndexFunctionName(const TType &type, bool write) > } > if (type.isMatrix()) > { >- nameSink << "mat" << type.getCols() << "x" << type.getRows(); >+ nameSink << "mat" << static_cast<uint32_t>(type.getCols()) << "x" >+ << static_cast<uint32_t>(type.getRows()); > } > else > { >@@ -65,7 +66,7 @@ std::string GetIndexFunctionName(const TType &type, bool write) > default: > UNREACHABLE(); > } >- nameSink << type.getNominalSize(); >+ nameSink << static_cast<uint32_t>(type.getNominalSize()); > } > return nameSink.str(); > } >@@ -172,7 +173,7 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(const TType &type, > { > ASSERT(!type.isArray()); > >- int numCases = 0; >+ uint8_t numCases = 0; > if (type.isMatrix()) > { > numCases = type.getCols(); >@@ -194,7 +195,7 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(const TType &type, > } > > TIntermBlock *statementList = new TIntermBlock(); >- for (int i = 0; i < numCases; ++i) >+ for (uint8_t i = 0; i < numCases; ++i) > { > TIntermCase *caseNode = new TIntermCase(CreateIntConstantNode(i)); > statementList->getSequence()->push_back(caseNode); >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp >index 195ca5315795f73bf6805510d9373ae4995d0eb2..4eab90e4fab9c5b449f7e32870de8635a0e60fa4 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/ScalarizeVecAndMatConstructorArgs.cpp >@@ -133,7 +133,7 @@ void ScalarizeArgsTraverser::scalarizeArgs(TIntermAggregate *aggregate, > { > if (scalarizeVector) > { >- int repeat = std::min(size, originalArg->getNominalSize()); >+ int repeat = std::min<int>(size, originalArg->getNominalSize()); > size -= repeat; > for (int index = 0; index < repeat; ++index) > { >@@ -154,7 +154,7 @@ void ScalarizeArgsTraverser::scalarizeArgs(TIntermAggregate *aggregate, > if (scalarizeMatrix) > { > int colIndex = 0, rowIndex = 0; >- int repeat = std::min(size, originalArg->getCols() * originalArg->getRows()); >+ int repeat = std::min<int>(size, originalArg->getCols() * originalArg->getRows()); > size -= repeat; > while (repeat > 0) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp >index 466753e6987faa8b7c38793841fba240f0b426a4..49dc11efe2c4a098f95f81ee0467d41fcced295a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/apple/RewriteRowMajorMatrices.cpp >@@ -68,8 +68,8 @@ TType *TransposeMatrixType(const TType *type) > > SetColumnMajor(newType); > >- newType->setPrimarySize(static_cast<unsigned char>(type->getRows())); >- newType->setSecondarySize(static_cast<unsigned char>(type->getCols())); >+ newType->setPrimarySize(type->getRows()); >+ newType->setSecondarySize(type->getCols()); > > return newType; > } >@@ -912,8 +912,8 @@ class RewriteRowMajorMatricesTraverser : public TIntermTraverser > > // Default the secondary indices to include every row. If there's a secondary > // subscript provided, it will override this. >- int rows = previousAncestorType.getRows(); >- for (int r = 0; r < rows; ++r) >+ const uint8_t rows = previousAncestorType.getRows(); >+ for (uint8_t r = 0; r < rows; ++r) > { > secondaryIndices.push_back(CreateIndexNode(r)); > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp >index 001eece6b2b0e022c98ef3f966548a96c48a8561..80f489585865ef090824fad74d18cb7cf7c0ec53 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_ops/vulkan/ReplaceForShaderFramebufferFetch.cpp >@@ -308,7 +308,7 @@ class ReplaceSubpassInputUtils > > TIntermNode *assignSubpassLoad(TIntermTyped *resultVar, > TIntermTyped *inputAttachmentSymbol, >- const int targetVecSize); >+ const uint8_t targetVecSize); > TIntermNode *loadInputAttachmentDataImpl(const size_t arraySize, > const unsigned int inputAttachmentIndex, > const TVariable *loadInputAttachmentDataVar); >@@ -392,7 +392,7 @@ void ReplaceSubpassInputUtils::addInputAttachmentUniform(const unsigned int inpu > > TIntermNode *ReplaceSubpassInputUtils::assignSubpassLoad(TIntermTyped *resultVar, > TIntermTyped *inputAttachmentSymbol, >- const int targetVecSize) >+ const uint8_t targetVecSize) > { > TIntermSequence *subpassArguments = new TIntermSequence(); > subpassArguments->push_back(inputAttachmentSymbol); >@@ -407,7 +407,7 @@ TIntermNode *ReplaceSubpassInputUtils::assignSubpassLoad(TIntermTyped *resultVar > if (targetVecSize < 4) > { > TVector<int> fieldOffsets(targetVecSize); >- for (int i = 0; i < targetVecSize; i++) >+ for (uint8_t i = 0; i < targetVecSize; i++) > { > fieldOffsets[i] = i; > } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h >index f08682dc55502b37078b566e2f63497e615539f3..1ba0ee7708ad37f77864073d1e7b28d7395ffacf 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/BuiltIn_ESSL_autogen.h >@@ -796,2162 +796,3290 @@ class BuiltInId > static constexpr const TSymbolUniqueId textureSizeExt_Sampler2DMS1 = TSymbolUniqueId(3748); > static constexpr const TSymbolUniqueId textureSizeExt_ISampler2DMS1 = TSymbolUniqueId(3749); > static constexpr const TSymbolUniqueId textureSizeExt_USampler2DMS1 = TSymbolUniqueId(3750); >- static constexpr const TSymbolUniqueId textureSizeExt_Sampler2DMSArray1 = TSymbolUniqueId(3751); >+ static constexpr const TSymbolUniqueId textureSize_Sampler2DMSArray1 = TSymbolUniqueId(3751); > static constexpr const TSymbolUniqueId pt00Q = TSymbolUniqueId(3752); >+ static constexpr const TSymbolUniqueId textureSize_ISampler2DMSArray1 = TSymbolUniqueId(3753); >+ static constexpr const TSymbolUniqueId pt00W = TSymbolUniqueId(3754); >+ static constexpr const TSymbolUniqueId textureSize_USampler2DMSArray1 = TSymbolUniqueId(3755); >+ static constexpr const TSymbolUniqueId pt00c = TSymbolUniqueId(3756); >+ static constexpr const TSymbolUniqueId textureSizeExt_Sampler2DMSArray1 = TSymbolUniqueId(3757); > static constexpr const TSymbolUniqueId textureSizeExt_ISampler2DMSArray1 = >- TSymbolUniqueId(3753); >- static constexpr const TSymbolUniqueId pt00W = TSymbolUniqueId(3754); >+ TSymbolUniqueId(3758); > static constexpr const TSymbolUniqueId textureSizeExt_USampler2DMSArray1 = >- TSymbolUniqueId(3755); >- static constexpr const TSymbolUniqueId pt00c = TSymbolUniqueId(3756); >+ TSymbolUniqueId(3759); > static constexpr const TSymbolUniqueId textureSize_SamplerExternalOES1_Int1 = >- TSymbolUniqueId(3757); >+ TSymbolUniqueId(3760); > static constexpr const TSymbolUniqueId textureSize_SamplerExternal2DY2YEXT1_Int1 = >- TSymbolUniqueId(3758); >+ TSymbolUniqueId(3761); > static constexpr const TSymbolUniqueId textureProjLod_Sampler2D1_Float3_Float1 = >- TSymbolUniqueId(3759); >+ TSymbolUniqueId(3762); > static constexpr const TSymbolUniqueId textureProjLod_ISampler2D1_Float3_Float1 = >- TSymbolUniqueId(3760); >+ TSymbolUniqueId(3763); > static constexpr const TSymbolUniqueId textureProjLod_USampler2D1_Float3_Float1 = >- TSymbolUniqueId(3761); >+ TSymbolUniqueId(3764); > static constexpr const TSymbolUniqueId textureProjLod_Sampler2D1_Float4_Float1 = >- TSymbolUniqueId(3762); >+ TSymbolUniqueId(3765); > static constexpr const TSymbolUniqueId textureProjLod_ISampler2D1_Float4_Float1 = >- TSymbolUniqueId(3763); >+ TSymbolUniqueId(3766); > static constexpr const TSymbolUniqueId textureProjLod_USampler2D1_Float4_Float1 = >- TSymbolUniqueId(3764); >+ TSymbolUniqueId(3767); > static constexpr const TSymbolUniqueId textureProjLod_Sampler3D1_Float4_Float1 = >- TSymbolUniqueId(3765); >+ TSymbolUniqueId(3768); > static constexpr const TSymbolUniqueId textureProjLod_ISampler3D1_Float4_Float1 = >- TSymbolUniqueId(3766); >+ TSymbolUniqueId(3769); > static constexpr const TSymbolUniqueId textureProjLod_USampler3D1_Float4_Float1 = >- TSymbolUniqueId(3767); >+ TSymbolUniqueId(3770); > static constexpr const TSymbolUniqueId textureProjLod_Sampler2DShadow1_Float4_Float1 = >- TSymbolUniqueId(3768); >- static constexpr const TSymbolUniqueId texelFetch_Sampler2D1_Int2_Int1 = TSymbolUniqueId(3769); >- static constexpr const TSymbolUniqueId texelFetch_ISampler2D1_Int2_Int1 = TSymbolUniqueId(3770); >- static constexpr const TSymbolUniqueId texelFetch_USampler2D1_Int2_Int1 = TSymbolUniqueId(3771); >- static constexpr const TSymbolUniqueId texelFetch_Sampler3D1_Int3_Int1 = TSymbolUniqueId(3772); >- static constexpr const TSymbolUniqueId texelFetch_ISampler3D1_Int3_Int1 = TSymbolUniqueId(3773); >- static constexpr const TSymbolUniqueId texelFetch_USampler3D1_Int3_Int1 = TSymbolUniqueId(3774); >+ TSymbolUniqueId(3771); >+ static constexpr const TSymbolUniqueId texelFetch_Sampler2D1_Int2_Int1 = TSymbolUniqueId(3772); >+ static constexpr const TSymbolUniqueId texelFetch_ISampler2D1_Int2_Int1 = TSymbolUniqueId(3773); >+ static constexpr const TSymbolUniqueId texelFetch_USampler2D1_Int2_Int1 = TSymbolUniqueId(3774); >+ static constexpr const TSymbolUniqueId texelFetch_Sampler3D1_Int3_Int1 = TSymbolUniqueId(3775); >+ static constexpr const TSymbolUniqueId texelFetch_ISampler3D1_Int3_Int1 = TSymbolUniqueId(3776); >+ static constexpr const TSymbolUniqueId texelFetch_USampler3D1_Int3_Int1 = TSymbolUniqueId(3777); > static constexpr const TSymbolUniqueId texelFetch_Sampler2DArray1_Int3_Int1 = >- TSymbolUniqueId(3775); >+ TSymbolUniqueId(3778); > static constexpr const TSymbolUniqueId texelFetch_ISampler2DArray1_Int3_Int1 = >- TSymbolUniqueId(3776); >+ TSymbolUniqueId(3779); > static constexpr const TSymbolUniqueId texelFetch_USampler2DArray1_Int3_Int1 = >- TSymbolUniqueId(3777); >- static constexpr const TSymbolUniqueId texelFetch_SamplerBuffer1_Int1 = TSymbolUniqueId(3778); >- static constexpr const TSymbolUniqueId texelFetch_ISamplerBuffer1_Int1 = TSymbolUniqueId(3779); >- static constexpr const TSymbolUniqueId texelFetch_USamplerBuffer1_Int1 = TSymbolUniqueId(3780); >+ TSymbolUniqueId(3780); >+ static constexpr const TSymbolUniqueId texelFetch_SamplerBuffer1_Int1 = TSymbolUniqueId(3781); >+ static constexpr const TSymbolUniqueId texelFetch_ISamplerBuffer1_Int1 = TSymbolUniqueId(3782); >+ static constexpr const TSymbolUniqueId texelFetch_USamplerBuffer1_Int1 = TSymbolUniqueId(3783); > static constexpr const TSymbolUniqueId texelFetchExt_SamplerBuffer1_Int1 = >- TSymbolUniqueId(3781); >+ TSymbolUniqueId(3784); > static constexpr const TSymbolUniqueId texelFetchExt_ISamplerBuffer1_Int1 = >- TSymbolUniqueId(3782); >+ TSymbolUniqueId(3785); > static constexpr const TSymbolUniqueId texelFetchExt_USamplerBuffer1_Int1 = >- TSymbolUniqueId(3783); >+ TSymbolUniqueId(3786); > static constexpr const TSymbolUniqueId texelFetch_Sampler2DMS1_Int2_Int1 = >- TSymbolUniqueId(3784); >+ TSymbolUniqueId(3787); > static constexpr const TSymbolUniqueId texelFetch_ISampler2DMS1_Int2_Int1 = >- TSymbolUniqueId(3785); >+ TSymbolUniqueId(3788); > static constexpr const TSymbolUniqueId texelFetch_USampler2DMS1_Int2_Int1 = >- TSymbolUniqueId(3786); >+ TSymbolUniqueId(3789); > static constexpr const TSymbolUniqueId texelFetchExt_Sampler2DMS1_Int2_Int1 = >- TSymbolUniqueId(3787); >+ TSymbolUniqueId(3790); > static constexpr const TSymbolUniqueId texelFetchExt_ISampler2DMS1_Int2_Int1 = >- TSymbolUniqueId(3788); >+ TSymbolUniqueId(3791); > static constexpr const TSymbolUniqueId texelFetchExt_USampler2DMS1_Int2_Int1 = >- TSymbolUniqueId(3789); >+ TSymbolUniqueId(3792); >+ static constexpr const TSymbolUniqueId texelFetch_Sampler2DMSArray1_Int3_Int1 = >+ TSymbolUniqueId(3793); >+ static constexpr const TSymbolUniqueId texelFetch_ISampler2DMSArray1_Int3_Int1 = >+ TSymbolUniqueId(3794); >+ static constexpr const TSymbolUniqueId texelFetch_USampler2DMSArray1_Int3_Int1 = >+ TSymbolUniqueId(3795); > static constexpr const TSymbolUniqueId texelFetchExt_Sampler2DMSArray1_Int3_Int1 = >- TSymbolUniqueId(3790); >+ TSymbolUniqueId(3796); > static constexpr const TSymbolUniqueId texelFetchExt_ISampler2DMSArray1_Int3_Int1 = >- TSymbolUniqueId(3791); >+ TSymbolUniqueId(3797); > static constexpr const TSymbolUniqueId texelFetchExt_USampler2DMSArray1_Int3_Int1 = >- TSymbolUniqueId(3792); >+ TSymbolUniqueId(3798); > static constexpr const TSymbolUniqueId texelFetch_SamplerExternalOES1_Int2_Int1 = >- TSymbolUniqueId(3793); >+ TSymbolUniqueId(3799); > static constexpr const TSymbolUniqueId texelFetch_SamplerExternal2DY2YEXT1_Int2_Int1 = >- TSymbolUniqueId(3794); >+ TSymbolUniqueId(3800); > static constexpr const TSymbolUniqueId textureGrad_Sampler2D1_Float2_Float2_Float2 = >- TSymbolUniqueId(3795); >+ TSymbolUniqueId(3801); > static constexpr const TSymbolUniqueId textureGrad_ISampler2D1_Float2_Float2_Float2 = >- TSymbolUniqueId(3796); >+ TSymbolUniqueId(3802); > static constexpr const TSymbolUniqueId textureGrad_USampler2D1_Float2_Float2_Float2 = >- TSymbolUniqueId(3797); >+ TSymbolUniqueId(3803); > static constexpr const TSymbolUniqueId textureGrad_Sampler3D1_Float3_Float3_Float3 = >- TSymbolUniqueId(3798); >+ TSymbolUniqueId(3804); > static constexpr const TSymbolUniqueId textureGrad_ISampler3D1_Float3_Float3_Float3 = >- TSymbolUniqueId(3799); >+ TSymbolUniqueId(3805); > static constexpr const TSymbolUniqueId textureGrad_USampler3D1_Float3_Float3_Float3 = >- TSymbolUniqueId(3800); >+ TSymbolUniqueId(3806); > static constexpr const TSymbolUniqueId textureGrad_SamplerCube1_Float3_Float3_Float3 = >- TSymbolUniqueId(3801); >+ TSymbolUniqueId(3807); > static constexpr const TSymbolUniqueId textureGrad_ISamplerCube1_Float3_Float3_Float3 = >- TSymbolUniqueId(3802); >+ TSymbolUniqueId(3808); > static constexpr const TSymbolUniqueId textureGrad_USamplerCube1_Float3_Float3_Float3 = >- TSymbolUniqueId(3803); >+ TSymbolUniqueId(3809); > static constexpr const TSymbolUniqueId textureGrad_Sampler2DShadow1_Float3_Float2_Float2 = >- TSymbolUniqueId(3804); >+ TSymbolUniqueId(3810); > static constexpr const TSymbolUniqueId textureGrad_SamplerCubeShadow1_Float4_Float3_Float3 = >- TSymbolUniqueId(3805); >+ TSymbolUniqueId(3811); > static constexpr const TSymbolUniqueId textureGrad_Sampler2DArray1_Float3_Float2_Float2 = >- TSymbolUniqueId(3806); >+ TSymbolUniqueId(3812); > static constexpr const TSymbolUniqueId textureGrad_ISampler2DArray1_Float3_Float2_Float2 = >- TSymbolUniqueId(3807); >+ TSymbolUniqueId(3813); > static constexpr const TSymbolUniqueId textureGrad_USampler2DArray1_Float3_Float2_Float2 = >- TSymbolUniqueId(3808); >+ TSymbolUniqueId(3814); > static constexpr const TSymbolUniqueId textureGrad_Sampler2DArrayShadow1_Float4_Float2_Float2 = >- TSymbolUniqueId(3809); >+ TSymbolUniqueId(3815); > static constexpr const TSymbolUniqueId textureGrad_SamplerCubeArray1_Float4_Float3_Float3 = >- TSymbolUniqueId(3810); >+ TSymbolUniqueId(3816); > static constexpr const TSymbolUniqueId textureGrad_ISamplerCubeArray1_Float4_Float3_Float3 = >- TSymbolUniqueId(3811); >+ TSymbolUniqueId(3817); > static constexpr const TSymbolUniqueId textureGrad_USamplerCubeArray1_Float4_Float3_Float3 = >- TSymbolUniqueId(3812); >+ TSymbolUniqueId(3818); > static constexpr const TSymbolUniqueId textureGradExt_SamplerCubeArray1_Float4_Float3_Float3 = >- TSymbolUniqueId(3813); >+ TSymbolUniqueId(3819); > static constexpr const TSymbolUniqueId textureGradExt_ISamplerCubeArray1_Float4_Float3_Float3 = >- TSymbolUniqueId(3814); >+ TSymbolUniqueId(3820); > static constexpr const TSymbolUniqueId textureGradExt_USamplerCubeArray1_Float4_Float3_Float3 = >- TSymbolUniqueId(3815); >+ TSymbolUniqueId(3821); > static constexpr const TSymbolUniqueId textureProjGrad_Sampler2D1_Float3_Float2_Float2 = >- TSymbolUniqueId(3816); >+ TSymbolUniqueId(3822); > static constexpr const TSymbolUniqueId textureProjGrad_ISampler2D1_Float3_Float2_Float2 = >- TSymbolUniqueId(3817); >+ TSymbolUniqueId(3823); > static constexpr const TSymbolUniqueId textureProjGrad_USampler2D1_Float3_Float2_Float2 = >- TSymbolUniqueId(3818); >+ TSymbolUniqueId(3824); > static constexpr const TSymbolUniqueId textureProjGrad_Sampler2D1_Float4_Float2_Float2 = >- TSymbolUniqueId(3819); >+ TSymbolUniqueId(3825); > static constexpr const TSymbolUniqueId textureProjGrad_ISampler2D1_Float4_Float2_Float2 = >- TSymbolUniqueId(3820); >+ TSymbolUniqueId(3826); > static constexpr const TSymbolUniqueId textureProjGrad_USampler2D1_Float4_Float2_Float2 = >- TSymbolUniqueId(3821); >+ TSymbolUniqueId(3827); > static constexpr const TSymbolUniqueId textureProjGrad_Sampler3D1_Float4_Float3_Float3 = >- TSymbolUniqueId(3822); >+ TSymbolUniqueId(3828); > static constexpr const TSymbolUniqueId textureProjGrad_ISampler3D1_Float4_Float3_Float3 = >- TSymbolUniqueId(3823); >+ TSymbolUniqueId(3829); > static constexpr const TSymbolUniqueId textureProjGrad_USampler3D1_Float4_Float3_Float3 = >- TSymbolUniqueId(3824); >+ TSymbolUniqueId(3830); > static constexpr const TSymbolUniqueId textureProjGrad_Sampler2DShadow1_Float4_Float2_Float2 = >- TSymbolUniqueId(3825); >- static constexpr const TSymbolUniqueId texture_Sampler2D1_Float2_Float1 = TSymbolUniqueId(3826); >+ TSymbolUniqueId(3831); >+ static constexpr const TSymbolUniqueId texture_Sampler2D1_Float2_Float1 = TSymbolUniqueId(3832); > static constexpr const TSymbolUniqueId texture_ISampler2D1_Float2_Float1 = >- TSymbolUniqueId(3827); >+ TSymbolUniqueId(3833); > static constexpr const TSymbolUniqueId texture_USampler2D1_Float2_Float1 = >- TSymbolUniqueId(3828); >- static constexpr const TSymbolUniqueId texture_Sampler3D1_Float3_Float1 = TSymbolUniqueId(3829); >+ TSymbolUniqueId(3834); >+ static constexpr const TSymbolUniqueId texture_Sampler3D1_Float3_Float1 = TSymbolUniqueId(3835); > static constexpr const TSymbolUniqueId texture_ISampler3D1_Float3_Float1 = >- TSymbolUniqueId(3830); >+ TSymbolUniqueId(3836); > static constexpr const TSymbolUniqueId texture_USampler3D1_Float3_Float1 = >- TSymbolUniqueId(3831); >+ TSymbolUniqueId(3837); > static constexpr const TSymbolUniqueId texture_SamplerCube1_Float3_Float1 = >- TSymbolUniqueId(3832); >+ TSymbolUniqueId(3838); > static constexpr const TSymbolUniqueId texture_ISamplerCube1_Float3_Float1 = >- TSymbolUniqueId(3833); >+ TSymbolUniqueId(3839); > static constexpr const TSymbolUniqueId texture_USamplerCube1_Float3_Float1 = >- TSymbolUniqueId(3834); >+ TSymbolUniqueId(3840); > static constexpr const TSymbolUniqueId texture_Sampler2DArray1_Float3_Float1 = >- TSymbolUniqueId(3835); >+ TSymbolUniqueId(3841); > static constexpr const TSymbolUniqueId texture_ISampler2DArray1_Float3_Float1 = >- TSymbolUniqueId(3836); >+ TSymbolUniqueId(3842); > static constexpr const TSymbolUniqueId texture_USampler2DArray1_Float3_Float1 = >- TSymbolUniqueId(3837); >+ TSymbolUniqueId(3843); > static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float3_Float1 = >- TSymbolUniqueId(3838); >+ TSymbolUniqueId(3844); > static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float3_Float1 = >- TSymbolUniqueId(3839); >+ TSymbolUniqueId(3845); > static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float3_Float1 = >- TSymbolUniqueId(3840); >+ TSymbolUniqueId(3846); > static constexpr const TSymbolUniqueId textureProj_Sampler2D1_Float4_Float1 = >- TSymbolUniqueId(3841); >+ TSymbolUniqueId(3847); > static constexpr const TSymbolUniqueId textureProj_ISampler2D1_Float4_Float1 = >- TSymbolUniqueId(3842); >+ TSymbolUniqueId(3848); > static constexpr const TSymbolUniqueId textureProj_USampler2D1_Float4_Float1 = >- TSymbolUniqueId(3843); >+ TSymbolUniqueId(3849); > static constexpr const TSymbolUniqueId textureProj_Sampler3D1_Float4_Float1 = >- TSymbolUniqueId(3844); >+ TSymbolUniqueId(3850); > static constexpr const TSymbolUniqueId textureProj_ISampler3D1_Float4_Float1 = >- TSymbolUniqueId(3845); >+ TSymbolUniqueId(3851); > static constexpr const TSymbolUniqueId textureProj_USampler3D1_Float4_Float1 = >- TSymbolUniqueId(3846); >+ TSymbolUniqueId(3852); > static constexpr const TSymbolUniqueId texture_Sampler2DShadow1_Float3_Float1 = >- TSymbolUniqueId(3847); >+ TSymbolUniqueId(3853); > static constexpr const TSymbolUniqueId texture_SamplerCubeShadow1_Float4_Float1 = >- TSymbolUniqueId(3848); >+ TSymbolUniqueId(3854); > static constexpr const TSymbolUniqueId textureProj_Sampler2DShadow1_Float4_Float1 = >- TSymbolUniqueId(3849); >+ TSymbolUniqueId(3855); > static constexpr const TSymbolUniqueId texture_SamplerCubeArray1_Float4_Float1 = >- TSymbolUniqueId(3850); >+ TSymbolUniqueId(3856); > static constexpr const TSymbolUniqueId texture_ISamplerCubeArray1_Float4_Float1 = >- TSymbolUniqueId(3851); >+ TSymbolUniqueId(3857); > static constexpr const TSymbolUniqueId texture_USamplerCubeArray1_Float4_Float1 = >- TSymbolUniqueId(3852); >+ TSymbolUniqueId(3858); > static constexpr const TSymbolUniqueId textureExt_SamplerCubeArray1_Float4_Float1 = >- TSymbolUniqueId(3853); >+ TSymbolUniqueId(3859); > static constexpr const TSymbolUniqueId textureExt_ISamplerCubeArray1_Float4_Float1 = >- TSymbolUniqueId(3854); >+ TSymbolUniqueId(3860); > static constexpr const TSymbolUniqueId textureExt_USamplerCubeArray1_Float4_Float1 = >- TSymbolUniqueId(3855); >+ TSymbolUniqueId(3861); > static constexpr const TSymbolUniqueId texture_SamplerExternalOES1_Float2_Float1 = >- TSymbolUniqueId(3856); >+ TSymbolUniqueId(3862); > static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float3_Float1 = >- TSymbolUniqueId(3857); >+ TSymbolUniqueId(3863); > static constexpr const TSymbolUniqueId textureProj_SamplerExternalOES1_Float4_Float1 = >- TSymbolUniqueId(3858); >+ TSymbolUniqueId(3864); > static constexpr const TSymbolUniqueId texture_SamplerExternal2DY2YEXT1_Float2_Float1 = >- TSymbolUniqueId(3859); >+ TSymbolUniqueId(3865); > static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float3_Float1 = >- TSymbolUniqueId(3860); >+ TSymbolUniqueId(3866); > static constexpr const TSymbolUniqueId textureProj_SamplerExternal2DY2YEXT1_Float4_Float1 = >- TSymbolUniqueId(3861); >+ TSymbolUniqueId(3867); > static constexpr const TSymbolUniqueId textureOffset_Sampler2D1_Float2_Int2 = >- TSymbolUniqueId(3862); >+ TSymbolUniqueId(3868); > static constexpr const TSymbolUniqueId textureOffset_ISampler2D1_Float2_Int2 = >- TSymbolUniqueId(3863); >+ TSymbolUniqueId(3869); > static constexpr const TSymbolUniqueId textureOffset_USampler2D1_Float2_Int2 = >- TSymbolUniqueId(3864); >+ TSymbolUniqueId(3870); > static constexpr const TSymbolUniqueId textureOffset_Sampler3D1_Float3_Int3 = >- TSymbolUniqueId(3865); >+ TSymbolUniqueId(3871); > static constexpr const TSymbolUniqueId textureOffset_ISampler3D1_Float3_Int3 = >- TSymbolUniqueId(3866); >+ TSymbolUniqueId(3872); > static constexpr const TSymbolUniqueId textureOffset_USampler3D1_Float3_Int3 = >- TSymbolUniqueId(3867); >+ TSymbolUniqueId(3873); > static constexpr const TSymbolUniqueId textureOffset_Sampler2DShadow1_Float3_Int2 = >- TSymbolUniqueId(3868); >+ TSymbolUniqueId(3874); > static constexpr const TSymbolUniqueId textureOffset_Sampler2DArray1_Float3_Int2 = >- TSymbolUniqueId(3869); >+ TSymbolUniqueId(3875); > static constexpr const TSymbolUniqueId textureOffset_ISampler2DArray1_Float3_Int2 = >- TSymbolUniqueId(3870); >+ TSymbolUniqueId(3876); > static constexpr const TSymbolUniqueId textureOffset_USampler2DArray1_Float3_Int2 = >- TSymbolUniqueId(3871); >+ TSymbolUniqueId(3877); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float3_Int2 = >- TSymbolUniqueId(3872); >+ TSymbolUniqueId(3878); > static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float3_Int2 = >- TSymbolUniqueId(3873); >+ TSymbolUniqueId(3879); > static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float3_Int2 = >- TSymbolUniqueId(3874); >+ TSymbolUniqueId(3880); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float4_Int2 = >- TSymbolUniqueId(3875); >+ TSymbolUniqueId(3881); > static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float4_Int2 = >- TSymbolUniqueId(3876); >+ TSymbolUniqueId(3882); > static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float4_Int2 = >- TSymbolUniqueId(3877); >+ TSymbolUniqueId(3883); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler3D1_Float4_Int3 = >- TSymbolUniqueId(3878); >+ TSymbolUniqueId(3884); > static constexpr const TSymbolUniqueId textureProjOffset_ISampler3D1_Float4_Int3 = >- TSymbolUniqueId(3879); >+ TSymbolUniqueId(3885); > static constexpr const TSymbolUniqueId textureProjOffset_USampler3D1_Float4_Int3 = >- TSymbolUniqueId(3880); >+ TSymbolUniqueId(3886); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler2DShadow1_Float4_Int2 = >- TSymbolUniqueId(3881); >+ TSymbolUniqueId(3887); > static constexpr const TSymbolUniqueId textureLodOffset_Sampler2D1_Float2_Float1_Int2 = >- TSymbolUniqueId(3882); >+ TSymbolUniqueId(3888); > static constexpr const TSymbolUniqueId textureLodOffset_ISampler2D1_Float2_Float1_Int2 = >- TSymbolUniqueId(3883); >+ TSymbolUniqueId(3889); > static constexpr const TSymbolUniqueId textureLodOffset_USampler2D1_Float2_Float1_Int2 = >- TSymbolUniqueId(3884); >+ TSymbolUniqueId(3890); > static constexpr const TSymbolUniqueId textureLodOffset_Sampler3D1_Float3_Float1_Int3 = >- TSymbolUniqueId(3885); >+ TSymbolUniqueId(3891); > static constexpr const TSymbolUniqueId textureLodOffset_ISampler3D1_Float3_Float1_Int3 = >- TSymbolUniqueId(3886); >+ TSymbolUniqueId(3892); > static constexpr const TSymbolUniqueId textureLodOffset_USampler3D1_Float3_Float1_Int3 = >- TSymbolUniqueId(3887); >+ TSymbolUniqueId(3893); > static constexpr const TSymbolUniqueId textureLodOffset_Sampler2DShadow1_Float3_Float1_Int2 = >- TSymbolUniqueId(3888); >+ TSymbolUniqueId(3894); > static constexpr const TSymbolUniqueId textureLodOffset_Sampler2DArray1_Float3_Float1_Int2 = >- TSymbolUniqueId(3889); >+ TSymbolUniqueId(3895); > static constexpr const TSymbolUniqueId textureLodOffset_ISampler2DArray1_Float3_Float1_Int2 = >- TSymbolUniqueId(3890); >+ TSymbolUniqueId(3896); > static constexpr const TSymbolUniqueId textureLodOffset_USampler2DArray1_Float3_Float1_Int2 = >- TSymbolUniqueId(3891); >+ TSymbolUniqueId(3897); > static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler2D1_Float3_Float1_Int2 = >- TSymbolUniqueId(3892); >+ TSymbolUniqueId(3898); > static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler2D1_Float3_Float1_Int2 = >- TSymbolUniqueId(3893); >+ TSymbolUniqueId(3899); > static constexpr const TSymbolUniqueId textureProjLodOffset_USampler2D1_Float3_Float1_Int2 = >- TSymbolUniqueId(3894); >+ TSymbolUniqueId(3900); > static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler2D1_Float4_Float1_Int2 = >- TSymbolUniqueId(3895); >+ TSymbolUniqueId(3901); > static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler2D1_Float4_Float1_Int2 = >- TSymbolUniqueId(3896); >+ TSymbolUniqueId(3902); > static constexpr const TSymbolUniqueId textureProjLodOffset_USampler2D1_Float4_Float1_Int2 = >- TSymbolUniqueId(3897); >+ TSymbolUniqueId(3903); > static constexpr const TSymbolUniqueId textureProjLodOffset_Sampler3D1_Float4_Float1_Int3 = >- TSymbolUniqueId(3898); >+ TSymbolUniqueId(3904); > static constexpr const TSymbolUniqueId textureProjLodOffset_ISampler3D1_Float4_Float1_Int3 = >- TSymbolUniqueId(3899); >+ TSymbolUniqueId(3905); > static constexpr const TSymbolUniqueId textureProjLodOffset_USampler3D1_Float4_Float1_Int3 = >- TSymbolUniqueId(3900); >+ TSymbolUniqueId(3906); > static constexpr const TSymbolUniqueId >- textureProjLodOffset_Sampler2DShadow1_Float4_Float1_Int2 = TSymbolUniqueId(3901); >+ textureProjLodOffset_Sampler2DShadow1_Float4_Float1_Int2 = TSymbolUniqueId(3907); > static constexpr const TSymbolUniqueId texelFetchOffset_Sampler2D1_Int2_Int1_Int2 = >- TSymbolUniqueId(3902); >+ TSymbolUniqueId(3908); > static constexpr const TSymbolUniqueId texelFetchOffset_ISampler2D1_Int2_Int1_Int2 = >- TSymbolUniqueId(3903); >+ TSymbolUniqueId(3909); > static constexpr const TSymbolUniqueId texelFetchOffset_USampler2D1_Int2_Int1_Int2 = >- TSymbolUniqueId(3904); >+ TSymbolUniqueId(3910); > static constexpr const TSymbolUniqueId texelFetchOffset_Sampler3D1_Int3_Int1_Int3 = >- TSymbolUniqueId(3905); >+ TSymbolUniqueId(3911); > static constexpr const TSymbolUniqueId texelFetchOffset_ISampler3D1_Int3_Int1_Int3 = >- TSymbolUniqueId(3906); >+ TSymbolUniqueId(3912); > static constexpr const TSymbolUniqueId texelFetchOffset_USampler3D1_Int3_Int1_Int3 = >- TSymbolUniqueId(3907); >+ TSymbolUniqueId(3913); > static constexpr const TSymbolUniqueId texelFetchOffset_Sampler2DArray1_Int3_Int1_Int2 = >- TSymbolUniqueId(3908); >+ TSymbolUniqueId(3914); > static constexpr const TSymbolUniqueId texelFetchOffset_ISampler2DArray1_Int3_Int1_Int2 = >- TSymbolUniqueId(3909); >+ TSymbolUniqueId(3915); > static constexpr const TSymbolUniqueId texelFetchOffset_USampler2DArray1_Int3_Int1_Int2 = >- TSymbolUniqueId(3910); >+ TSymbolUniqueId(3916); > static constexpr const TSymbolUniqueId textureGradOffset_Sampler2D1_Float2_Float2_Float2_Int2 = >- TSymbolUniqueId(3911); >+ TSymbolUniqueId(3917); > static constexpr const TSymbolUniqueId textureGradOffset_ISampler2D1_Float2_Float2_Float2_Int2 = >- TSymbolUniqueId(3912); >+ TSymbolUniqueId(3918); > static constexpr const TSymbolUniqueId textureGradOffset_USampler2D1_Float2_Float2_Float2_Int2 = >- TSymbolUniqueId(3913); >+ TSymbolUniqueId(3919); > static constexpr const TSymbolUniqueId textureGradOffset_Sampler3D1_Float3_Float3_Float3_Int3 = >- TSymbolUniqueId(3914); >+ TSymbolUniqueId(3920); > static constexpr const TSymbolUniqueId textureGradOffset_ISampler3D1_Float3_Float3_Float3_Int3 = >- TSymbolUniqueId(3915); >+ TSymbolUniqueId(3921); > static constexpr const TSymbolUniqueId textureGradOffset_USampler3D1_Float3_Float3_Float3_Int3 = >- TSymbolUniqueId(3916); >+ TSymbolUniqueId(3922); > static constexpr const TSymbolUniqueId >- textureGradOffset_Sampler2DShadow1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3917); >+ textureGradOffset_Sampler2DShadow1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3923); > static constexpr const TSymbolUniqueId >- textureGradOffset_Sampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3918); >+ textureGradOffset_Sampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3924); > static constexpr const TSymbolUniqueId >- textureGradOffset_ISampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3919); >+ textureGradOffset_ISampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3925); > static constexpr const TSymbolUniqueId >- textureGradOffset_USampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3920); >+ textureGradOffset_USampler2DArray1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3926); > static constexpr const TSymbolUniqueId >- textureGradOffset_Sampler2DArrayShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3921); >+ textureGradOffset_Sampler2DArrayShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3927); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_Sampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3922); >+ textureProjGradOffset_Sampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3928); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_ISampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3923); >+ textureProjGradOffset_ISampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3929); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_USampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3924); >+ textureProjGradOffset_USampler2D1_Float3_Float2_Float2_Int2 = TSymbolUniqueId(3930); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_Sampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3925); >+ textureProjGradOffset_Sampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3931); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_ISampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3926); >+ textureProjGradOffset_ISampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3932); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_USampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3927); >+ textureProjGradOffset_USampler2D1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3933); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_Sampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3928); >+ textureProjGradOffset_Sampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3934); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_ISampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3929); >+ textureProjGradOffset_ISampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3935); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_USampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3930); >+ textureProjGradOffset_USampler3D1_Float4_Float3_Float3_Int3 = TSymbolUniqueId(3936); > static constexpr const TSymbolUniqueId >- textureProjGradOffset_Sampler2DShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3931); >+ textureProjGradOffset_Sampler2DShadow1_Float4_Float2_Float2_Int2 = TSymbolUniqueId(3937); > static constexpr const TSymbolUniqueId textureOffset_Sampler2D1_Float2_Int2_Float1 = >- TSymbolUniqueId(3932); >+ TSymbolUniqueId(3938); > static constexpr const TSymbolUniqueId textureOffset_ISampler2D1_Float2_Int2_Float1 = >- TSymbolUniqueId(3933); >+ TSymbolUniqueId(3939); > static constexpr const TSymbolUniqueId textureOffset_USampler2D1_Float2_Int2_Float1 = >- TSymbolUniqueId(3934); >+ TSymbolUniqueId(3940); > static constexpr const TSymbolUniqueId textureOffset_Sampler3D1_Float3_Int3_Float1 = >- TSymbolUniqueId(3935); >+ TSymbolUniqueId(3941); > static constexpr const TSymbolUniqueId textureOffset_ISampler3D1_Float3_Int3_Float1 = >- TSymbolUniqueId(3936); >+ TSymbolUniqueId(3942); > static constexpr const TSymbolUniqueId textureOffset_USampler3D1_Float3_Int3_Float1 = >- TSymbolUniqueId(3937); >+ TSymbolUniqueId(3943); > static constexpr const TSymbolUniqueId textureOffset_Sampler2DShadow1_Float3_Int2_Float1 = >- TSymbolUniqueId(3938); >+ TSymbolUniqueId(3944); > static constexpr const TSymbolUniqueId textureOffset_Sampler2DArray1_Float3_Int2_Float1 = >- TSymbolUniqueId(3939); >+ TSymbolUniqueId(3945); > static constexpr const TSymbolUniqueId textureOffset_ISampler2DArray1_Float3_Int2_Float1 = >- TSymbolUniqueId(3940); >+ TSymbolUniqueId(3946); > static constexpr const TSymbolUniqueId textureOffset_USampler2DArray1_Float3_Int2_Float1 = >- TSymbolUniqueId(3941); >+ TSymbolUniqueId(3947); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float3_Int2_Float1 = >- TSymbolUniqueId(3942); >+ TSymbolUniqueId(3948); > static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float3_Int2_Float1 = >- TSymbolUniqueId(3943); >+ TSymbolUniqueId(3949); > static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float3_Int2_Float1 = >- TSymbolUniqueId(3944); >+ TSymbolUniqueId(3950); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler2D1_Float4_Int2_Float1 = >- TSymbolUniqueId(3945); >+ TSymbolUniqueId(3951); > static constexpr const TSymbolUniqueId textureProjOffset_ISampler2D1_Float4_Int2_Float1 = >- TSymbolUniqueId(3946); >+ TSymbolUniqueId(3952); > static constexpr const TSymbolUniqueId textureProjOffset_USampler2D1_Float4_Int2_Float1 = >- TSymbolUniqueId(3947); >+ TSymbolUniqueId(3953); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler3D1_Float4_Int3_Float1 = >- TSymbolUniqueId(3948); >+ TSymbolUniqueId(3954); > static constexpr const TSymbolUniqueId textureProjOffset_ISampler3D1_Float4_Int3_Float1 = >- TSymbolUniqueId(3949); >+ TSymbolUniqueId(3955); > static constexpr const TSymbolUniqueId textureProjOffset_USampler3D1_Float4_Int3_Float1 = >- TSymbolUniqueId(3950); >+ TSymbolUniqueId(3956); > static constexpr const TSymbolUniqueId textureProjOffset_Sampler2DShadow1_Float4_Int2_Float1 = >- TSymbolUniqueId(3951); >- static constexpr const TSymbolUniqueId textureGather_Sampler2D1_Float2 = TSymbolUniqueId(3952); >- static constexpr const TSymbolUniqueId textureGather_ISampler2D1_Float2 = TSymbolUniqueId(3953); >- static constexpr const TSymbolUniqueId textureGather_USampler2D1_Float2 = TSymbolUniqueId(3954); >+ TSymbolUniqueId(3957); >+ static constexpr const TSymbolUniqueId textureGather_Sampler2D1_Float2 = TSymbolUniqueId(3958); >+ static constexpr const TSymbolUniqueId textureGather_ISampler2D1_Float2 = TSymbolUniqueId(3959); >+ static constexpr const TSymbolUniqueId textureGather_USampler2D1_Float2 = TSymbolUniqueId(3960); > static constexpr const TSymbolUniqueId textureGather_Sampler2D1_Float2_Int1 = >- TSymbolUniqueId(3955); >+ TSymbolUniqueId(3961); > static constexpr const TSymbolUniqueId textureGather_ISampler2D1_Float2_Int1 = >- TSymbolUniqueId(3956); >+ TSymbolUniqueId(3962); > static constexpr const TSymbolUniqueId textureGather_USampler2D1_Float2_Int1 = >- TSymbolUniqueId(3957); >+ TSymbolUniqueId(3963); > static constexpr const TSymbolUniqueId textureGather_Sampler2DArray1_Float3 = >- TSymbolUniqueId(3958); >+ TSymbolUniqueId(3964); > static constexpr const TSymbolUniqueId textureGather_ISampler2DArray1_Float3 = >- TSymbolUniqueId(3959); >+ TSymbolUniqueId(3965); > static constexpr const TSymbolUniqueId textureGather_USampler2DArray1_Float3 = >- TSymbolUniqueId(3960); >+ TSymbolUniqueId(3966); > static constexpr const TSymbolUniqueId textureGather_Sampler2DArray1_Float3_Int1 = >- TSymbolUniqueId(3961); >+ TSymbolUniqueId(3967); > static constexpr const TSymbolUniqueId textureGather_ISampler2DArray1_Float3_Int1 = >- TSymbolUniqueId(3962); >+ TSymbolUniqueId(3968); > static constexpr const TSymbolUniqueId textureGather_USampler2DArray1_Float3_Int1 = >- TSymbolUniqueId(3963); >+ TSymbolUniqueId(3969); > static constexpr const TSymbolUniqueId textureGather_SamplerCube1_Float3 = >- TSymbolUniqueId(3964); >+ TSymbolUniqueId(3970); > static constexpr const TSymbolUniqueId textureGather_ISamplerCube1_Float3 = >- TSymbolUniqueId(3965); >+ TSymbolUniqueId(3971); > static constexpr const TSymbolUniqueId textureGather_USamplerCube1_Float3 = >- TSymbolUniqueId(3966); >+ TSymbolUniqueId(3972); > static constexpr const TSymbolUniqueId textureGather_SamplerCube1_Float3_Int1 = >- TSymbolUniqueId(3967); >+ TSymbolUniqueId(3973); > static constexpr const TSymbolUniqueId textureGather_ISamplerCube1_Float3_Int1 = >- TSymbolUniqueId(3968); >+ TSymbolUniqueId(3974); > static constexpr const TSymbolUniqueId textureGather_USamplerCube1_Float3_Int1 = >- TSymbolUniqueId(3969); >+ TSymbolUniqueId(3975); > static constexpr const TSymbolUniqueId textureGather_SamplerCubeArray1_Float4 = >- TSymbolUniqueId(3970); >+ TSymbolUniqueId(3976); > static constexpr const TSymbolUniqueId textureGather_ISamplerCubeArray1_Float4 = >- TSymbolUniqueId(3971); >+ TSymbolUniqueId(3977); > static constexpr const TSymbolUniqueId textureGather_USamplerCubeArray1_Float4 = >- TSymbolUniqueId(3972); >+ TSymbolUniqueId(3978); > static constexpr const TSymbolUniqueId textureGather_SamplerCubeArray1_Float4_Int1 = >- TSymbolUniqueId(3973); >+ TSymbolUniqueId(3979); > static constexpr const TSymbolUniqueId textureGather_ISamplerCubeArray1_Float4_Int1 = >- TSymbolUniqueId(3974); >+ TSymbolUniqueId(3980); > static constexpr const TSymbolUniqueId textureGather_USamplerCubeArray1_Float4_Int1 = >- TSymbolUniqueId(3975); >+ TSymbolUniqueId(3981); > static constexpr const TSymbolUniqueId textureGather_SamplerCubeArrayShadow1_Float4_Float1 = >- TSymbolUniqueId(3976); >+ TSymbolUniqueId(3982); > static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArray1_Float4 = >- TSymbolUniqueId(3977); >+ TSymbolUniqueId(3983); > static constexpr const TSymbolUniqueId textureGatherExt_ISamplerCubeArray1_Float4 = >- TSymbolUniqueId(3978); >+ TSymbolUniqueId(3984); > static constexpr const TSymbolUniqueId textureGatherExt_USamplerCubeArray1_Float4 = >- TSymbolUniqueId(3979); >+ TSymbolUniqueId(3985); > static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArray1_Float4_Int1 = >- TSymbolUniqueId(3980); >+ TSymbolUniqueId(3986); > static constexpr const TSymbolUniqueId textureGatherExt_ISamplerCubeArray1_Float4_Int1 = >- TSymbolUniqueId(3981); >+ TSymbolUniqueId(3987); > static constexpr const TSymbolUniqueId textureGatherExt_USamplerCubeArray1_Float4_Int1 = >- TSymbolUniqueId(3982); >+ TSymbolUniqueId(3988); > static constexpr const TSymbolUniqueId textureGatherExt_SamplerCubeArrayShadow1_Float4_Float1 = >- TSymbolUniqueId(3983); >+ TSymbolUniqueId(3989); > static constexpr const TSymbolUniqueId textureGather_Sampler2DShadow1_Float2 = >- TSymbolUniqueId(3984); >+ TSymbolUniqueId(3990); > static constexpr const TSymbolUniqueId textureGather_Sampler2DShadow1_Float2_Float1 = >- TSymbolUniqueId(3985); >+ TSymbolUniqueId(3991); > static constexpr const TSymbolUniqueId textureGather_Sampler2DArrayShadow1_Float3 = >- TSymbolUniqueId(3986); >+ TSymbolUniqueId(3992); > static constexpr const TSymbolUniqueId textureGather_Sampler2DArrayShadow1_Float3_Float1 = >- TSymbolUniqueId(3987); >+ TSymbolUniqueId(3993); > static constexpr const TSymbolUniqueId textureGather_SamplerCubeShadow1_Float3 = >- TSymbolUniqueId(3988); >+ TSymbolUniqueId(3994); > static constexpr const TSymbolUniqueId textureGather_SamplerCubeShadow1_Float3_Float1 = >- TSymbolUniqueId(3989); >+ TSymbolUniqueId(3995); > static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2D1_Float2_Int2 = >- TSymbolUniqueId(3990); >+ TSymbolUniqueId(3996); > static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2D1_Float2_Int2 = >- TSymbolUniqueId(3991); >+ TSymbolUniqueId(3997); > static constexpr const TSymbolUniqueId textureGatherOffset_USampler2D1_Float2_Int2 = >- TSymbolUniqueId(3992); >+ TSymbolUniqueId(3998); > static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DArray1_Float3_Int2 = >- TSymbolUniqueId(3993); >+ TSymbolUniqueId(3999); > static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2DArray1_Float3_Int2 = >- TSymbolUniqueId(3994); >+ TSymbolUniqueId(4000); > static constexpr const TSymbolUniqueId textureGatherOffset_USampler2DArray1_Float3_Int2 = >- TSymbolUniqueId(3995); >+ TSymbolUniqueId(4001); > static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DShadow1_Float2_Float1_Int2 = >- TSymbolUniqueId(3996); >+ TSymbolUniqueId(4002); > static constexpr const TSymbolUniqueId >- textureGatherOffset_Sampler2DArrayShadow1_Float3_Float1_Int2 = TSymbolUniqueId(3997); >+ textureGatherOffset_Sampler2DArrayShadow1_Float3_Float1_Int2 = TSymbolUniqueId(4003); > static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2D1_Float2_Int2_Int1 = >- TSymbolUniqueId(3998); >+ TSymbolUniqueId(4004); > static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2D1_Float2_Int2_Int1 = >- TSymbolUniqueId(3999); >+ TSymbolUniqueId(4005); > static constexpr const TSymbolUniqueId textureGatherOffset_USampler2D1_Float2_Int2_Int1 = >- TSymbolUniqueId(4000); >+ TSymbolUniqueId(4006); > static constexpr const TSymbolUniqueId textureGatherOffset_Sampler2DArray1_Float3_Int2_Int1 = >- TSymbolUniqueId(4001); >+ TSymbolUniqueId(4007); > static constexpr const TSymbolUniqueId textureGatherOffset_ISampler2DArray1_Float3_Int2_Int1 = >- TSymbolUniqueId(4002); >+ TSymbolUniqueId(4008); > static constexpr const TSymbolUniqueId textureGatherOffset_USampler2DArray1_Float3_Int2_Int1 = >- TSymbolUniqueId(4003); >+ TSymbolUniqueId(4009); > static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2D1_Float2_4xInt2 = >- TSymbolUniqueId(4004); >- static constexpr const TSymbolUniqueId pt10Dx4 = TSymbolUniqueId(4005); >+ TSymbolUniqueId(4010); >+ static constexpr const TSymbolUniqueId pt10Dx4 = TSymbolUniqueId(4011); > static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2D1_Float2_4xInt2 = >- TSymbolUniqueId(4006); >+ TSymbolUniqueId(4012); > static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2D1_Float2_4xInt2 = >- TSymbolUniqueId(4007); >+ TSymbolUniqueId(4013); > static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2DArray1_Float3_4xInt2 = >- TSymbolUniqueId(4008); >+ TSymbolUniqueId(4014); > static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2DArray1_Float3_4xInt2 = >- TSymbolUniqueId(4009); >+ TSymbolUniqueId(4015); > static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2DArray1_Float3_4xInt2 = >- TSymbolUniqueId(4010); >+ TSymbolUniqueId(4016); > static constexpr const TSymbolUniqueId >- textureGatherOffsets_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4011); >+ textureGatherOffsets_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4017); > static constexpr const TSymbolUniqueId >- textureGatherOffsets_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4012); >+ textureGatherOffsets_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4018); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2D1_Float2_4xInt2 = >- TSymbolUniqueId(4013); >+ TSymbolUniqueId(4019); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2D1_Float2_4xInt2 = >- TSymbolUniqueId(4014); >+ TSymbolUniqueId(4020); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2D1_Float2_4xInt2 = >- TSymbolUniqueId(4015); >+ TSymbolUniqueId(4021); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2DArray1_Float3_4xInt2 = >- TSymbolUniqueId(4016); >+ TSymbolUniqueId(4022); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2DArray1_Float3_4xInt2 = >- TSymbolUniqueId(4017); >+ TSymbolUniqueId(4023); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2DArray1_Float3_4xInt2 = >- TSymbolUniqueId(4018); >+ TSymbolUniqueId(4024); > static constexpr const TSymbolUniqueId >- textureGatherOffsetsExt_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4019); >+ textureGatherOffsetsExt_Sampler2DShadow1_Float2_Float1_4xInt2 = TSymbolUniqueId(4025); > static constexpr const TSymbolUniqueId >- textureGatherOffsetsExt_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4020); >+ textureGatherOffsetsExt_Sampler2DArrayShadow1_Float3_Float1_4xInt2 = TSymbolUniqueId(4026); > static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2D1_Float2_4xInt2_Int1 = >- TSymbolUniqueId(4021); >+ TSymbolUniqueId(4027); > static constexpr const TSymbolUniqueId textureGatherOffsets_ISampler2D1_Float2_4xInt2_Int1 = >- TSymbolUniqueId(4022); >+ TSymbolUniqueId(4028); > static constexpr const TSymbolUniqueId textureGatherOffsets_USampler2D1_Float2_4xInt2_Int1 = >- TSymbolUniqueId(4023); >+ TSymbolUniqueId(4029); > static constexpr const TSymbolUniqueId textureGatherOffsets_Sampler2DArray1_Float3_4xInt2_Int1 = >- TSymbolUniqueId(4024); >+ TSymbolUniqueId(4030); > static constexpr const TSymbolUniqueId >- textureGatherOffsets_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4025); >+ textureGatherOffsets_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4031); > static constexpr const TSymbolUniqueId >- textureGatherOffsets_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4026); >+ textureGatherOffsets_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4032); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_Sampler2D1_Float2_4xInt2_Int1 = >- TSymbolUniqueId(4027); >+ TSymbolUniqueId(4033); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_ISampler2D1_Float2_4xInt2_Int1 = >- TSymbolUniqueId(4028); >+ TSymbolUniqueId(4034); > static constexpr const TSymbolUniqueId textureGatherOffsetsExt_USampler2D1_Float2_4xInt2_Int1 = >- TSymbolUniqueId(4029); >+ TSymbolUniqueId(4035); > static constexpr const TSymbolUniqueId >- textureGatherOffsetsExt_Sampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4030); >+ textureGatherOffsetsExt_Sampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4036); > static constexpr const TSymbolUniqueId >- textureGatherOffsetsExt_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4031); >+ textureGatherOffsetsExt_ISampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4037); > static constexpr const TSymbolUniqueId >- textureGatherOffsetsExt_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4032); >+ textureGatherOffsetsExt_USampler2DArray1_Float3_4xInt2_Int1 = TSymbolUniqueId(4038); > static constexpr const TSymbolUniqueId rgb_2_yuv_Float3_YuvCscStandardEXT1 = >- TSymbolUniqueId(4033); >- static constexpr const TSymbolUniqueId pt00H = TSymbolUniqueId(4034); >+ TSymbolUniqueId(4039); >+ static constexpr const TSymbolUniqueId pt00H = TSymbolUniqueId(4040); > static constexpr const TSymbolUniqueId yuv_2_rgb_Float3_YuvCscStandardEXT1 = >- TSymbolUniqueId(4035); >- static constexpr const TSymbolUniqueId dFdxExt_Float1 = TSymbolUniqueId(4036); >- static constexpr const TSymbolUniqueId dFdxExt_Float2 = TSymbolUniqueId(4037); >- static constexpr const TSymbolUniqueId dFdxExt_Float3 = TSymbolUniqueId(4038); >- static constexpr const TSymbolUniqueId dFdxExt_Float4 = TSymbolUniqueId(4039); >- static constexpr const TSymbolUniqueId dFdyExt_Float1 = TSymbolUniqueId(4040); >- static constexpr const TSymbolUniqueId dFdyExt_Float2 = TSymbolUniqueId(4041); >- static constexpr const TSymbolUniqueId dFdyExt_Float3 = TSymbolUniqueId(4042); >- static constexpr const TSymbolUniqueId dFdyExt_Float4 = TSymbolUniqueId(4043); >- static constexpr const TSymbolUniqueId fwidthExt_Float1 = TSymbolUniqueId(4044); >- static constexpr const TSymbolUniqueId fwidthExt_Float2 = TSymbolUniqueId(4045); >- static constexpr const TSymbolUniqueId fwidthExt_Float3 = TSymbolUniqueId(4046); >- static constexpr const TSymbolUniqueId fwidthExt_Float4 = TSymbolUniqueId(4047); >- static constexpr const TSymbolUniqueId dFdx_Float1 = TSymbolUniqueId(4048); >- static constexpr const TSymbolUniqueId dFdx_Float2 = TSymbolUniqueId(4049); >- static constexpr const TSymbolUniqueId dFdx_Float3 = TSymbolUniqueId(4050); >- static constexpr const TSymbolUniqueId dFdx_Float4 = TSymbolUniqueId(4051); >- static constexpr const TSymbolUniqueId dFdy_Float1 = TSymbolUniqueId(4052); >- static constexpr const TSymbolUniqueId dFdy_Float2 = TSymbolUniqueId(4053); >- static constexpr const TSymbolUniqueId dFdy_Float3 = TSymbolUniqueId(4054); >- static constexpr const TSymbolUniqueId dFdy_Float4 = TSymbolUniqueId(4055); >- static constexpr const TSymbolUniqueId fwidth_Float1 = TSymbolUniqueId(4056); >- static constexpr const TSymbolUniqueId fwidth_Float2 = TSymbolUniqueId(4057); >- static constexpr const TSymbolUniqueId fwidth_Float3 = TSymbolUniqueId(4058); >- static constexpr const TSymbolUniqueId fwidth_Float4 = TSymbolUniqueId(4059); >- static constexpr const TSymbolUniqueId interpolateAtCentroid_Float1 = TSymbolUniqueId(4060); >- static constexpr const TSymbolUniqueId interpolateAtCentroid_Float2 = TSymbolUniqueId(4061); >- static constexpr const TSymbolUniqueId interpolateAtCentroid_Float3 = TSymbolUniqueId(4062); >- static constexpr const TSymbolUniqueId interpolateAtCentroid_Float4 = TSymbolUniqueId(4063); >- static constexpr const TSymbolUniqueId interpolateAtSample_Float1_Int1 = TSymbolUniqueId(4064); >- static constexpr const TSymbolUniqueId interpolateAtSample_Float2_Int1 = TSymbolUniqueId(4065); >- static constexpr const TSymbolUniqueId interpolateAtSample_Float3_Int1 = TSymbolUniqueId(4066); >- static constexpr const TSymbolUniqueId interpolateAtSample_Float4_Int1 = TSymbolUniqueId(4067); >+ TSymbolUniqueId(4041); >+ static constexpr const TSymbolUniqueId dFdxExt_Float1 = TSymbolUniqueId(4042); >+ static constexpr const TSymbolUniqueId dFdxExt_Float2 = TSymbolUniqueId(4043); >+ static constexpr const TSymbolUniqueId dFdxExt_Float3 = TSymbolUniqueId(4044); >+ static constexpr const TSymbolUniqueId dFdxExt_Float4 = TSymbolUniqueId(4045); >+ static constexpr const TSymbolUniqueId dFdyExt_Float1 = TSymbolUniqueId(4046); >+ static constexpr const TSymbolUniqueId dFdyExt_Float2 = TSymbolUniqueId(4047); >+ static constexpr const TSymbolUniqueId dFdyExt_Float3 = TSymbolUniqueId(4048); >+ static constexpr const TSymbolUniqueId dFdyExt_Float4 = TSymbolUniqueId(4049); >+ static constexpr const TSymbolUniqueId fwidthExt_Float1 = TSymbolUniqueId(4050); >+ static constexpr const TSymbolUniqueId fwidthExt_Float2 = TSymbolUniqueId(4051); >+ static constexpr const TSymbolUniqueId fwidthExt_Float3 = TSymbolUniqueId(4052); >+ static constexpr const TSymbolUniqueId fwidthExt_Float4 = TSymbolUniqueId(4053); >+ static constexpr const TSymbolUniqueId dFdx_Float1 = TSymbolUniqueId(4054); >+ static constexpr const TSymbolUniqueId dFdx_Float2 = TSymbolUniqueId(4055); >+ static constexpr const TSymbolUniqueId dFdx_Float3 = TSymbolUniqueId(4056); >+ static constexpr const TSymbolUniqueId dFdx_Float4 = TSymbolUniqueId(4057); >+ static constexpr const TSymbolUniqueId dFdy_Float1 = TSymbolUniqueId(4058); >+ static constexpr const TSymbolUniqueId dFdy_Float2 = TSymbolUniqueId(4059); >+ static constexpr const TSymbolUniqueId dFdy_Float3 = TSymbolUniqueId(4060); >+ static constexpr const TSymbolUniqueId dFdy_Float4 = TSymbolUniqueId(4061); >+ static constexpr const TSymbolUniqueId fwidth_Float1 = TSymbolUniqueId(4062); >+ static constexpr const TSymbolUniqueId fwidth_Float2 = TSymbolUniqueId(4063); >+ static constexpr const TSymbolUniqueId fwidth_Float3 = TSymbolUniqueId(4064); >+ static constexpr const TSymbolUniqueId fwidth_Float4 = TSymbolUniqueId(4065); >+ static constexpr const TSymbolUniqueId interpolateAtCentroid_Float1 = TSymbolUniqueId(4066); >+ static constexpr const TSymbolUniqueId interpolateAtCentroid_Float2 = TSymbolUniqueId(4067); >+ static constexpr const TSymbolUniqueId interpolateAtCentroid_Float3 = TSymbolUniqueId(4068); >+ static constexpr const TSymbolUniqueId interpolateAtCentroid_Float4 = TSymbolUniqueId(4069); >+ static constexpr const TSymbolUniqueId interpolateAtSample_Float1_Int1 = TSymbolUniqueId(4070); >+ static constexpr const TSymbolUniqueId interpolateAtSample_Float2_Int1 = TSymbolUniqueId(4071); >+ static constexpr const TSymbolUniqueId interpolateAtSample_Float3_Int1 = TSymbolUniqueId(4072); >+ static constexpr const TSymbolUniqueId interpolateAtSample_Float4_Int1 = TSymbolUniqueId(4073); > static constexpr const TSymbolUniqueId interpolateAtOffset_Float1_Float2 = >- TSymbolUniqueId(4068); >+ TSymbolUniqueId(4074); > static constexpr const TSymbolUniqueId interpolateAtOffset_Float2_Float2 = >- TSymbolUniqueId(4069); >+ TSymbolUniqueId(4075); > static constexpr const TSymbolUniqueId interpolateAtOffset_Float3_Float2 = >- TSymbolUniqueId(4070); >+ TSymbolUniqueId(4076); > static constexpr const TSymbolUniqueId interpolateAtOffset_Float4_Float2 = >- TSymbolUniqueId(4071); >- static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float1 = TSymbolUniqueId(4072); >- static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float2 = TSymbolUniqueId(4073); >- static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float3 = TSymbolUniqueId(4074); >- static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float4 = TSymbolUniqueId(4075); >+ TSymbolUniqueId(4077); >+ static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float1 = TSymbolUniqueId(4078); >+ static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float2 = TSymbolUniqueId(4079); >+ static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float3 = TSymbolUniqueId(4080); >+ static constexpr const TSymbolUniqueId interpolateAtCentroidExt_Float4 = TSymbolUniqueId(4081); > static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float1_Int1 = >- TSymbolUniqueId(4076); >+ TSymbolUniqueId(4082); > static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float2_Int1 = >- TSymbolUniqueId(4077); >+ TSymbolUniqueId(4083); > static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float3_Int1 = >- TSymbolUniqueId(4078); >+ TSymbolUniqueId(4084); > static constexpr const TSymbolUniqueId interpolateAtSampleExt_Float4_Int1 = >- TSymbolUniqueId(4079); >+ TSymbolUniqueId(4085); > static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float1_Float2 = >- TSymbolUniqueId(4080); >+ TSymbolUniqueId(4086); > static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float2_Float2 = >- TSymbolUniqueId(4081); >+ TSymbolUniqueId(4087); > static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float3_Float2 = >- TSymbolUniqueId(4082); >+ TSymbolUniqueId(4088); > static constexpr const TSymbolUniqueId interpolateAtOffsetExt_Float4_Float2 = >- TSymbolUniqueId(4083); >- static constexpr const TSymbolUniqueId atomicCounter_AtomicCounter1 = TSymbolUniqueId(4084); >- static constexpr const TSymbolUniqueId pt00G = TSymbolUniqueId(4085); >+ TSymbolUniqueId(4089); >+ static constexpr const TSymbolUniqueId atomicCounter_AtomicCounter1 = TSymbolUniqueId(4090); >+ static constexpr const TSymbolUniqueId pt00G = TSymbolUniqueId(4091); > static constexpr const TSymbolUniqueId atomicCounterIncrement_AtomicCounter1 = >- TSymbolUniqueId(4086); >+ TSymbolUniqueId(4092); > static constexpr const TSymbolUniqueId atomicCounterDecrement_AtomicCounter1 = >- TSymbolUniqueId(4087); >- static constexpr const TSymbolUniqueId atomicAdd_UInt1_UInt1 = TSymbolUniqueId(4088); >- static constexpr const TSymbolUniqueId pt_io_00E = TSymbolUniqueId(4089); >- static constexpr const TSymbolUniqueId atomicAdd_Int1_Int1 = TSymbolUniqueId(4090); >- static constexpr const TSymbolUniqueId pt_io_00D = TSymbolUniqueId(4091); >- static constexpr const TSymbolUniqueId atomicMin_UInt1_UInt1 = TSymbolUniqueId(4092); >- static constexpr const TSymbolUniqueId atomicMin_Int1_Int1 = TSymbolUniqueId(4093); >- static constexpr const TSymbolUniqueId atomicMax_UInt1_UInt1 = TSymbolUniqueId(4094); >- static constexpr const TSymbolUniqueId atomicMax_Int1_Int1 = TSymbolUniqueId(4095); >- static constexpr const TSymbolUniqueId atomicAnd_UInt1_UInt1 = TSymbolUniqueId(4096); >- static constexpr const TSymbolUniqueId atomicAnd_Int1_Int1 = TSymbolUniqueId(4097); >- static constexpr const TSymbolUniqueId atomicOr_UInt1_UInt1 = TSymbolUniqueId(4098); >- static constexpr const TSymbolUniqueId atomicOr_Int1_Int1 = TSymbolUniqueId(4099); >- static constexpr const TSymbolUniqueId atomicXor_UInt1_UInt1 = TSymbolUniqueId(4100); >- static constexpr const TSymbolUniqueId atomicXor_Int1_Int1 = TSymbolUniqueId(4101); >- static constexpr const TSymbolUniqueId atomicExchange_UInt1_UInt1 = TSymbolUniqueId(4102); >- static constexpr const TSymbolUniqueId atomicExchange_Int1_Int1 = TSymbolUniqueId(4103); >- static constexpr const TSymbolUniqueId atomicCompSwap_UInt1_UInt1_UInt1 = TSymbolUniqueId(4104); >- static constexpr const TSymbolUniqueId atomicCompSwap_Int1_Int1_Int1 = TSymbolUniqueId(4105); >- static constexpr const TSymbolUniqueId imageSize_Image2D1 = TSymbolUniqueId(4106); >- static constexpr const TSymbolUniqueId pt00z = TSymbolUniqueId(4107); >- static constexpr const TSymbolUniqueId imageSize_IImage2D1 = TSymbolUniqueId(4108); >- static constexpr const TSymbolUniqueId pt01K = TSymbolUniqueId(4109); >- static constexpr const TSymbolUniqueId imageSize_UImage2D1 = TSymbolUniqueId(4110); >- static constexpr const TSymbolUniqueId pt01V = TSymbolUniqueId(4111); >- static constexpr const TSymbolUniqueId imageSize_Image3D1 = TSymbolUniqueId(4112); >- static constexpr const TSymbolUniqueId pt01A = TSymbolUniqueId(4113); >- static constexpr const TSymbolUniqueId imageSize_IImage3D1 = TSymbolUniqueId(4114); >- static constexpr const TSymbolUniqueId pt01L = TSymbolUniqueId(4115); >- static constexpr const TSymbolUniqueId imageSize_UImage3D1 = TSymbolUniqueId(4116); >- static constexpr const TSymbolUniqueId pt01W = TSymbolUniqueId(4117); >- static constexpr const TSymbolUniqueId imageSize_Image2DArray1 = TSymbolUniqueId(4118); >- static constexpr const TSymbolUniqueId pt01B = TSymbolUniqueId(4119); >- static constexpr const TSymbolUniqueId imageSize_IImage2DArray1 = TSymbolUniqueId(4120); >- static constexpr const TSymbolUniqueId pt01M = TSymbolUniqueId(4121); >- static constexpr const TSymbolUniqueId imageSize_UImage2DArray1 = TSymbolUniqueId(4122); >- static constexpr const TSymbolUniqueId pt01X = TSymbolUniqueId(4123); >- static constexpr const TSymbolUniqueId imageSize_ImageCube1 = TSymbolUniqueId(4124); >- static constexpr const TSymbolUniqueId pt01C = TSymbolUniqueId(4125); >- static constexpr const TSymbolUniqueId imageSize_IImageCube1 = TSymbolUniqueId(4126); >- static constexpr const TSymbolUniqueId pt01N = TSymbolUniqueId(4127); >- static constexpr const TSymbolUniqueId imageSize_UImageCube1 = TSymbolUniqueId(4128); >- static constexpr const TSymbolUniqueId pt01Y = TSymbolUniqueId(4129); >- static constexpr const TSymbolUniqueId imageSize_ImageCubeArray1 = TSymbolUniqueId(4130); >- static constexpr const TSymbolUniqueId pt01H = TSymbolUniqueId(4131); >- static constexpr const TSymbolUniqueId imageSize_IImageCubeArray1 = TSymbolUniqueId(4132); >- static constexpr const TSymbolUniqueId pt01S = TSymbolUniqueId(4133); >- static constexpr const TSymbolUniqueId imageSize_UImageCubeArray1 = TSymbolUniqueId(4134); >- static constexpr const TSymbolUniqueId pt01d = TSymbolUniqueId(4135); >- static constexpr const TSymbolUniqueId imageSizeExt_ImageCubeArray1 = TSymbolUniqueId(4136); >- static constexpr const TSymbolUniqueId imageSizeExt_IImageCubeArray1 = TSymbolUniqueId(4137); >- static constexpr const TSymbolUniqueId imageSizeExt_UImageCubeArray1 = TSymbolUniqueId(4138); >- static constexpr const TSymbolUniqueId imageSize_ImageBuffer1 = TSymbolUniqueId(4139); >- static constexpr const TSymbolUniqueId pt01J = TSymbolUniqueId(4140); >- static constexpr const TSymbolUniqueId imageSize_IImageBuffer1 = TSymbolUniqueId(4141); >- static constexpr const TSymbolUniqueId pt01U = TSymbolUniqueId(4142); >- static constexpr const TSymbolUniqueId imageSize_UImageBuffer1 = TSymbolUniqueId(4143); >- static constexpr const TSymbolUniqueId pt01f = TSymbolUniqueId(4144); >- static constexpr const TSymbolUniqueId imageSizeExt_ImageBuffer1 = TSymbolUniqueId(4145); >- static constexpr const TSymbolUniqueId imageSizeExt_IImageBuffer1 = TSymbolUniqueId(4146); >- static constexpr const TSymbolUniqueId imageSizeExt_UImageBuffer1 = TSymbolUniqueId(4147); >- static constexpr const TSymbolUniqueId imageStore_Image2D1_Int2_Float4 = TSymbolUniqueId(4148); >- static constexpr const TSymbolUniqueId imageStore_IImage2D1_Int2_Int4 = TSymbolUniqueId(4149); >- static constexpr const TSymbolUniqueId imageStore_UImage2D1_Int2_UInt4 = TSymbolUniqueId(4150); >- static constexpr const TSymbolUniqueId imageStore_Image3D1_Int3_Float4 = TSymbolUniqueId(4151); >- static constexpr const TSymbolUniqueId imageStore_IImage3D1_Int3_Int4 = TSymbolUniqueId(4152); >- static constexpr const TSymbolUniqueId imageStore_UImage3D1_Int3_UInt4 = TSymbolUniqueId(4153); >+ TSymbolUniqueId(4093); >+ static constexpr const TSymbolUniqueId atomicAdd_UInt1_UInt1 = TSymbolUniqueId(4094); >+ static constexpr const TSymbolUniqueId pt_io_00E = TSymbolUniqueId(4095); >+ static constexpr const TSymbolUniqueId atomicAdd_Int1_Int1 = TSymbolUniqueId(4096); >+ static constexpr const TSymbolUniqueId pt_io_00D = TSymbolUniqueId(4097); >+ static constexpr const TSymbolUniqueId atomicMin_UInt1_UInt1 = TSymbolUniqueId(4098); >+ static constexpr const TSymbolUniqueId atomicMin_Int1_Int1 = TSymbolUniqueId(4099); >+ static constexpr const TSymbolUniqueId atomicMax_UInt1_UInt1 = TSymbolUniqueId(4100); >+ static constexpr const TSymbolUniqueId atomicMax_Int1_Int1 = TSymbolUniqueId(4101); >+ static constexpr const TSymbolUniqueId atomicAnd_UInt1_UInt1 = TSymbolUniqueId(4102); >+ static constexpr const TSymbolUniqueId atomicAnd_Int1_Int1 = TSymbolUniqueId(4103); >+ static constexpr const TSymbolUniqueId atomicOr_UInt1_UInt1 = TSymbolUniqueId(4104); >+ static constexpr const TSymbolUniqueId atomicOr_Int1_Int1 = TSymbolUniqueId(4105); >+ static constexpr const TSymbolUniqueId atomicXor_UInt1_UInt1 = TSymbolUniqueId(4106); >+ static constexpr const TSymbolUniqueId atomicXor_Int1_Int1 = TSymbolUniqueId(4107); >+ static constexpr const TSymbolUniqueId atomicExchange_UInt1_UInt1 = TSymbolUniqueId(4108); >+ static constexpr const TSymbolUniqueId atomicExchange_Int1_Int1 = TSymbolUniqueId(4109); >+ static constexpr const TSymbolUniqueId atomicCompSwap_UInt1_UInt1_UInt1 = TSymbolUniqueId(4110); >+ static constexpr const TSymbolUniqueId atomicCompSwap_Int1_Int1_Int1 = TSymbolUniqueId(4111); >+ static constexpr const TSymbolUniqueId imageSize_Image2D1 = TSymbolUniqueId(4112); >+ static constexpr const TSymbolUniqueId pt00z = TSymbolUniqueId(4113); >+ static constexpr const TSymbolUniqueId imageSize_IImage2D1 = TSymbolUniqueId(4114); >+ static constexpr const TSymbolUniqueId pt01K = TSymbolUniqueId(4115); >+ static constexpr const TSymbolUniqueId imageSize_UImage2D1 = TSymbolUniqueId(4116); >+ static constexpr const TSymbolUniqueId pt01V = TSymbolUniqueId(4117); >+ static constexpr const TSymbolUniqueId imageSize_Image3D1 = TSymbolUniqueId(4118); >+ static constexpr const TSymbolUniqueId pt01A = TSymbolUniqueId(4119); >+ static constexpr const TSymbolUniqueId imageSize_IImage3D1 = TSymbolUniqueId(4120); >+ static constexpr const TSymbolUniqueId pt01L = TSymbolUniqueId(4121); >+ static constexpr const TSymbolUniqueId imageSize_UImage3D1 = TSymbolUniqueId(4122); >+ static constexpr const TSymbolUniqueId pt01W = TSymbolUniqueId(4123); >+ static constexpr const TSymbolUniqueId imageSize_Image2DArray1 = TSymbolUniqueId(4124); >+ static constexpr const TSymbolUniqueId pt01B = TSymbolUniqueId(4125); >+ static constexpr const TSymbolUniqueId imageSize_IImage2DArray1 = TSymbolUniqueId(4126); >+ static constexpr const TSymbolUniqueId pt01M = TSymbolUniqueId(4127); >+ static constexpr const TSymbolUniqueId imageSize_UImage2DArray1 = TSymbolUniqueId(4128); >+ static constexpr const TSymbolUniqueId pt01X = TSymbolUniqueId(4129); >+ static constexpr const TSymbolUniqueId imageSize_ImageCube1 = TSymbolUniqueId(4130); >+ static constexpr const TSymbolUniqueId pt01C = TSymbolUniqueId(4131); >+ static constexpr const TSymbolUniqueId imageSize_IImageCube1 = TSymbolUniqueId(4132); >+ static constexpr const TSymbolUniqueId pt01N = TSymbolUniqueId(4133); >+ static constexpr const TSymbolUniqueId imageSize_UImageCube1 = TSymbolUniqueId(4134); >+ static constexpr const TSymbolUniqueId pt01Y = TSymbolUniqueId(4135); >+ static constexpr const TSymbolUniqueId imageSize_ImageCubeArray1 = TSymbolUniqueId(4136); >+ static constexpr const TSymbolUniqueId pt01H = TSymbolUniqueId(4137); >+ static constexpr const TSymbolUniqueId imageSize_IImageCubeArray1 = TSymbolUniqueId(4138); >+ static constexpr const TSymbolUniqueId pt01S = TSymbolUniqueId(4139); >+ static constexpr const TSymbolUniqueId imageSize_UImageCubeArray1 = TSymbolUniqueId(4140); >+ static constexpr const TSymbolUniqueId pt01d = TSymbolUniqueId(4141); >+ static constexpr const TSymbolUniqueId imageSizeExt_ImageCubeArray1 = TSymbolUniqueId(4142); >+ static constexpr const TSymbolUniqueId imageSizeExt_IImageCubeArray1 = TSymbolUniqueId(4143); >+ static constexpr const TSymbolUniqueId imageSizeExt_UImageCubeArray1 = TSymbolUniqueId(4144); >+ static constexpr const TSymbolUniqueId imageSize_ImageBuffer1 = TSymbolUniqueId(4145); >+ static constexpr const TSymbolUniqueId pt01J = TSymbolUniqueId(4146); >+ static constexpr const TSymbolUniqueId imageSize_IImageBuffer1 = TSymbolUniqueId(4147); >+ static constexpr const TSymbolUniqueId pt01U = TSymbolUniqueId(4148); >+ static constexpr const TSymbolUniqueId imageSize_UImageBuffer1 = TSymbolUniqueId(4149); >+ static constexpr const TSymbolUniqueId pt01f = TSymbolUniqueId(4150); >+ static constexpr const TSymbolUniqueId imageSizeExt_ImageBuffer1 = TSymbolUniqueId(4151); >+ static constexpr const TSymbolUniqueId imageSizeExt_IImageBuffer1 = TSymbolUniqueId(4152); >+ static constexpr const TSymbolUniqueId imageSizeExt_UImageBuffer1 = TSymbolUniqueId(4153); >+ static constexpr const TSymbolUniqueId imageStore_Image2D1_Int2_Float4 = TSymbolUniqueId(4154); >+ static constexpr const TSymbolUniqueId imageStore_IImage2D1_Int2_Int4 = TSymbolUniqueId(4155); >+ static constexpr const TSymbolUniqueId imageStore_UImage2D1_Int2_UInt4 = TSymbolUniqueId(4156); >+ static constexpr const TSymbolUniqueId imageStore_Image3D1_Int3_Float4 = TSymbolUniqueId(4157); >+ static constexpr const TSymbolUniqueId imageStore_IImage3D1_Int3_Int4 = TSymbolUniqueId(4158); >+ static constexpr const TSymbolUniqueId imageStore_UImage3D1_Int3_UInt4 = TSymbolUniqueId(4159); > static constexpr const TSymbolUniqueId imageStore_Image2DArray1_Int3_Float4 = >- TSymbolUniqueId(4154); >+ TSymbolUniqueId(4160); > static constexpr const TSymbolUniqueId imageStore_IImage2DArray1_Int3_Int4 = >- TSymbolUniqueId(4155); >+ TSymbolUniqueId(4161); > static constexpr const TSymbolUniqueId imageStore_UImage2DArray1_Int3_UInt4 = >- TSymbolUniqueId(4156); >+ TSymbolUniqueId(4162); > static constexpr const TSymbolUniqueId imageStore_ImageCube1_Int3_Float4 = >- TSymbolUniqueId(4157); >- static constexpr const TSymbolUniqueId imageStore_IImageCube1_Int3_Int4 = TSymbolUniqueId(4158); >+ TSymbolUniqueId(4163); >+ static constexpr const TSymbolUniqueId imageStore_IImageCube1_Int3_Int4 = TSymbolUniqueId(4164); > static constexpr const TSymbolUniqueId imageStore_UImageCube1_Int3_UInt4 = >- TSymbolUniqueId(4159); >+ TSymbolUniqueId(4165); > static constexpr const TSymbolUniqueId imageStore_ImageCubeArray1_Int3_Float4 = >- TSymbolUniqueId(4160); >+ TSymbolUniqueId(4166); > static constexpr const TSymbolUniqueId imageStore_IImageCubeArray1_Int3_Int4 = >- TSymbolUniqueId(4161); >+ TSymbolUniqueId(4167); > static constexpr const TSymbolUniqueId imageStore_UImageCubeArray1_Int3_UInt4 = >- TSymbolUniqueId(4162); >+ TSymbolUniqueId(4168); > static constexpr const TSymbolUniqueId imageStoreExt_ImageCubeArray1_Int3_Float4 = >- TSymbolUniqueId(4163); >+ TSymbolUniqueId(4169); > static constexpr const TSymbolUniqueId imageStoreExt_IImageCubeArray1_Int3_Int4 = >- TSymbolUniqueId(4164); >+ TSymbolUniqueId(4170); > static constexpr const TSymbolUniqueId imageStoreExt_UImageCubeArray1_Int3_UInt4 = >- TSymbolUniqueId(4165); >+ TSymbolUniqueId(4171); > static constexpr const TSymbolUniqueId imageStore_ImageBuffer1_Int1_Float4 = >- TSymbolUniqueId(4166); >+ TSymbolUniqueId(4172); > static constexpr const TSymbolUniqueId imageStore_IImageBuffer1_Int1_Int4 = >- TSymbolUniqueId(4167); >+ TSymbolUniqueId(4173); > static constexpr const TSymbolUniqueId imageStore_UImageBuffer1_Int1_UInt4 = >- TSymbolUniqueId(4168); >+ TSymbolUniqueId(4174); > static constexpr const TSymbolUniqueId imageStoreExt_ImageBuffer1_Int1_Float4 = >- TSymbolUniqueId(4169); >+ TSymbolUniqueId(4175); > static constexpr const TSymbolUniqueId imageStoreExt_IImageBuffer1_Int1_Int4 = >- TSymbolUniqueId(4170); >+ TSymbolUniqueId(4176); > static constexpr const TSymbolUniqueId imageStoreExt_UImageBuffer1_Int1_UInt4 = >- TSymbolUniqueId(4171); >- static constexpr const TSymbolUniqueId imageLoad_Image2D1_Int2 = TSymbolUniqueId(4172); >- static constexpr const TSymbolUniqueId imageLoad_IImage2D1_Int2 = TSymbolUniqueId(4173); >- static constexpr const TSymbolUniqueId imageLoad_UImage2D1_Int2 = TSymbolUniqueId(4174); >- static constexpr const TSymbolUniqueId imageLoad_Image3D1_Int3 = TSymbolUniqueId(4175); >- static constexpr const TSymbolUniqueId imageLoad_IImage3D1_Int3 = TSymbolUniqueId(4176); >- static constexpr const TSymbolUniqueId imageLoad_UImage3D1_Int3 = TSymbolUniqueId(4177); >- static constexpr const TSymbolUniqueId imageLoad_Image2DArray1_Int3 = TSymbolUniqueId(4178); >- static constexpr const TSymbolUniqueId imageLoad_IImage2DArray1_Int3 = TSymbolUniqueId(4179); >- static constexpr const TSymbolUniqueId imageLoad_UImage2DArray1_Int3 = TSymbolUniqueId(4180); >- static constexpr const TSymbolUniqueId imageLoad_ImageCube1_Int3 = TSymbolUniqueId(4181); >- static constexpr const TSymbolUniqueId imageLoad_IImageCube1_Int3 = TSymbolUniqueId(4182); >- static constexpr const TSymbolUniqueId imageLoad_UImageCube1_Int3 = TSymbolUniqueId(4183); >- static constexpr const TSymbolUniqueId imageLoad_ImageCubeArray1_Int3 = TSymbolUniqueId(4184); >- static constexpr const TSymbolUniqueId imageLoad_IImageCubeArray1_Int3 = TSymbolUniqueId(4185); >- static constexpr const TSymbolUniqueId imageLoad_UImageCubeArray1_Int3 = TSymbolUniqueId(4186); >+ TSymbolUniqueId(4177); >+ static constexpr const TSymbolUniqueId imageLoad_Image2D1_Int2 = TSymbolUniqueId(4178); >+ static constexpr const TSymbolUniqueId imageLoad_IImage2D1_Int2 = TSymbolUniqueId(4179); >+ static constexpr const TSymbolUniqueId imageLoad_UImage2D1_Int2 = TSymbolUniqueId(4180); >+ static constexpr const TSymbolUniqueId imageLoad_Image3D1_Int3 = TSymbolUniqueId(4181); >+ static constexpr const TSymbolUniqueId imageLoad_IImage3D1_Int3 = TSymbolUniqueId(4182); >+ static constexpr const TSymbolUniqueId imageLoad_UImage3D1_Int3 = TSymbolUniqueId(4183); >+ static constexpr const TSymbolUniqueId imageLoad_Image2DArray1_Int3 = TSymbolUniqueId(4184); >+ static constexpr const TSymbolUniqueId imageLoad_IImage2DArray1_Int3 = TSymbolUniqueId(4185); >+ static constexpr const TSymbolUniqueId imageLoad_UImage2DArray1_Int3 = TSymbolUniqueId(4186); >+ static constexpr const TSymbolUniqueId imageLoad_ImageCube1_Int3 = TSymbolUniqueId(4187); >+ static constexpr const TSymbolUniqueId imageLoad_IImageCube1_Int3 = TSymbolUniqueId(4188); >+ static constexpr const TSymbolUniqueId imageLoad_UImageCube1_Int3 = TSymbolUniqueId(4189); >+ static constexpr const TSymbolUniqueId imageLoad_ImageCubeArray1_Int3 = TSymbolUniqueId(4190); >+ static constexpr const TSymbolUniqueId imageLoad_IImageCubeArray1_Int3 = TSymbolUniqueId(4191); >+ static constexpr const TSymbolUniqueId imageLoad_UImageCubeArray1_Int3 = TSymbolUniqueId(4192); > static constexpr const TSymbolUniqueId imageLoadExt_ImageCubeArray1_Int3 = >- TSymbolUniqueId(4187); >+ TSymbolUniqueId(4193); > static constexpr const TSymbolUniqueId imageLoadExt_IImageCubeArray1_Int3 = >- TSymbolUniqueId(4188); >+ TSymbolUniqueId(4194); > static constexpr const TSymbolUniqueId imageLoadExt_UImageCubeArray1_Int3 = >- TSymbolUniqueId(4189); >- static constexpr const TSymbolUniqueId imageLoad_ImageBuffer1_Int1 = TSymbolUniqueId(4190); >- static constexpr const TSymbolUniqueId imageLoad_IImageBuffer1_Int1 = TSymbolUniqueId(4191); >- static constexpr const TSymbolUniqueId imageLoad_UImageBuffer1_Int1 = TSymbolUniqueId(4192); >- static constexpr const TSymbolUniqueId imageLoadExt_ImageBuffer1_Int1 = TSymbolUniqueId(4193); >- static constexpr const TSymbolUniqueId imageLoadExt_IImageBuffer1_Int1 = TSymbolUniqueId(4194); >- static constexpr const TSymbolUniqueId imageLoadExt_UImageBuffer1_Int1 = TSymbolUniqueId(4195); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2D1_Int2_UInt1 = >- TSymbolUniqueId(4196); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4197); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4198); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_UInt1 = >- TSymbolUniqueId(4199); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4200); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4201); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4195); >+ static constexpr const TSymbolUniqueId imageLoad_ImageBuffer1_Int1 = TSymbolUniqueId(4196); >+ static constexpr const TSymbolUniqueId imageLoad_IImageBuffer1_Int1 = TSymbolUniqueId(4197); >+ static constexpr const TSymbolUniqueId imageLoad_UImageBuffer1_Int1 = TSymbolUniqueId(4198); >+ static constexpr const TSymbolUniqueId imageLoadExt_ImageBuffer1_Int1 = TSymbolUniqueId(4199); >+ static constexpr const TSymbolUniqueId imageLoadExt_IImageBuffer1_Int1 = TSymbolUniqueId(4200); >+ static constexpr const TSymbolUniqueId imageLoadExt_UImageBuffer1_Int1 = TSymbolUniqueId(4201); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2D1_Int2_UInt1 = > TSymbolUniqueId(4202); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2D1_Int2_UInt1 = > TSymbolUniqueId(4203); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2D1_Int2_UInt1 = > TSymbolUniqueId(4204); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image3D1_Int3_UInt1 = > TSymbolUniqueId(4205); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage3D1_Int3_UInt1 = > TSymbolUniqueId(4206); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage3D1_Int3_UInt1 = > TSymbolUniqueId(4207); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageCube1_Int3_UInt1 = > TSymbolUniqueId(4208); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageCube1_Int3_UInt1 = > TSymbolUniqueId(4209); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageCube1_Int3_UInt1 = > TSymbolUniqueId(4210); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCubeArray1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageBuffer1_Int1_UInt1 = > TSymbolUniqueId(4211); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCubeArray1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageBuffer1_Int1_UInt1 = > TSymbolUniqueId(4212); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCubeArray1_Int3_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageBuffer1_Int1_UInt1 = > TSymbolUniqueId(4213); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1D1_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2DArray1_Int3_UInt1 = > TSymbolUniqueId(4214); >- static constexpr const TSymbolUniqueId pt01D = TSymbolUniqueId(4215); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1D1_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4215); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2DArray1_Int3_UInt1 = > TSymbolUniqueId(4216); >- static constexpr const TSymbolUniqueId pt01O = TSymbolUniqueId(4217); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1D1_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4217); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageCubeArray1_Int3_UInt1 = > TSymbolUniqueId(4218); >- static constexpr const TSymbolUniqueId pt01Z = TSymbolUniqueId(4219); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1DArray1_Int2_UInt1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4219); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image1D1_Int1_UInt1 = > TSymbolUniqueId(4220); >- static constexpr const TSymbolUniqueId pt01E = TSymbolUniqueId(4221); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1DArray1_Int2_UInt1 = >+ static constexpr const TSymbolUniqueId pt01D = TSymbolUniqueId(4221); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage1D1_Int1_UInt1 = > TSymbolUniqueId(4222); >- static constexpr const TSymbolUniqueId pt01P = TSymbolUniqueId(4223); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1DArray1_Int2_UInt1 = >+ static constexpr const TSymbolUniqueId pt01O = TSymbolUniqueId(4223); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage1D1_Int1_UInt1 = > TSymbolUniqueId(4224); >- static constexpr const TSymbolUniqueId pt01a = TSymbolUniqueId(4225); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageRect1_Int2_UInt1 = >+ static constexpr const TSymbolUniqueId pt01Z = TSymbolUniqueId(4225); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image1DArray1_Int2_UInt1 = > TSymbolUniqueId(4226); >- static constexpr const TSymbolUniqueId pt01I = TSymbolUniqueId(4227); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageRect1_Int2_UInt1 = >+ static constexpr const TSymbolUniqueId pt01E = TSymbolUniqueId(4227); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage1DArray1_Int2_UInt1 = > TSymbolUniqueId(4228); >- static constexpr const TSymbolUniqueId pt01T = TSymbolUniqueId(4229); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageRect1_Int2_UInt1 = >+ static constexpr const TSymbolUniqueId pt01P = TSymbolUniqueId(4229); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage1DArray1_Int2_UInt1 = > TSymbolUniqueId(4230); >- static constexpr const TSymbolUniqueId pt01e = TSymbolUniqueId(4231); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMS1_Int2_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId pt01a = TSymbolUniqueId(4231); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageRect1_Int2_UInt1 = > TSymbolUniqueId(4232); >- static constexpr const TSymbolUniqueId pt01F = TSymbolUniqueId(4233); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMS1_Int2_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId pt01I = TSymbolUniqueId(4233); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageRect1_Int2_UInt1 = > TSymbolUniqueId(4234); >- static constexpr const TSymbolUniqueId pt01Q = TSymbolUniqueId(4235); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMS1_Int2_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId pt01T = TSymbolUniqueId(4235); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageRect1_Int2_UInt1 = > TSymbolUniqueId(4236); >- static constexpr const TSymbolUniqueId pt01b = TSymbolUniqueId(4237); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMSArray1_Int3_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId pt01e = TSymbolUniqueId(4237); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2DMS1_Int2_Int1_UInt1 = > TSymbolUniqueId(4238); >- static constexpr const TSymbolUniqueId pt01G = TSymbolUniqueId(4239); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMSArray1_Int3_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId pt01F = TSymbolUniqueId(4239); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2DMS1_Int2_Int1_UInt1 = > TSymbolUniqueId(4240); >- static constexpr const TSymbolUniqueId pt01R = TSymbolUniqueId(4241); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMSArray1_Int3_Int1_UInt1 = >+ static constexpr const TSymbolUniqueId pt01Q = TSymbolUniqueId(4241); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2DMS1_Int2_Int1_UInt1 = > TSymbolUniqueId(4242); >- static constexpr const TSymbolUniqueId pt01c = TSymbolUniqueId(4243); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2D1_Int2_Int1 = >+ static constexpr const TSymbolUniqueId pt01b = TSymbolUniqueId(4243); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2DMSArray1_Int3_Int1_UInt1 = > TSymbolUniqueId(4244); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_Int1 = >- TSymbolUniqueId(4245); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_Int1 = >+ static constexpr const TSymbolUniqueId pt01G = TSymbolUniqueId(4245); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2DMSArray1_Int3_Int1_UInt1 = > TSymbolUniqueId(4246); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_Int1 = >- TSymbolUniqueId(4247); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_Int1 = >+ static constexpr const TSymbolUniqueId pt01R = TSymbolUniqueId(4247); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2DMSArray1_Int3_Int1_UInt1 = > TSymbolUniqueId(4248); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_Int1 = >- TSymbolUniqueId(4249); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_Int1 = >+ static constexpr const TSymbolUniqueId pt01c = TSymbolUniqueId(4249); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2D1_Int2_Int1 = > TSymbolUniqueId(4250); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2D1_Int2_Int1 = > TSymbolUniqueId(4251); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2D1_Int2_Int1 = > TSymbolUniqueId(4252); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image3D1_Int3_Int1 = > TSymbolUniqueId(4253); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage3D1_Int3_Int1 = > TSymbolUniqueId(4254); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage3D1_Int3_Int1 = > TSymbolUniqueId(4255); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageCube1_Int3_Int1 = > TSymbolUniqueId(4256); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageCube1_Int3_Int1 = > TSymbolUniqueId(4257); >- static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_Int1 = >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageCube1_Int3_Int1 = > TSymbolUniqueId(4258); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4259); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4260); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4261); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4262); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4263); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4264); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4265); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4266); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4267); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image1D1_Int1_Int1 = >+ TSymbolUniqueId(4268); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4269); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4270); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4271); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4272); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4273); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_ImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4274); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4275); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4276); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4277); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4278); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4279); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_Image2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4280); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_IImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4281); >+ static constexpr const TSymbolUniqueId imageAtomicAdd_UImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4282); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2D1_Int2_UInt1 = >+ TSymbolUniqueId(4283); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4284); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4285); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image3D1_Int3_UInt1 = >+ TSymbolUniqueId(4286); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4287); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4288); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4289); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4290); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4291); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4292); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4293); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4294); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4295); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4296); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4297); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4298); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4299); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4300); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image1D1_Int1_UInt1 = >+ TSymbolUniqueId(4301); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4302); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4303); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4304); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4305); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4306); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4307); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4308); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4309); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4310); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4311); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4312); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4313); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4314); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4315); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2D1_Int2_Int1 = >+ TSymbolUniqueId(4316); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4317); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4318); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image3D1_Int3_Int1 = >+ TSymbolUniqueId(4319); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4320); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4321); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4322); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4323); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4324); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4325); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4326); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4327); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4328); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4329); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4330); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4331); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4332); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4333); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image1D1_Int1_Int1 = >+ TSymbolUniqueId(4334); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4335); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4336); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4337); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4338); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4339); >+ static constexpr const TSymbolUniqueId imageAtomicMin_ImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4340); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4341); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4342); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4343); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4344); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4345); >+ static constexpr const TSymbolUniqueId imageAtomicMin_Image2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4346); >+ static constexpr const TSymbolUniqueId imageAtomicMin_IImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4347); >+ static constexpr const TSymbolUniqueId imageAtomicMin_UImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4348); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2D1_Int2_UInt1 = >+ TSymbolUniqueId(4349); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4350); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4351); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image3D1_Int3_UInt1 = >+ TSymbolUniqueId(4352); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4353); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4354); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4355); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4356); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4357); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4358); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4359); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4360); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4361); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4362); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4363); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4364); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4365); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4366); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image1D1_Int1_UInt1 = >+ TSymbolUniqueId(4367); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4368); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4369); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4370); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4371); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4372); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4373); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4374); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4375); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4376); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4377); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4378); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4379); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4380); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4381); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2D1_Int2_Int1 = >+ TSymbolUniqueId(4382); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4383); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4384); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image3D1_Int3_Int1 = >+ TSymbolUniqueId(4385); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4386); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4387); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4388); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4389); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4390); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4391); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4392); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4393); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4394); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4395); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4396); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4397); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4398); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4399); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image1D1_Int1_Int1 = >+ TSymbolUniqueId(4400); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4401); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4402); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4403); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4404); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4405); >+ static constexpr const TSymbolUniqueId imageAtomicMax_ImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4406); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4407); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4408); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4409); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4410); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4411); >+ static constexpr const TSymbolUniqueId imageAtomicMax_Image2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4412); >+ static constexpr const TSymbolUniqueId imageAtomicMax_IImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4413); >+ static constexpr const TSymbolUniqueId imageAtomicMax_UImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4414); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2D1_Int2_UInt1 = >+ TSymbolUniqueId(4415); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4416); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4417); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image3D1_Int3_UInt1 = >+ TSymbolUniqueId(4418); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4419); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4420); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4421); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4422); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4423); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4424); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4425); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4426); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4427); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4428); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4429); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4430); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4431); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4432); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image1D1_Int1_UInt1 = >+ TSymbolUniqueId(4433); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4434); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4435); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4436); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4437); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4438); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4439); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4440); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4441); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4442); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4443); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4444); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4445); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4446); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4447); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2D1_Int2_Int1 = >+ TSymbolUniqueId(4448); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4449); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4450); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image3D1_Int3_Int1 = >+ TSymbolUniqueId(4451); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4452); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4453); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4454); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4455); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4456); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4457); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4458); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4459); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4460); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4461); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4462); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4463); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4464); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4465); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image1D1_Int1_Int1 = >+ TSymbolUniqueId(4466); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4467); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4468); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4469); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4470); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4471); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_ImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4472); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4473); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4474); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4475); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4476); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4477); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_Image2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4478); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_IImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4479); >+ static constexpr const TSymbolUniqueId imageAtomicAnd_UImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4480); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2D1_Int2_UInt1 = >+ TSymbolUniqueId(4481); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4482); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4483); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image3D1_Int3_UInt1 = >+ TSymbolUniqueId(4484); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4485); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4486); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4487); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4488); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4489); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4490); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4491); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4492); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4493); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4494); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4495); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4496); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4497); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4498); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image1D1_Int1_UInt1 = >+ TSymbolUniqueId(4499); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4500); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4501); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4502); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4503); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4504); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4505); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4506); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4507); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4508); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4509); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4510); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4511); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4512); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4513); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2D1_Int2_Int1 = TSymbolUniqueId(4514); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4515); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4516); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image3D1_Int3_Int1 = TSymbolUniqueId(4517); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4518); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4519); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4520); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4521); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4522); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4523); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4524); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4525); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4526); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4527); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4528); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4529); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4530); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4531); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image1D1_Int1_Int1 = TSymbolUniqueId(4532); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4533); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4534); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4535); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4536); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4537); >+ static constexpr const TSymbolUniqueId imageAtomicOr_ImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4538); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4539); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4540); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4541); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4542); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4543); >+ static constexpr const TSymbolUniqueId imageAtomicOr_Image2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4544); >+ static constexpr const TSymbolUniqueId imageAtomicOr_IImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4545); >+ static constexpr const TSymbolUniqueId imageAtomicOr_UImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4546); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2D1_Int2_UInt1 = >+ TSymbolUniqueId(4547); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4548); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4549); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image3D1_Int3_UInt1 = >+ TSymbolUniqueId(4550); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4551); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4552); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4553); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4554); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4555); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4556); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4557); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4558); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4559); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4560); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4561); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4562); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4563); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4564); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image1D1_Int1_UInt1 = >+ TSymbolUniqueId(4565); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4566); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4567); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4568); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4569); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4570); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4571); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4572); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4573); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4574); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4575); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4576); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4577); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4578); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4579); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2D1_Int2_Int1 = >+ TSymbolUniqueId(4580); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4581); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4582); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image3D1_Int3_Int1 = >+ TSymbolUniqueId(4583); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4584); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4585); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4586); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4587); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4588); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4589); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4590); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4591); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4592); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4593); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4594); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4595); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4596); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4597); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image1D1_Int1_Int1 = >+ TSymbolUniqueId(4598); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4599); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4600); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4601); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4602); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4603); >+ static constexpr const TSymbolUniqueId imageAtomicXor_ImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4604); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4605); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4606); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4607); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4608); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4609); >+ static constexpr const TSymbolUniqueId imageAtomicXor_Image2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4610); >+ static constexpr const TSymbolUniqueId imageAtomicXor_IImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4611); >+ static constexpr const TSymbolUniqueId imageAtomicXor_UImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4612); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2D1_Int2_UInt1 = >+ TSymbolUniqueId(4613); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4614); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4615); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image3D1_Int3_UInt1 = >+ TSymbolUniqueId(4616); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4617); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4618); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4619); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4620); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4621); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4622); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4623); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4624); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4625); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4626); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4627); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4628); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4629); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4630); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image1D1_Int1_UInt1 = >+ TSymbolUniqueId(4631); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4632); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4633); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4634); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4635); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4636); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4637); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4638); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4639); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4640); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4641); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4642); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4643); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4644); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4645); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2D1_Int2_Int1 = >+ TSymbolUniqueId(4646); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4647); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4648); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image3D1_Int3_Int1 = >+ TSymbolUniqueId(4649); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4650); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4651); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4652); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4653); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4654); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4655); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4656); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4657); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4658); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4659); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4660); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4661); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4662); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageCubeArray1_Int3_Int1 = >+ TSymbolUniqueId(4663); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image1D1_Int1_Int1 = >+ TSymbolUniqueId(4664); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4665); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage1D1_Int1_Int1 = >+ TSymbolUniqueId(4666); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4667); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4668); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage1DArray1_Int2_Int1 = >+ TSymbolUniqueId(4669); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4670); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4671); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageRect1_Int2_Int1 = >+ TSymbolUniqueId(4672); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4673); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4674); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DMS1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4675); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4676); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4677); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DMSArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4678); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2D1_Int2_Float1 = >+ TSymbolUniqueId(4679); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2D1_Int2_Float1 = >+ TSymbolUniqueId(4680); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2D1_Int2_Float1 = >+ TSymbolUniqueId(4681); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image3D1_Int3_Float1 = >+ TSymbolUniqueId(4682); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage3D1_Int3_Float1 = >+ TSymbolUniqueId(4683); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage3D1_Int3_Float1 = >+ TSymbolUniqueId(4684); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageCube1_Int3_Float1 = >+ TSymbolUniqueId(4685); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageCube1_Int3_Float1 = >+ TSymbolUniqueId(4686); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageCube1_Int3_Float1 = >+ TSymbolUniqueId(4687); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageBuffer1_Int1_Float1 = >+ TSymbolUniqueId(4688); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageBuffer1_Int1_Float1 = >+ TSymbolUniqueId(4689); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageBuffer1_Int1_Float1 = >+ TSymbolUniqueId(4690); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DArray1_Int3_Float1 = >+ TSymbolUniqueId(4691); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DArray1_Int3_Float1 = >+ TSymbolUniqueId(4692); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DArray1_Int3_Float1 = >+ TSymbolUniqueId(4693); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageCubeArray1_Int3_Float1 = >+ TSymbolUniqueId(4694); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageCubeArray1_Int3_Float1 = >+ TSymbolUniqueId(4695); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageCubeArray1_Int3_Float1 = >+ TSymbolUniqueId(4696); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image1D1_Int1_Float1 = >+ TSymbolUniqueId(4697); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage1D1_Int1_Float1 = >+ TSymbolUniqueId(4698); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage1D1_Int1_Float1 = >+ TSymbolUniqueId(4699); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image1DArray1_Int2_Float1 = >+ TSymbolUniqueId(4700); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage1DArray1_Int2_Float1 = >+ TSymbolUniqueId(4701); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage1DArray1_Int2_Float1 = >+ TSymbolUniqueId(4702); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_ImageRect1_Int2_Float1 = >+ TSymbolUniqueId(4703); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImageRect1_Int2_Float1 = >+ TSymbolUniqueId(4704); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImageRect1_Int2_Float1 = >+ TSymbolUniqueId(4705); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DMS1_Int2_Int1_Float1 = >+ TSymbolUniqueId(4706); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DMS1_Int2_Int1_Float1 = >+ TSymbolUniqueId(4707); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DMS1_Int2_Int1_Float1 = >+ TSymbolUniqueId(4708); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_Image2DMSArray1_Int3_Int1_Float1 = >+ TSymbolUniqueId(4709); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_IImage2DMSArray1_Int3_Int1_Float1 = >+ TSymbolUniqueId(4710); >+ static constexpr const TSymbolUniqueId imageAtomicExchange_UImage2DMSArray1_Int3_Int1_Float1 = >+ TSymbolUniqueId(4711); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image2D1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4712); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage2D1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4713); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage2D1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4714); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image3D1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4715); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage3D1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4716); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage3D1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4717); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageCube1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4718); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageCube1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4719); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageCube1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4720); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageBuffer1_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4721); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageBuffer1_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4722); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageBuffer1_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4723); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image2DArray1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4724); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage2DArray1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4725); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage2DArray1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4726); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageCubeArray1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4727); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageCubeArray1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4728); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageCubeArray1_Int3_UInt1_UInt1 = >+ TSymbolUniqueId(4729); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image1D1_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4730); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage1D1_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4731); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage1D1_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4732); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image1DArray1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4733); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage1DArray1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4734); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage1DArray1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4735); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageRect1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4736); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageRect1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4737); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageRect1_Int2_UInt1_UInt1 = >+ TSymbolUniqueId(4738); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image2DMS1_Int2_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4739); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage2DMS1_Int2_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4740); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage2DMS1_Int2_Int1_UInt1_UInt1 = >+ TSymbolUniqueId(4741); >+ static constexpr const TSymbolUniqueId >+ imageAtomicCompSwap_Image2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4742); >+ static constexpr const TSymbolUniqueId >+ imageAtomicCompSwap_IImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4743); >+ static constexpr const TSymbolUniqueId >+ imageAtomicCompSwap_UImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4744); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image2D1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4745); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage2D1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4746); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage2D1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4747); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image3D1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4748); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage3D1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4749); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage3D1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4750); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageCube1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4751); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageCube1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4752); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageCube1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4753); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageBuffer1_Int1_Int1_Int1 = >+ TSymbolUniqueId(4754); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageBuffer1_Int1_Int1_Int1 = >+ TSymbolUniqueId(4755); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageBuffer1_Int1_Int1_Int1 = >+ TSymbolUniqueId(4756); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image2DArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4757); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage2DArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4758); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage2DArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4759); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageCubeArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4760); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageCubeArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4761); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageCubeArray1_Int3_Int1_Int1 = >+ TSymbolUniqueId(4762); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image1D1_Int1_Int1_Int1 = >+ TSymbolUniqueId(4763); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage1D1_Int1_Int1_Int1 = >+ TSymbolUniqueId(4764); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage1D1_Int1_Int1_Int1 = >+ TSymbolUniqueId(4765); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image1DArray1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4766); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage1DArray1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4767); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage1DArray1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4768); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_ImageRect1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4769); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImageRect1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4770); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImageRect1_Int2_Int1_Int1 = >+ TSymbolUniqueId(4771); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image2DMS1_Int2_Int1_Int1_Int1 = >+ TSymbolUniqueId(4772); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_IImage2DMS1_Int2_Int1_Int1_Int1 = >+ TSymbolUniqueId(4773); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_UImage2DMS1_Int2_Int1_Int1_Int1 = >+ TSymbolUniqueId(4774); >+ static constexpr const TSymbolUniqueId imageAtomicCompSwap_Image2DMSArray1_Int3_Int1_Int1_Int1 = >+ TSymbolUniqueId(4775); >+ static constexpr const TSymbolUniqueId >+ imageAtomicCompSwap_IImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4776); >+ static constexpr const TSymbolUniqueId >+ imageAtomicCompSwap_UImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4777); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2D1_Int2_UInt1 = >+ TSymbolUniqueId(4778); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4779); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_UInt1 = >+ TSymbolUniqueId(4780); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_UInt1 = >+ TSymbolUniqueId(4781); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4782); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_UInt1 = >+ TSymbolUniqueId(4783); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4784); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4785); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_UInt1 = >+ TSymbolUniqueId(4786); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4787); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4788); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_UInt1 = >+ TSymbolUniqueId(4789); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4790); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4791); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_UInt1 = >+ TSymbolUniqueId(4792); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4793); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4794); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCubeArray1_Int3_UInt1 = >+ TSymbolUniqueId(4795); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1D1_Int1_UInt1 = >+ TSymbolUniqueId(4796); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4797); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1D1_Int1_UInt1 = >+ TSymbolUniqueId(4798); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4799); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4800); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1DArray1_Int2_UInt1 = >+ TSymbolUniqueId(4801); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4802); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4803); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageRect1_Int2_UInt1 = >+ TSymbolUniqueId(4804); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4805); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4806); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMS1_Int2_Int1_UInt1 = >+ TSymbolUniqueId(4807); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4808); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4809); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMSArray1_Int3_Int1_UInt1 = >+ TSymbolUniqueId(4810); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2D1_Int2_Int1 = >+ TSymbolUniqueId(4811); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4812); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2D1_Int2_Int1 = >+ TSymbolUniqueId(4813); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image3D1_Int3_Int1 = >+ TSymbolUniqueId(4814); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4815); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage3D1_Int3_Int1 = >+ TSymbolUniqueId(4816); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4817); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4818); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCube1_Int3_Int1 = >+ TSymbolUniqueId(4819); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4820); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4821); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageBuffer1_Int1_Int1 = >+ TSymbolUniqueId(4822); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4823); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4824); >+ static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DArray1_Int3_Int1 = >+ TSymbolUniqueId(4825); > static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4259); >+ TSymbolUniqueId(4826); > static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4260); >+ TSymbolUniqueId(4827); > static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4261); >+ TSymbolUniqueId(4828); > static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1D1_Int1_Int1 = >- TSymbolUniqueId(4262); >+ TSymbolUniqueId(4829); > static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1D1_Int1_Int1 = >- TSymbolUniqueId(4263); >+ TSymbolUniqueId(4830); > static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1D1_Int1_Int1 = >- TSymbolUniqueId(4264); >+ TSymbolUniqueId(4831); > static constexpr const TSymbolUniqueId imageAtomicAddExt_Image1DArray1_Int2_Int1 = >- TSymbolUniqueId(4265); >+ TSymbolUniqueId(4832); > static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4266); >+ TSymbolUniqueId(4833); > static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4267); >+ TSymbolUniqueId(4834); > static constexpr const TSymbolUniqueId imageAtomicAddExt_ImageRect1_Int2_Int1 = >- TSymbolUniqueId(4268); >+ TSymbolUniqueId(4835); > static constexpr const TSymbolUniqueId imageAtomicAddExt_IImageRect1_Int2_Int1 = >- TSymbolUniqueId(4269); >+ TSymbolUniqueId(4836); > static constexpr const TSymbolUniqueId imageAtomicAddExt_UImageRect1_Int2_Int1 = >- TSymbolUniqueId(4270); >+ TSymbolUniqueId(4837); > static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4271); >+ TSymbolUniqueId(4838); > static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4272); >+ TSymbolUniqueId(4839); > static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4273); >+ TSymbolUniqueId(4840); > static constexpr const TSymbolUniqueId imageAtomicAddExt_Image2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4274); >+ TSymbolUniqueId(4841); > static constexpr const TSymbolUniqueId imageAtomicAddExt_IImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4275); >+ TSymbolUniqueId(4842); > static constexpr const TSymbolUniqueId imageAtomicAddExt_UImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4276); >+ TSymbolUniqueId(4843); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2D1_Int2_UInt1 = >- TSymbolUniqueId(4277); >+ TSymbolUniqueId(4844); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4278); >+ TSymbolUniqueId(4845); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4279); >+ TSymbolUniqueId(4846); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image3D1_Int3_UInt1 = >- TSymbolUniqueId(4280); >+ TSymbolUniqueId(4847); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4281); >+ TSymbolUniqueId(4848); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4282); >+ TSymbolUniqueId(4849); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4283); >+ TSymbolUniqueId(4850); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4284); >+ TSymbolUniqueId(4851); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4285); >+ TSymbolUniqueId(4852); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4286); >+ TSymbolUniqueId(4853); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4287); >+ TSymbolUniqueId(4854); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4288); >+ TSymbolUniqueId(4855); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4289); >+ TSymbolUniqueId(4856); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4290); >+ TSymbolUniqueId(4857); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4291); >+ TSymbolUniqueId(4858); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4292); >+ TSymbolUniqueId(4859); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4293); >+ TSymbolUniqueId(4860); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4294); >+ TSymbolUniqueId(4861); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1D1_Int1_UInt1 = >- TSymbolUniqueId(4295); >+ TSymbolUniqueId(4862); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4296); >+ TSymbolUniqueId(4863); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4297); >+ TSymbolUniqueId(4864); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4298); >+ TSymbolUniqueId(4865); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4299); >+ TSymbolUniqueId(4866); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4300); >+ TSymbolUniqueId(4867); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4301); >+ TSymbolUniqueId(4868); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4302); >+ TSymbolUniqueId(4869); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4303); >+ TSymbolUniqueId(4870); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4304); >+ TSymbolUniqueId(4871); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4305); >+ TSymbolUniqueId(4872); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4306); >+ TSymbolUniqueId(4873); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4307); >+ TSymbolUniqueId(4874); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4308); >+ TSymbolUniqueId(4875); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4309); >+ TSymbolUniqueId(4876); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2D1_Int2_Int1 = >- TSymbolUniqueId(4310); >+ TSymbolUniqueId(4877); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2D1_Int2_Int1 = >- TSymbolUniqueId(4311); >+ TSymbolUniqueId(4878); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2D1_Int2_Int1 = >- TSymbolUniqueId(4312); >+ TSymbolUniqueId(4879); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image3D1_Int3_Int1 = >- TSymbolUniqueId(4313); >+ TSymbolUniqueId(4880); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage3D1_Int3_Int1 = >- TSymbolUniqueId(4314); >+ TSymbolUniqueId(4881); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage3D1_Int3_Int1 = >- TSymbolUniqueId(4315); >+ TSymbolUniqueId(4882); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCube1_Int3_Int1 = >- TSymbolUniqueId(4316); >+ TSymbolUniqueId(4883); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCube1_Int3_Int1 = >- TSymbolUniqueId(4317); >+ TSymbolUniqueId(4884); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCube1_Int3_Int1 = >- TSymbolUniqueId(4318); >+ TSymbolUniqueId(4885); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4319); >+ TSymbolUniqueId(4886); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4320); >+ TSymbolUniqueId(4887); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4321); >+ TSymbolUniqueId(4888); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DArray1_Int3_Int1 = >- TSymbolUniqueId(4322); >+ TSymbolUniqueId(4889); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4323); >+ TSymbolUniqueId(4890); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4324); >+ TSymbolUniqueId(4891); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4325); >+ TSymbolUniqueId(4892); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4326); >+ TSymbolUniqueId(4893); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4327); >+ TSymbolUniqueId(4894); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1D1_Int1_Int1 = >- TSymbolUniqueId(4328); >+ TSymbolUniqueId(4895); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1D1_Int1_Int1 = >- TSymbolUniqueId(4329); >+ TSymbolUniqueId(4896); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1D1_Int1_Int1 = >- TSymbolUniqueId(4330); >+ TSymbolUniqueId(4897); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image1DArray1_Int2_Int1 = >- TSymbolUniqueId(4331); >+ TSymbolUniqueId(4898); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4332); >+ TSymbolUniqueId(4899); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4333); >+ TSymbolUniqueId(4900); > static constexpr const TSymbolUniqueId imageAtomicMinExt_ImageRect1_Int2_Int1 = >- TSymbolUniqueId(4334); >+ TSymbolUniqueId(4901); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImageRect1_Int2_Int1 = >- TSymbolUniqueId(4335); >+ TSymbolUniqueId(4902); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImageRect1_Int2_Int1 = >- TSymbolUniqueId(4336); >+ TSymbolUniqueId(4903); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4337); >+ TSymbolUniqueId(4904); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4338); >+ TSymbolUniqueId(4905); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4339); >+ TSymbolUniqueId(4906); > static constexpr const TSymbolUniqueId imageAtomicMinExt_Image2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4340); >+ TSymbolUniqueId(4907); > static constexpr const TSymbolUniqueId imageAtomicMinExt_IImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4341); >+ TSymbolUniqueId(4908); > static constexpr const TSymbolUniqueId imageAtomicMinExt_UImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4342); >+ TSymbolUniqueId(4909); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2D1_Int2_UInt1 = >- TSymbolUniqueId(4343); >+ TSymbolUniqueId(4910); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4344); >+ TSymbolUniqueId(4911); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4345); >+ TSymbolUniqueId(4912); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image3D1_Int3_UInt1 = >- TSymbolUniqueId(4346); >+ TSymbolUniqueId(4913); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4347); >+ TSymbolUniqueId(4914); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4348); >+ TSymbolUniqueId(4915); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4349); >+ TSymbolUniqueId(4916); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4350); >+ TSymbolUniqueId(4917); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4351); >+ TSymbolUniqueId(4918); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4352); >+ TSymbolUniqueId(4919); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4353); >+ TSymbolUniqueId(4920); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4354); >+ TSymbolUniqueId(4921); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4355); >+ TSymbolUniqueId(4922); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4356); >+ TSymbolUniqueId(4923); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4357); >+ TSymbolUniqueId(4924); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4358); >+ TSymbolUniqueId(4925); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4359); >+ TSymbolUniqueId(4926); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4360); >+ TSymbolUniqueId(4927); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1D1_Int1_UInt1 = >- TSymbolUniqueId(4361); >+ TSymbolUniqueId(4928); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4362); >+ TSymbolUniqueId(4929); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4363); >+ TSymbolUniqueId(4930); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4364); >+ TSymbolUniqueId(4931); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4365); >+ TSymbolUniqueId(4932); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4366); >+ TSymbolUniqueId(4933); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4367); >+ TSymbolUniqueId(4934); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4368); >+ TSymbolUniqueId(4935); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4369); >+ TSymbolUniqueId(4936); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4370); >+ TSymbolUniqueId(4937); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4371); >+ TSymbolUniqueId(4938); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4372); >+ TSymbolUniqueId(4939); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4373); >+ TSymbolUniqueId(4940); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4374); >+ TSymbolUniqueId(4941); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4375); >+ TSymbolUniqueId(4942); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2D1_Int2_Int1 = >- TSymbolUniqueId(4376); >+ TSymbolUniqueId(4943); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2D1_Int2_Int1 = >- TSymbolUniqueId(4377); >+ TSymbolUniqueId(4944); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2D1_Int2_Int1 = >- TSymbolUniqueId(4378); >+ TSymbolUniqueId(4945); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image3D1_Int3_Int1 = >- TSymbolUniqueId(4379); >+ TSymbolUniqueId(4946); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage3D1_Int3_Int1 = >- TSymbolUniqueId(4380); >+ TSymbolUniqueId(4947); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage3D1_Int3_Int1 = >- TSymbolUniqueId(4381); >+ TSymbolUniqueId(4948); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCube1_Int3_Int1 = >- TSymbolUniqueId(4382); >+ TSymbolUniqueId(4949); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCube1_Int3_Int1 = >- TSymbolUniqueId(4383); >+ TSymbolUniqueId(4950); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCube1_Int3_Int1 = >- TSymbolUniqueId(4384); >+ TSymbolUniqueId(4951); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4385); >+ TSymbolUniqueId(4952); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4386); >+ TSymbolUniqueId(4953); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4387); >+ TSymbolUniqueId(4954); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DArray1_Int3_Int1 = >- TSymbolUniqueId(4388); >+ TSymbolUniqueId(4955); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4389); >+ TSymbolUniqueId(4956); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4390); >+ TSymbolUniqueId(4957); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4391); >+ TSymbolUniqueId(4958); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4392); >+ TSymbolUniqueId(4959); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4393); >+ TSymbolUniqueId(4960); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1D1_Int1_Int1 = >- TSymbolUniqueId(4394); >+ TSymbolUniqueId(4961); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1D1_Int1_Int1 = >- TSymbolUniqueId(4395); >+ TSymbolUniqueId(4962); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1D1_Int1_Int1 = >- TSymbolUniqueId(4396); >+ TSymbolUniqueId(4963); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image1DArray1_Int2_Int1 = >- TSymbolUniqueId(4397); >+ TSymbolUniqueId(4964); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4398); >+ TSymbolUniqueId(4965); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4399); >+ TSymbolUniqueId(4966); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_ImageRect1_Int2_Int1 = >- TSymbolUniqueId(4400); >+ TSymbolUniqueId(4967); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImageRect1_Int2_Int1 = >- TSymbolUniqueId(4401); >+ TSymbolUniqueId(4968); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImageRect1_Int2_Int1 = >- TSymbolUniqueId(4402); >+ TSymbolUniqueId(4969); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4403); >+ TSymbolUniqueId(4970); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4404); >+ TSymbolUniqueId(4971); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4405); >+ TSymbolUniqueId(4972); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_Image2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4406); >+ TSymbolUniqueId(4973); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_IImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4407); >+ TSymbolUniqueId(4974); > static constexpr const TSymbolUniqueId imageAtomicMaxExt_UImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4408); >+ TSymbolUniqueId(4975); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2D1_Int2_UInt1 = >- TSymbolUniqueId(4409); >+ TSymbolUniqueId(4976); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4410); >+ TSymbolUniqueId(4977); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4411); >+ TSymbolUniqueId(4978); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image3D1_Int3_UInt1 = >- TSymbolUniqueId(4412); >+ TSymbolUniqueId(4979); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4413); >+ TSymbolUniqueId(4980); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4414); >+ TSymbolUniqueId(4981); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4415); >+ TSymbolUniqueId(4982); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4416); >+ TSymbolUniqueId(4983); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4417); >+ TSymbolUniqueId(4984); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4418); >+ TSymbolUniqueId(4985); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4419); >+ TSymbolUniqueId(4986); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4420); >+ TSymbolUniqueId(4987); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4421); >+ TSymbolUniqueId(4988); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4422); >+ TSymbolUniqueId(4989); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4423); >+ TSymbolUniqueId(4990); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4424); >+ TSymbolUniqueId(4991); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4425); >+ TSymbolUniqueId(4992); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4426); >+ TSymbolUniqueId(4993); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1D1_Int1_UInt1 = >- TSymbolUniqueId(4427); >+ TSymbolUniqueId(4994); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4428); >+ TSymbolUniqueId(4995); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4429); >+ TSymbolUniqueId(4996); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4430); >+ TSymbolUniqueId(4997); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4431); >+ TSymbolUniqueId(4998); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4432); >+ TSymbolUniqueId(4999); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4433); >+ TSymbolUniqueId(5000); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4434); >+ TSymbolUniqueId(5001); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4435); >+ TSymbolUniqueId(5002); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4436); >+ TSymbolUniqueId(5003); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4437); >+ TSymbolUniqueId(5004); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4438); >+ TSymbolUniqueId(5005); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4439); >+ TSymbolUniqueId(5006); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4440); >+ TSymbolUniqueId(5007); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4441); >+ TSymbolUniqueId(5008); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2D1_Int2_Int1 = >- TSymbolUniqueId(4442); >+ TSymbolUniqueId(5009); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2D1_Int2_Int1 = >- TSymbolUniqueId(4443); >+ TSymbolUniqueId(5010); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2D1_Int2_Int1 = >- TSymbolUniqueId(4444); >+ TSymbolUniqueId(5011); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image3D1_Int3_Int1 = >- TSymbolUniqueId(4445); >+ TSymbolUniqueId(5012); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage3D1_Int3_Int1 = >- TSymbolUniqueId(4446); >+ TSymbolUniqueId(5013); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage3D1_Int3_Int1 = >- TSymbolUniqueId(4447); >+ TSymbolUniqueId(5014); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCube1_Int3_Int1 = >- TSymbolUniqueId(4448); >+ TSymbolUniqueId(5015); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCube1_Int3_Int1 = >- TSymbolUniqueId(4449); >+ TSymbolUniqueId(5016); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCube1_Int3_Int1 = >- TSymbolUniqueId(4450); >+ TSymbolUniqueId(5017); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4451); >+ TSymbolUniqueId(5018); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4452); >+ TSymbolUniqueId(5019); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4453); >+ TSymbolUniqueId(5020); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DArray1_Int3_Int1 = >- TSymbolUniqueId(4454); >+ TSymbolUniqueId(5021); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4455); >+ TSymbolUniqueId(5022); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4456); >+ TSymbolUniqueId(5023); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4457); >+ TSymbolUniqueId(5024); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4458); >+ TSymbolUniqueId(5025); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4459); >+ TSymbolUniqueId(5026); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1D1_Int1_Int1 = >- TSymbolUniqueId(4460); >+ TSymbolUniqueId(5027); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1D1_Int1_Int1 = >- TSymbolUniqueId(4461); >+ TSymbolUniqueId(5028); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1D1_Int1_Int1 = >- TSymbolUniqueId(4462); >+ TSymbolUniqueId(5029); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image1DArray1_Int2_Int1 = >- TSymbolUniqueId(4463); >+ TSymbolUniqueId(5030); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4464); >+ TSymbolUniqueId(5031); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4465); >+ TSymbolUniqueId(5032); > static constexpr const TSymbolUniqueId imageAtomicAndExt_ImageRect1_Int2_Int1 = >- TSymbolUniqueId(4466); >+ TSymbolUniqueId(5033); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImageRect1_Int2_Int1 = >- TSymbolUniqueId(4467); >+ TSymbolUniqueId(5034); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImageRect1_Int2_Int1 = >- TSymbolUniqueId(4468); >+ TSymbolUniqueId(5035); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4469); >+ TSymbolUniqueId(5036); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4470); >+ TSymbolUniqueId(5037); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4471); >+ TSymbolUniqueId(5038); > static constexpr const TSymbolUniqueId imageAtomicAndExt_Image2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4472); >+ TSymbolUniqueId(5039); > static constexpr const TSymbolUniqueId imageAtomicAndExt_IImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4473); >+ TSymbolUniqueId(5040); > static constexpr const TSymbolUniqueId imageAtomicAndExt_UImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4474); >+ TSymbolUniqueId(5041); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2D1_Int2_UInt1 = >- TSymbolUniqueId(4475); >+ TSymbolUniqueId(5042); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4476); >+ TSymbolUniqueId(5043); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4477); >+ TSymbolUniqueId(5044); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image3D1_Int3_UInt1 = >- TSymbolUniqueId(4478); >+ TSymbolUniqueId(5045); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4479); >+ TSymbolUniqueId(5046); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4480); >+ TSymbolUniqueId(5047); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4481); >+ TSymbolUniqueId(5048); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4482); >+ TSymbolUniqueId(5049); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4483); >+ TSymbolUniqueId(5050); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4484); >+ TSymbolUniqueId(5051); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4485); >+ TSymbolUniqueId(5052); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4486); >+ TSymbolUniqueId(5053); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4487); >+ TSymbolUniqueId(5054); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4488); >+ TSymbolUniqueId(5055); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4489); >+ TSymbolUniqueId(5056); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4490); >+ TSymbolUniqueId(5057); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4491); >+ TSymbolUniqueId(5058); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4492); >+ TSymbolUniqueId(5059); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1D1_Int1_UInt1 = >- TSymbolUniqueId(4493); >+ TSymbolUniqueId(5060); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4494); >+ TSymbolUniqueId(5061); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4495); >+ TSymbolUniqueId(5062); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4496); >+ TSymbolUniqueId(5063); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4497); >+ TSymbolUniqueId(5064); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4498); >+ TSymbolUniqueId(5065); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4499); >+ TSymbolUniqueId(5066); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4500); >+ TSymbolUniqueId(5067); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4501); >+ TSymbolUniqueId(5068); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4502); >+ TSymbolUniqueId(5069); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4503); >+ TSymbolUniqueId(5070); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4504); >+ TSymbolUniqueId(5071); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4505); >+ TSymbolUniqueId(5072); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4506); >+ TSymbolUniqueId(5073); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4507); >+ TSymbolUniqueId(5074); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2D1_Int2_Int1 = >- TSymbolUniqueId(4508); >+ TSymbolUniqueId(5075); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2D1_Int2_Int1 = >- TSymbolUniqueId(4509); >+ TSymbolUniqueId(5076); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2D1_Int2_Int1 = >- TSymbolUniqueId(4510); >+ TSymbolUniqueId(5077); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image3D1_Int3_Int1 = >- TSymbolUniqueId(4511); >+ TSymbolUniqueId(5078); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage3D1_Int3_Int1 = >- TSymbolUniqueId(4512); >+ TSymbolUniqueId(5079); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage3D1_Int3_Int1 = >- TSymbolUniqueId(4513); >+ TSymbolUniqueId(5080); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCube1_Int3_Int1 = >- TSymbolUniqueId(4514); >+ TSymbolUniqueId(5081); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCube1_Int3_Int1 = >- TSymbolUniqueId(4515); >+ TSymbolUniqueId(5082); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCube1_Int3_Int1 = >- TSymbolUniqueId(4516); >+ TSymbolUniqueId(5083); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4517); >+ TSymbolUniqueId(5084); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4518); >+ TSymbolUniqueId(5085); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4519); >+ TSymbolUniqueId(5086); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DArray1_Int3_Int1 = >- TSymbolUniqueId(4520); >+ TSymbolUniqueId(5087); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4521); >+ TSymbolUniqueId(5088); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4522); >+ TSymbolUniqueId(5089); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4523); >+ TSymbolUniqueId(5090); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4524); >+ TSymbolUniqueId(5091); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4525); >+ TSymbolUniqueId(5092); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1D1_Int1_Int1 = >- TSymbolUniqueId(4526); >+ TSymbolUniqueId(5093); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1D1_Int1_Int1 = >- TSymbolUniqueId(4527); >+ TSymbolUniqueId(5094); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1D1_Int1_Int1 = >- TSymbolUniqueId(4528); >+ TSymbolUniqueId(5095); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image1DArray1_Int2_Int1 = >- TSymbolUniqueId(4529); >+ TSymbolUniqueId(5096); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4530); >+ TSymbolUniqueId(5097); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4531); >+ TSymbolUniqueId(5098); > static constexpr const TSymbolUniqueId imageAtomicOrExt_ImageRect1_Int2_Int1 = >- TSymbolUniqueId(4532); >+ TSymbolUniqueId(5099); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImageRect1_Int2_Int1 = >- TSymbolUniqueId(4533); >+ TSymbolUniqueId(5100); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImageRect1_Int2_Int1 = >- TSymbolUniqueId(4534); >+ TSymbolUniqueId(5101); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4535); >+ TSymbolUniqueId(5102); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4536); >+ TSymbolUniqueId(5103); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4537); >+ TSymbolUniqueId(5104); > static constexpr const TSymbolUniqueId imageAtomicOrExt_Image2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4538); >+ TSymbolUniqueId(5105); > static constexpr const TSymbolUniqueId imageAtomicOrExt_IImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4539); >+ TSymbolUniqueId(5106); > static constexpr const TSymbolUniqueId imageAtomicOrExt_UImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4540); >+ TSymbolUniqueId(5107); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2D1_Int2_UInt1 = >- TSymbolUniqueId(4541); >+ TSymbolUniqueId(5108); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4542); >+ TSymbolUniqueId(5109); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4543); >+ TSymbolUniqueId(5110); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image3D1_Int3_UInt1 = >- TSymbolUniqueId(4544); >+ TSymbolUniqueId(5111); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4545); >+ TSymbolUniqueId(5112); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4546); >+ TSymbolUniqueId(5113); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4547); >+ TSymbolUniqueId(5114); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4548); >+ TSymbolUniqueId(5115); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4549); >+ TSymbolUniqueId(5116); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4550); >+ TSymbolUniqueId(5117); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4551); >+ TSymbolUniqueId(5118); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4552); >+ TSymbolUniqueId(5119); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4553); >+ TSymbolUniqueId(5120); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4554); >+ TSymbolUniqueId(5121); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4555); >+ TSymbolUniqueId(5122); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4556); >+ TSymbolUniqueId(5123); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4557); >+ TSymbolUniqueId(5124); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4558); >+ TSymbolUniqueId(5125); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1D1_Int1_UInt1 = >- TSymbolUniqueId(4559); >+ TSymbolUniqueId(5126); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4560); >+ TSymbolUniqueId(5127); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4561); >+ TSymbolUniqueId(5128); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4562); >+ TSymbolUniqueId(5129); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4563); >+ TSymbolUniqueId(5130); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4564); >+ TSymbolUniqueId(5131); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4565); >+ TSymbolUniqueId(5132); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4566); >+ TSymbolUniqueId(5133); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4567); >+ TSymbolUniqueId(5134); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4568); >+ TSymbolUniqueId(5135); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4569); >+ TSymbolUniqueId(5136); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4570); >+ TSymbolUniqueId(5137); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4571); >+ TSymbolUniqueId(5138); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4572); >+ TSymbolUniqueId(5139); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4573); >+ TSymbolUniqueId(5140); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2D1_Int2_Int1 = >- TSymbolUniqueId(4574); >+ TSymbolUniqueId(5141); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2D1_Int2_Int1 = >- TSymbolUniqueId(4575); >+ TSymbolUniqueId(5142); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2D1_Int2_Int1 = >- TSymbolUniqueId(4576); >+ TSymbolUniqueId(5143); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image3D1_Int3_Int1 = >- TSymbolUniqueId(4577); >+ TSymbolUniqueId(5144); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage3D1_Int3_Int1 = >- TSymbolUniqueId(4578); >+ TSymbolUniqueId(5145); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage3D1_Int3_Int1 = >- TSymbolUniqueId(4579); >+ TSymbolUniqueId(5146); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCube1_Int3_Int1 = >- TSymbolUniqueId(4580); >+ TSymbolUniqueId(5147); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCube1_Int3_Int1 = >- TSymbolUniqueId(4581); >+ TSymbolUniqueId(5148); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCube1_Int3_Int1 = >- TSymbolUniqueId(4582); >+ TSymbolUniqueId(5149); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4583); >+ TSymbolUniqueId(5150); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4584); >+ TSymbolUniqueId(5151); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4585); >+ TSymbolUniqueId(5152); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DArray1_Int3_Int1 = >- TSymbolUniqueId(4586); >+ TSymbolUniqueId(5153); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4587); >+ TSymbolUniqueId(5154); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4588); >+ TSymbolUniqueId(5155); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4589); >+ TSymbolUniqueId(5156); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4590); >+ TSymbolUniqueId(5157); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4591); >+ TSymbolUniqueId(5158); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1D1_Int1_Int1 = >- TSymbolUniqueId(4592); >+ TSymbolUniqueId(5159); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1D1_Int1_Int1 = >- TSymbolUniqueId(4593); >+ TSymbolUniqueId(5160); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1D1_Int1_Int1 = >- TSymbolUniqueId(4594); >+ TSymbolUniqueId(5161); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image1DArray1_Int2_Int1 = >- TSymbolUniqueId(4595); >+ TSymbolUniqueId(5162); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4596); >+ TSymbolUniqueId(5163); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4597); >+ TSymbolUniqueId(5164); > static constexpr const TSymbolUniqueId imageAtomicXorExt_ImageRect1_Int2_Int1 = >- TSymbolUniqueId(4598); >+ TSymbolUniqueId(5165); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImageRect1_Int2_Int1 = >- TSymbolUniqueId(4599); >+ TSymbolUniqueId(5166); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImageRect1_Int2_Int1 = >- TSymbolUniqueId(4600); >+ TSymbolUniqueId(5167); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4601); >+ TSymbolUniqueId(5168); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4602); >+ TSymbolUniqueId(5169); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4603); >+ TSymbolUniqueId(5170); > static constexpr const TSymbolUniqueId imageAtomicXorExt_Image2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4604); >+ TSymbolUniqueId(5171); > static constexpr const TSymbolUniqueId imageAtomicXorExt_IImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4605); >+ TSymbolUniqueId(5172); > static constexpr const TSymbolUniqueId imageAtomicXorExt_UImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4606); >+ TSymbolUniqueId(5173); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_UInt1 = >- TSymbolUniqueId(4607); >+ TSymbolUniqueId(5174); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4608); >+ TSymbolUniqueId(5175); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_UInt1 = >- TSymbolUniqueId(4609); >+ TSymbolUniqueId(5176); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_UInt1 = >- TSymbolUniqueId(4610); >+ TSymbolUniqueId(5177); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4611); >+ TSymbolUniqueId(5178); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_UInt1 = >- TSymbolUniqueId(4612); >+ TSymbolUniqueId(5179); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4613); >+ TSymbolUniqueId(5180); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4614); >+ TSymbolUniqueId(5181); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_UInt1 = >- TSymbolUniqueId(4615); >+ TSymbolUniqueId(5182); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4616); >+ TSymbolUniqueId(5183); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4617); >+ TSymbolUniqueId(5184); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_UInt1 = >- TSymbolUniqueId(4618); >+ TSymbolUniqueId(5185); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4619); >+ TSymbolUniqueId(5186); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4620); >+ TSymbolUniqueId(5187); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_UInt1 = >- TSymbolUniqueId(4621); >+ TSymbolUniqueId(5188); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4622); >+ TSymbolUniqueId(5189); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4623); >+ TSymbolUniqueId(5190); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_UInt1 = >- TSymbolUniqueId(4624); >+ TSymbolUniqueId(5191); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_UInt1 = >- TSymbolUniqueId(4625); >+ TSymbolUniqueId(5192); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4626); >+ TSymbolUniqueId(5193); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_UInt1 = >- TSymbolUniqueId(4627); >+ TSymbolUniqueId(5194); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4628); >+ TSymbolUniqueId(5195); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4629); >+ TSymbolUniqueId(5196); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_UInt1 = >- TSymbolUniqueId(4630); >+ TSymbolUniqueId(5197); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4631); >+ TSymbolUniqueId(5198); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4632); >+ TSymbolUniqueId(5199); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_UInt1 = >- TSymbolUniqueId(4633); >+ TSymbolUniqueId(5200); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4634); >+ TSymbolUniqueId(5201); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4635); >+ TSymbolUniqueId(5202); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_UInt1 = >- TSymbolUniqueId(4636); >+ TSymbolUniqueId(5203); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4637); >+ TSymbolUniqueId(5204); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4638); >+ TSymbolUniqueId(5205); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_UInt1 = >- TSymbolUniqueId(4639); >+ TSymbolUniqueId(5206); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_Int1 = >- TSymbolUniqueId(4640); >+ TSymbolUniqueId(5207); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_Int1 = >- TSymbolUniqueId(4641); >+ TSymbolUniqueId(5208); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_Int1 = >- TSymbolUniqueId(4642); >+ TSymbolUniqueId(5209); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_Int1 = >- TSymbolUniqueId(4643); >+ TSymbolUniqueId(5210); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_Int1 = >- TSymbolUniqueId(4644); >+ TSymbolUniqueId(5211); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_Int1 = >- TSymbolUniqueId(4645); >+ TSymbolUniqueId(5212); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_Int1 = >- TSymbolUniqueId(4646); >+ TSymbolUniqueId(5213); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_Int1 = >- TSymbolUniqueId(4647); >+ TSymbolUniqueId(5214); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_Int1 = >- TSymbolUniqueId(4648); >+ TSymbolUniqueId(5215); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4649); >+ TSymbolUniqueId(5216); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4650); >+ TSymbolUniqueId(5217); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_Int1 = >- TSymbolUniqueId(4651); >+ TSymbolUniqueId(5218); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_Int1 = >- TSymbolUniqueId(4652); >+ TSymbolUniqueId(5219); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4653); >+ TSymbolUniqueId(5220); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_Int1 = >- TSymbolUniqueId(4654); >+ TSymbolUniqueId(5221); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4655); >+ TSymbolUniqueId(5222); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4656); >+ TSymbolUniqueId(5223); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_Int1 = >- TSymbolUniqueId(4657); >+ TSymbolUniqueId(5224); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_Int1 = >- TSymbolUniqueId(4658); >+ TSymbolUniqueId(5225); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_Int1 = >- TSymbolUniqueId(4659); >+ TSymbolUniqueId(5226); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_Int1 = >- TSymbolUniqueId(4660); >+ TSymbolUniqueId(5227); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_Int1 = >- TSymbolUniqueId(4661); >+ TSymbolUniqueId(5228); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4662); >+ TSymbolUniqueId(5229); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_Int1 = >- TSymbolUniqueId(4663); >+ TSymbolUniqueId(5230); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_Int1 = >- TSymbolUniqueId(4664); >+ TSymbolUniqueId(5231); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_Int1 = >- TSymbolUniqueId(4665); >+ TSymbolUniqueId(5232); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_Int1 = >- TSymbolUniqueId(4666); >+ TSymbolUniqueId(5233); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4667); >+ TSymbolUniqueId(5234); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4668); >+ TSymbolUniqueId(5235); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_Int1 = >- TSymbolUniqueId(4669); >+ TSymbolUniqueId(5236); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4670); >+ TSymbolUniqueId(5237); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4671); >+ TSymbolUniqueId(5238); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4672); >+ TSymbolUniqueId(5239); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2D1_Int2_Float1 = >- TSymbolUniqueId(4673); >+ TSymbolUniqueId(5240); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2D1_Int2_Float1 = >- TSymbolUniqueId(4674); >+ TSymbolUniqueId(5241); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2D1_Int2_Float1 = >- TSymbolUniqueId(4675); >+ TSymbolUniqueId(5242); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image3D1_Int3_Float1 = >- TSymbolUniqueId(4676); >+ TSymbolUniqueId(5243); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage3D1_Int3_Float1 = >- TSymbolUniqueId(4677); >+ TSymbolUniqueId(5244); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage3D1_Int3_Float1 = >- TSymbolUniqueId(4678); >+ TSymbolUniqueId(5245); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCube1_Int3_Float1 = >- TSymbolUniqueId(4679); >+ TSymbolUniqueId(5246); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCube1_Int3_Float1 = >- TSymbolUniqueId(4680); >+ TSymbolUniqueId(5247); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCube1_Int3_Float1 = >- TSymbolUniqueId(4681); >+ TSymbolUniqueId(5248); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageBuffer1_Int1_Float1 = >- TSymbolUniqueId(4682); >+ TSymbolUniqueId(5249); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageBuffer1_Int1_Float1 = >- TSymbolUniqueId(4683); >+ TSymbolUniqueId(5250); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageBuffer1_Int1_Float1 = >- TSymbolUniqueId(4684); >+ TSymbolUniqueId(5251); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DArray1_Int3_Float1 = >- TSymbolUniqueId(4685); >+ TSymbolUniqueId(5252); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DArray1_Int3_Float1 = >- TSymbolUniqueId(4686); >+ TSymbolUniqueId(5253); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DArray1_Int3_Float1 = >- TSymbolUniqueId(4687); >+ TSymbolUniqueId(5254); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageCubeArray1_Int3_Float1 = >- TSymbolUniqueId(4688); >+ TSymbolUniqueId(5255); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageCubeArray1_Int3_Float1 = >- TSymbolUniqueId(4689); >+ TSymbolUniqueId(5256); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageCubeArray1_Int3_Float1 = >- TSymbolUniqueId(4690); >+ TSymbolUniqueId(5257); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1D1_Int1_Float1 = >- TSymbolUniqueId(4691); >+ TSymbolUniqueId(5258); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1D1_Int1_Float1 = >- TSymbolUniqueId(4692); >+ TSymbolUniqueId(5259); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1D1_Int1_Float1 = >- TSymbolUniqueId(4693); >+ TSymbolUniqueId(5260); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image1DArray1_Int2_Float1 = >- TSymbolUniqueId(4694); >+ TSymbolUniqueId(5261); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage1DArray1_Int2_Float1 = >- TSymbolUniqueId(4695); >+ TSymbolUniqueId(5262); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage1DArray1_Int2_Float1 = >- TSymbolUniqueId(4696); >+ TSymbolUniqueId(5263); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_ImageRect1_Int2_Float1 = >- TSymbolUniqueId(4697); >+ TSymbolUniqueId(5264); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImageRect1_Int2_Float1 = >- TSymbolUniqueId(4698); >+ TSymbolUniqueId(5265); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImageRect1_Int2_Float1 = >- TSymbolUniqueId(4699); >+ TSymbolUniqueId(5266); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMS1_Int2_Int1_Float1 = >- TSymbolUniqueId(4700); >+ TSymbolUniqueId(5267); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_IImage2DMS1_Int2_Int1_Float1 = >- TSymbolUniqueId(4701); >+ TSymbolUniqueId(5268); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_UImage2DMS1_Int2_Int1_Float1 = >- TSymbolUniqueId(4702); >+ TSymbolUniqueId(5269); > static constexpr const TSymbolUniqueId imageAtomicExchangeExt_Image2DMSArray1_Int3_Int1_Float1 = >- TSymbolUniqueId(4703); >+ TSymbolUniqueId(5270); > static constexpr const TSymbolUniqueId >- imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(4704); >+ imageAtomicExchangeExt_IImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(5271); > static constexpr const TSymbolUniqueId >- imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(4705); >+ imageAtomicExchangeExt_UImage2DMSArray1_Int3_Int1_Float1 = TSymbolUniqueId(5272); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2D1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4706); >+ TSymbolUniqueId(5273); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2D1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4707); >+ TSymbolUniqueId(5274); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2D1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4708); >+ TSymbolUniqueId(5275); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image3D1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4709); >+ TSymbolUniqueId(5276); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage3D1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4710); >+ TSymbolUniqueId(5277); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage3D1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4711); >+ TSymbolUniqueId(5278); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCube1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4712); >+ TSymbolUniqueId(5279); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCube1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4713); >+ TSymbolUniqueId(5280); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCube1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4714); >+ TSymbolUniqueId(5281); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageBuffer1_Int1_UInt1_UInt1 = >- TSymbolUniqueId(4715); >+ TSymbolUniqueId(5282); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageBuffer1_Int1_UInt1_UInt1 = >- TSymbolUniqueId(4716); >+ TSymbolUniqueId(5283); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageBuffer1_Int1_UInt1_UInt1 = >- TSymbolUniqueId(4717); >+ TSymbolUniqueId(5284); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DArray1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4718); >+ TSymbolUniqueId(5285); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DArray1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4719); >+ TSymbolUniqueId(5286); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DArray1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4720); >+ TSymbolUniqueId(5287); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCubeArray1_Int3_UInt1_UInt1 = >- TSymbolUniqueId(4721); >+ TSymbolUniqueId(5288); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_IImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(4722); >+ imageAtomicCompSwapExt_IImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(5289); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_UImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(4723); >+ imageAtomicCompSwapExt_UImageCubeArray1_Int3_UInt1_UInt1 = TSymbolUniqueId(5290); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1D1_Int1_UInt1_UInt1 = >- TSymbolUniqueId(4724); >+ TSymbolUniqueId(5291); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1D1_Int1_UInt1_UInt1 = >- TSymbolUniqueId(4725); >+ TSymbolUniqueId(5292); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1D1_Int1_UInt1_UInt1 = >- TSymbolUniqueId(4726); >+ TSymbolUniqueId(5293); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1DArray1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4727); >+ TSymbolUniqueId(5294); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1DArray1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4728); >+ TSymbolUniqueId(5295); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1DArray1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4729); >+ TSymbolUniqueId(5296); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageRect1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4730); >+ TSymbolUniqueId(5297); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageRect1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4731); >+ TSymbolUniqueId(5298); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageRect1_Int2_UInt1_UInt1 = >- TSymbolUniqueId(4732); >+ TSymbolUniqueId(5299); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DMS1_Int2_Int1_UInt1_UInt1 = >- TSymbolUniqueId(4733); >+ TSymbolUniqueId(5300); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_IImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(4734); >+ imageAtomicCompSwapExt_IImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(5301); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_UImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(4735); >+ imageAtomicCompSwapExt_UImage2DMS1_Int2_Int1_UInt1_UInt1 = TSymbolUniqueId(5302); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4736); >+ imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(5303); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4737); >+ imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(5304); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(4738); >+ imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_UInt1_UInt1 = TSymbolUniqueId(5305); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2D1_Int2_Int1_Int1 = >- TSymbolUniqueId(4739); >+ TSymbolUniqueId(5306); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2D1_Int2_Int1_Int1 = >- TSymbolUniqueId(4740); >+ TSymbolUniqueId(5307); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2D1_Int2_Int1_Int1 = >- TSymbolUniqueId(4741); >+ TSymbolUniqueId(5308); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image3D1_Int3_Int1_Int1 = >- TSymbolUniqueId(4742); >+ TSymbolUniqueId(5309); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage3D1_Int3_Int1_Int1 = >- TSymbolUniqueId(4743); >+ TSymbolUniqueId(5310); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage3D1_Int3_Int1_Int1 = >- TSymbolUniqueId(4744); >+ TSymbolUniqueId(5311); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCube1_Int3_Int1_Int1 = >- TSymbolUniqueId(4745); >+ TSymbolUniqueId(5312); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCube1_Int3_Int1_Int1 = >- TSymbolUniqueId(4746); >+ TSymbolUniqueId(5313); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCube1_Int3_Int1_Int1 = >- TSymbolUniqueId(4747); >+ TSymbolUniqueId(5314); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageBuffer1_Int1_Int1_Int1 = >- TSymbolUniqueId(4748); >+ TSymbolUniqueId(5315); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageBuffer1_Int1_Int1_Int1 = >- TSymbolUniqueId(4749); >+ TSymbolUniqueId(5316); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageBuffer1_Int1_Int1_Int1 = >- TSymbolUniqueId(4750); >+ TSymbolUniqueId(5317); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4751); >+ TSymbolUniqueId(5318); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4752); >+ TSymbolUniqueId(5319); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4753); >+ TSymbolUniqueId(5320); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageCubeArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4754); >+ TSymbolUniqueId(5321); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageCubeArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4755); >+ TSymbolUniqueId(5322); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageCubeArray1_Int3_Int1_Int1 = >- TSymbolUniqueId(4756); >+ TSymbolUniqueId(5323); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1D1_Int1_Int1_Int1 = >- TSymbolUniqueId(4757); >+ TSymbolUniqueId(5324); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1D1_Int1_Int1_Int1 = >- TSymbolUniqueId(4758); >+ TSymbolUniqueId(5325); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1D1_Int1_Int1_Int1 = >- TSymbolUniqueId(4759); >+ TSymbolUniqueId(5326); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image1DArray1_Int2_Int1_Int1 = >- TSymbolUniqueId(4760); >+ TSymbolUniqueId(5327); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage1DArray1_Int2_Int1_Int1 = >- TSymbolUniqueId(4761); >+ TSymbolUniqueId(5328); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage1DArray1_Int2_Int1_Int1 = >- TSymbolUniqueId(4762); >+ TSymbolUniqueId(5329); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_ImageRect1_Int2_Int1_Int1 = >- TSymbolUniqueId(4763); >+ TSymbolUniqueId(5330); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImageRect1_Int2_Int1_Int1 = >- TSymbolUniqueId(4764); >+ TSymbolUniqueId(5331); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImageRect1_Int2_Int1_Int1 = >- TSymbolUniqueId(4765); >+ TSymbolUniqueId(5332); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_Image2DMS1_Int2_Int1_Int1_Int1 = >- TSymbolUniqueId(4766); >+ TSymbolUniqueId(5333); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_IImage2DMS1_Int2_Int1_Int1_Int1 = >- TSymbolUniqueId(4767); >+ TSymbolUniqueId(5334); > static constexpr const TSymbolUniqueId imageAtomicCompSwapExt_UImage2DMS1_Int2_Int1_Int1_Int1 = >- TSymbolUniqueId(4768); >+ TSymbolUniqueId(5335); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4769); >+ imageAtomicCompSwapExt_Image2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(5336); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4770); >+ imageAtomicCompSwapExt_IImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(5337); > static constexpr const TSymbolUniqueId >- imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(4771); >- static constexpr const TSymbolUniqueId memoryBarrier = TSymbolUniqueId(4772); >- static constexpr const TSymbolUniqueId memoryBarrierAtomicCounter = TSymbolUniqueId(4773); >- static constexpr const TSymbolUniqueId memoryBarrierBuffer = TSymbolUniqueId(4774); >- static constexpr const TSymbolUniqueId memoryBarrierImage = TSymbolUniqueId(4775); >- static constexpr const TSymbolUniqueId barrier = TSymbolUniqueId(4776); >- static constexpr const TSymbolUniqueId memoryBarrierShared = TSymbolUniqueId(4777); >- static constexpr const TSymbolUniqueId groupMemoryBarrier = TSymbolUniqueId(4778); >- static constexpr const TSymbolUniqueId barrierTCS = TSymbolUniqueId(4779); >- static constexpr const TSymbolUniqueId barrierTCSES3_2 = TSymbolUniqueId(4780); >- static constexpr const TSymbolUniqueId EmitVertex = TSymbolUniqueId(4781); >- static constexpr const TSymbolUniqueId EmitVertexES3_2 = TSymbolUniqueId(4782); >- static constexpr const TSymbolUniqueId EndPrimitive = TSymbolUniqueId(4783); >- static constexpr const TSymbolUniqueId EndPrimitiveES3_2 = TSymbolUniqueId(4784); >- static constexpr const TSymbolUniqueId subpassLoad_SubpassInput1 = TSymbolUniqueId(4785); >- static constexpr const TSymbolUniqueId pt01g = TSymbolUniqueId(4786); >- static constexpr const TSymbolUniqueId subpassLoad_ISubpassInput1 = TSymbolUniqueId(4787); >- static constexpr const TSymbolUniqueId pt01h = TSymbolUniqueId(4788); >- static constexpr const TSymbolUniqueId subpassLoad_USubpassInput1 = TSymbolUniqueId(4789); >- static constexpr const TSymbolUniqueId pt01i = TSymbolUniqueId(4790); >- static constexpr const TSymbolUniqueId subpassLoad_SubpassInputMS1_Int1 = TSymbolUniqueId(4791); >- static constexpr const TSymbolUniqueId pt01j = TSymbolUniqueId(4792); >+ imageAtomicCompSwapExt_UImage2DMSArray1_Int3_Int1_Int1_Int1 = TSymbolUniqueId(5338); >+ static constexpr const TSymbolUniqueId memoryBarrier = TSymbolUniqueId(5339); >+ static constexpr const TSymbolUniqueId memoryBarrierAtomicCounter = TSymbolUniqueId(5340); >+ static constexpr const TSymbolUniqueId memoryBarrierBuffer = TSymbolUniqueId(5341); >+ static constexpr const TSymbolUniqueId memoryBarrierImage = TSymbolUniqueId(5342); >+ static constexpr const TSymbolUniqueId barrier = TSymbolUniqueId(5343); >+ static constexpr const TSymbolUniqueId memoryBarrierShared = TSymbolUniqueId(5344); >+ static constexpr const TSymbolUniqueId groupMemoryBarrier = TSymbolUniqueId(5345); >+ static constexpr const TSymbolUniqueId barrierTCS = TSymbolUniqueId(5346); >+ static constexpr const TSymbolUniqueId barrierTCSES3_2 = TSymbolUniqueId(5347); >+ static constexpr const TSymbolUniqueId EmitVertex = TSymbolUniqueId(5348); >+ static constexpr const TSymbolUniqueId EmitVertexES3_2 = TSymbolUniqueId(5349); >+ static constexpr const TSymbolUniqueId EndPrimitive = TSymbolUniqueId(5350); >+ static constexpr const TSymbolUniqueId EndPrimitiveES3_2 = TSymbolUniqueId(5351); >+ static constexpr const TSymbolUniqueId subpassLoad_SubpassInput1 = TSymbolUniqueId(5352); >+ static constexpr const TSymbolUniqueId pt01g = TSymbolUniqueId(5353); >+ static constexpr const TSymbolUniqueId subpassLoad_ISubpassInput1 = TSymbolUniqueId(5354); >+ static constexpr const TSymbolUniqueId pt01h = TSymbolUniqueId(5355); >+ static constexpr const TSymbolUniqueId subpassLoad_USubpassInput1 = TSymbolUniqueId(5356); >+ static constexpr const TSymbolUniqueId pt01i = TSymbolUniqueId(5357); >+ static constexpr const TSymbolUniqueId subpassLoad_SubpassInputMS1_Int1 = TSymbolUniqueId(5358); >+ static constexpr const TSymbolUniqueId pt01j = TSymbolUniqueId(5359); > static constexpr const TSymbolUniqueId subpassLoad_ISubpassInputMS1_Int1 = >- TSymbolUniqueId(4793); >- static constexpr const TSymbolUniqueId pt01k = TSymbolUniqueId(4794); >+ TSymbolUniqueId(5360); >+ static constexpr const TSymbolUniqueId pt01k = TSymbolUniqueId(5361); > static constexpr const TSymbolUniqueId subpassLoad_USubpassInputMS1_Int1 = >- TSymbolUniqueId(4795); >- static constexpr const TSymbolUniqueId pt01l = TSymbolUniqueId(4796); >- static constexpr const TSymbolUniqueId gl_DepthRangeParameters = TSymbolUniqueId(4797); >- static constexpr const TSymbolUniqueId gl_DepthRange = TSymbolUniqueId(4798); >- static constexpr const TSymbolUniqueId gl_NumSamples = TSymbolUniqueId(4799); >- static constexpr const TSymbolUniqueId gl_NumSamplesES3_2 = TSymbolUniqueId(4800); >- static constexpr const TSymbolUniqueId gl_MaxVertexAttribs = TSymbolUniqueId(4801); >- static constexpr const TSymbolUniqueId gl_MaxVertexUniformVectors = TSymbolUniqueId(4802); >- static constexpr const TSymbolUniqueId gl_MaxVertexTextureImageUnits = TSymbolUniqueId(4803); >- static constexpr const TSymbolUniqueId gl_MaxCombinedTextureImageUnits = TSymbolUniqueId(4804); >- static constexpr const TSymbolUniqueId gl_MaxTextureImageUnits = TSymbolUniqueId(4805); >- static constexpr const TSymbolUniqueId gl_MaxFragmentUniformVectors = TSymbolUniqueId(4806); >- static constexpr const TSymbolUniqueId gl_MaxVaryingVectors = TSymbolUniqueId(4807); >- static constexpr const TSymbolUniqueId gl_MaxDrawBuffers = TSymbolUniqueId(4808); >- static constexpr const TSymbolUniqueId gl_MaxDualSourceDrawBuffersEXT = TSymbolUniqueId(4809); >- static constexpr const TSymbolUniqueId gl_MaxVertexOutputVectors = TSymbolUniqueId(4810); >- static constexpr const TSymbolUniqueId gl_MaxFragmentInputVectors = TSymbolUniqueId(4811); >- static constexpr const TSymbolUniqueId gl_MinProgramTexelOffset = TSymbolUniqueId(4812); >- static constexpr const TSymbolUniqueId gl_MaxProgramTexelOffset = TSymbolUniqueId(4813); >- static constexpr const TSymbolUniqueId gl_MaxImageUnits = TSymbolUniqueId(4814); >- static constexpr const TSymbolUniqueId gl_MaxVertexImageUniforms = TSymbolUniqueId(4815); >- static constexpr const TSymbolUniqueId gl_MaxFragmentImageUniforms = TSymbolUniqueId(4816); >- static constexpr const TSymbolUniqueId gl_MaxComputeImageUniforms = TSymbolUniqueId(4817); >- static constexpr const TSymbolUniqueId gl_MaxCombinedImageUniforms = TSymbolUniqueId(4818); >+ TSymbolUniqueId(5362); >+ static constexpr const TSymbolUniqueId pt01l = TSymbolUniqueId(5363); >+ static constexpr const TSymbolUniqueId gl_DepthRangeParameters = TSymbolUniqueId(5364); >+ static constexpr const TSymbolUniqueId gl_DepthRange = TSymbolUniqueId(5365); >+ static constexpr const TSymbolUniqueId gl_NumSamples = TSymbolUniqueId(5366); >+ static constexpr const TSymbolUniqueId gl_NumSamplesES3_2 = TSymbolUniqueId(5367); >+ static constexpr const TSymbolUniqueId gl_MaxVertexAttribs = TSymbolUniqueId(5368); >+ static constexpr const TSymbolUniqueId gl_MaxVertexUniformVectors = TSymbolUniqueId(5369); >+ static constexpr const TSymbolUniqueId gl_MaxVertexTextureImageUnits = TSymbolUniqueId(5370); >+ static constexpr const TSymbolUniqueId gl_MaxCombinedTextureImageUnits = TSymbolUniqueId(5371); >+ static constexpr const TSymbolUniqueId gl_MaxTextureImageUnits = TSymbolUniqueId(5372); >+ static constexpr const TSymbolUniqueId gl_MaxFragmentUniformVectors = TSymbolUniqueId(5373); >+ static constexpr const TSymbolUniqueId gl_MaxVaryingVectors = TSymbolUniqueId(5374); >+ static constexpr const TSymbolUniqueId gl_MaxDrawBuffers = TSymbolUniqueId(5375); >+ static constexpr const TSymbolUniqueId gl_MaxDualSourceDrawBuffersEXT = TSymbolUniqueId(5376); >+ static constexpr const TSymbolUniqueId gl_MaxVertexOutputVectors = TSymbolUniqueId(5377); >+ static constexpr const TSymbolUniqueId gl_MaxFragmentInputVectors = TSymbolUniqueId(5378); >+ static constexpr const TSymbolUniqueId gl_MinProgramTexelOffset = TSymbolUniqueId(5379); >+ static constexpr const TSymbolUniqueId gl_MaxProgramTexelOffset = TSymbolUniqueId(5380); >+ static constexpr const TSymbolUniqueId gl_MaxImageUnits = TSymbolUniqueId(5381); >+ static constexpr const TSymbolUniqueId gl_MaxVertexImageUniforms = TSymbolUniqueId(5382); >+ static constexpr const TSymbolUniqueId gl_MaxFragmentImageUniforms = TSymbolUniqueId(5383); >+ static constexpr const TSymbolUniqueId gl_MaxComputeImageUniforms = TSymbolUniqueId(5384); >+ static constexpr const TSymbolUniqueId gl_MaxCombinedImageUniforms = TSymbolUniqueId(5385); > static constexpr const TSymbolUniqueId gl_MaxCombinedShaderOutputResources = >- TSymbolUniqueId(4819); >- static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupCount = TSymbolUniqueId(4820); >- static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupSize = TSymbolUniqueId(4821); >- static constexpr const TSymbolUniqueId gl_MaxComputeUniformComponents = TSymbolUniqueId(4822); >- static constexpr const TSymbolUniqueId gl_MaxComputeTextureImageUnits = TSymbolUniqueId(4823); >- static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounters = TSymbolUniqueId(4824); >+ TSymbolUniqueId(5386); >+ static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupCount = TSymbolUniqueId(5387); >+ static constexpr const TSymbolUniqueId gl_MaxComputeWorkGroupSize = TSymbolUniqueId(5388); >+ static constexpr const TSymbolUniqueId gl_MaxComputeUniformComponents = TSymbolUniqueId(5389); >+ static constexpr const TSymbolUniqueId gl_MaxComputeTextureImageUnits = TSymbolUniqueId(5390); >+ static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounters = TSymbolUniqueId(5391); > static constexpr const TSymbolUniqueId gl_MaxComputeAtomicCounterBuffers = >- TSymbolUniqueId(4825); >- static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounters = TSymbolUniqueId(4826); >- static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounters = TSymbolUniqueId(4827); >- static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounters = TSymbolUniqueId(4828); >- static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBindings = TSymbolUniqueId(4829); >- static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounterBuffers = TSymbolUniqueId(4830); >+ TSymbolUniqueId(5392); >+ static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounters = TSymbolUniqueId(5393); >+ static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounters = TSymbolUniqueId(5394); >+ static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounters = TSymbolUniqueId(5395); >+ static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBindings = TSymbolUniqueId(5396); >+ static constexpr const TSymbolUniqueId gl_MaxVertexAtomicCounterBuffers = TSymbolUniqueId(5397); > static constexpr const TSymbolUniqueId gl_MaxFragmentAtomicCounterBuffers = >- TSymbolUniqueId(4831); >+ TSymbolUniqueId(5398); > static constexpr const TSymbolUniqueId gl_MaxCombinedAtomicCounterBuffers = >- TSymbolUniqueId(4832); >- static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBufferSize = TSymbolUniqueId(4833); >- static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponents = TSymbolUniqueId(4834); >+ TSymbolUniqueId(5399); >+ static constexpr const TSymbolUniqueId gl_MaxAtomicCounterBufferSize = TSymbolUniqueId(5400); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponents = TSymbolUniqueId(5401); > static constexpr const TSymbolUniqueId gl_MaxGeometryInputComponentsES3_2 = >- TSymbolUniqueId(4835); >- static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponents = TSymbolUniqueId(4836); >+ TSymbolUniqueId(5402); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponents = TSymbolUniqueId(5403); > static constexpr const TSymbolUniqueId gl_MaxGeometryOutputComponentsES3_2 = >- TSymbolUniqueId(4837); >- static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniforms = TSymbolUniqueId(4838); >- static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniformsES3_2 = TSymbolUniqueId(4839); >- static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnits = TSymbolUniqueId(4840); >+ TSymbolUniqueId(5404); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniforms = TSymbolUniqueId(5405); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryImageUniformsES3_2 = TSymbolUniqueId(5406); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnits = TSymbolUniqueId(5407); > static constexpr const TSymbolUniqueId gl_MaxGeometryTextureImageUnitsES3_2 = >- TSymbolUniqueId(4841); >- static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVertices = TSymbolUniqueId(4842); >+ TSymbolUniqueId(5408); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVertices = TSymbolUniqueId(5409); > static constexpr const TSymbolUniqueId gl_MaxGeometryOutputVerticesES3_2 = >- TSymbolUniqueId(4843); >+ TSymbolUniqueId(5410); > static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponents = >- TSymbolUniqueId(4844); >+ TSymbolUniqueId(5411); > static constexpr const TSymbolUniqueId gl_MaxGeometryTotalOutputComponentsES3_2 = >- TSymbolUniqueId(4845); >- static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponents = TSymbolUniqueId(4846); >+ TSymbolUniqueId(5412); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponents = TSymbolUniqueId(5413); > static constexpr const TSymbolUniqueId gl_MaxGeometryUniformComponentsES3_2 = >- TSymbolUniqueId(4847); >- static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounters = TSymbolUniqueId(4848); >+ TSymbolUniqueId(5414); >+ static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounters = TSymbolUniqueId(5415); > static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCountersES3_2 = >- TSymbolUniqueId(4849); >+ TSymbolUniqueId(5416); > static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffers = >- TSymbolUniqueId(4850); >+ TSymbolUniqueId(5417); > static constexpr const TSymbolUniqueId gl_MaxGeometryAtomicCounterBuffersES3_2 = >- TSymbolUniqueId(4851); >- static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponents = TSymbolUniqueId(4852); >+ TSymbolUniqueId(5418); >+ static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponents = TSymbolUniqueId(5419); > static constexpr const TSymbolUniqueId gl_MaxTessControlInputComponentsES3_2 = >- TSymbolUniqueId(4853); >+ TSymbolUniqueId(5420); > static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponents = >- TSymbolUniqueId(4854); >+ TSymbolUniqueId(5421); > static constexpr const TSymbolUniqueId gl_MaxTessControlOutputComponentsES3_2 = >- TSymbolUniqueId(4855); >+ TSymbolUniqueId(5422); > static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnits = >- TSymbolUniqueId(4856); >+ TSymbolUniqueId(5423); > static constexpr const TSymbolUniqueId gl_MaxTessControlTextureImageUnitsES3_2 = >- TSymbolUniqueId(4857); >+ TSymbolUniqueId(5424); > static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponents = >- TSymbolUniqueId(4858); >+ TSymbolUniqueId(5425); > static constexpr const TSymbolUniqueId gl_MaxTessControlUniformComponentsES3_2 = >- TSymbolUniqueId(4859); >+ TSymbolUniqueId(5426); > static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponents = >- TSymbolUniqueId(4860); >+ TSymbolUniqueId(5427); > static constexpr const TSymbolUniqueId gl_MaxTessControlTotalOutputComponentsES3_2 = >- TSymbolUniqueId(4861); >- static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniforms = TSymbolUniqueId(4862); >+ TSymbolUniqueId(5428); >+ static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniforms = TSymbolUniqueId(5429); > static constexpr const TSymbolUniqueId gl_MaxTessControlImageUniformsES3_2 = >- TSymbolUniqueId(4863); >- static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounters = TSymbolUniqueId(4864); >+ TSymbolUniqueId(5430); >+ static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounters = TSymbolUniqueId(5431); > static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCountersES3_2 = >- TSymbolUniqueId(4865); >+ TSymbolUniqueId(5432); > static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffers = >- TSymbolUniqueId(4866); >+ TSymbolUniqueId(5433); > static constexpr const TSymbolUniqueId gl_MaxTessControlAtomicCounterBuffersES3_2 = >- TSymbolUniqueId(4867); >- static constexpr const TSymbolUniqueId gl_MaxTessPatchComponents = TSymbolUniqueId(4868); >- static constexpr const TSymbolUniqueId gl_MaxTessPatchComponentsES3_2 = TSymbolUniqueId(4869); >- static constexpr const TSymbolUniqueId gl_MaxPatchVertices = TSymbolUniqueId(4870); >- static constexpr const TSymbolUniqueId gl_MaxPatchVerticesES3_2 = TSymbolUniqueId(4871); >- static constexpr const TSymbolUniqueId gl_MaxTessGenLevel = TSymbolUniqueId(4872); >- static constexpr const TSymbolUniqueId gl_MaxTessGenLevelES3_2 = TSymbolUniqueId(4873); >+ TSymbolUniqueId(5434); >+ static constexpr const TSymbolUniqueId gl_MaxTessPatchComponents = TSymbolUniqueId(5435); >+ static constexpr const TSymbolUniqueId gl_MaxTessPatchComponentsES3_2 = TSymbolUniqueId(5436); >+ static constexpr const TSymbolUniqueId gl_MaxPatchVertices = TSymbolUniqueId(5437); >+ static constexpr const TSymbolUniqueId gl_MaxPatchVerticesES3_2 = TSymbolUniqueId(5438); >+ static constexpr const TSymbolUniqueId gl_MaxTessGenLevel = TSymbolUniqueId(5439); >+ static constexpr const TSymbolUniqueId gl_MaxTessGenLevelES3_2 = TSymbolUniqueId(5440); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponents = >- TSymbolUniqueId(4874); >+ TSymbolUniqueId(5441); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationInputComponentsES3_2 = >- TSymbolUniqueId(4875); >+ TSymbolUniqueId(5442); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponents = >- TSymbolUniqueId(4876); >+ TSymbolUniqueId(5443); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationOutputComponentsES3_2 = >- TSymbolUniqueId(4877); >+ TSymbolUniqueId(5444); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnits = >- TSymbolUniqueId(4878); >+ TSymbolUniqueId(5445); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationTextureImageUnitsES3_2 = >- TSymbolUniqueId(4879); >+ TSymbolUniqueId(5446); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponents = >- TSymbolUniqueId(4880); >+ TSymbolUniqueId(5447); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationUniformComponentsES3_2 = >- TSymbolUniqueId(4881); >+ TSymbolUniqueId(5448); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniforms = >- TSymbolUniqueId(4882); >+ TSymbolUniqueId(5449); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationImageUniformsES3_2 = >- TSymbolUniqueId(4883); >+ TSymbolUniqueId(5450); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounters = >- TSymbolUniqueId(4884); >+ TSymbolUniqueId(5451); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCountersES3_2 = >- TSymbolUniqueId(4885); >+ TSymbolUniqueId(5452); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffers = >- TSymbolUniqueId(4886); >+ TSymbolUniqueId(5453); > static constexpr const TSymbolUniqueId gl_MaxTessEvaluationAtomicCounterBuffersES3_2 = >- TSymbolUniqueId(4887); >- static constexpr const TSymbolUniqueId gl_MaxSamples = TSymbolUniqueId(4888); >- static constexpr const TSymbolUniqueId gl_MaxSamplesES3_2 = TSymbolUniqueId(4889); >- static constexpr const TSymbolUniqueId gl_MaxClipDistancesAPPLE = TSymbolUniqueId(4890); >- static constexpr const TSymbolUniqueId gl_MaxCullDistancesEXT = TSymbolUniqueId(4891); >+ TSymbolUniqueId(5454); >+ static constexpr const TSymbolUniqueId gl_MaxSamples = TSymbolUniqueId(5455); >+ static constexpr const TSymbolUniqueId gl_MaxSamplesES3_2 = TSymbolUniqueId(5456); >+ static constexpr const TSymbolUniqueId gl_MaxClipDistancesAPPLE = TSymbolUniqueId(5457); >+ static constexpr const TSymbolUniqueId gl_MaxCullDistancesEXT = TSymbolUniqueId(5458); > static constexpr const TSymbolUniqueId gl_MaxCombinedClipAndCullDistancesEXT = >- TSymbolUniqueId(4892); >- static constexpr const TSymbolUniqueId gl_FragCoord = TSymbolUniqueId(4893); >- static constexpr const TSymbolUniqueId gl_FrontFacing = TSymbolUniqueId(4894); >- static constexpr const TSymbolUniqueId gl_PointCoord = TSymbolUniqueId(4895); >- static constexpr const TSymbolUniqueId gl_FragColor = TSymbolUniqueId(4896); >- static constexpr const TSymbolUniqueId gl_FragData = TSymbolUniqueId(4897); >- static constexpr const TSymbolUniqueId gl_FragDepth = TSymbolUniqueId(4898); >- static constexpr const TSymbolUniqueId gl_HelperInvocation = TSymbolUniqueId(4899); >- static constexpr const TSymbolUniqueId gl_FragCoord300 = TSymbolUniqueId(4900); >- static constexpr const TSymbolUniqueId gl_SecondaryFragColorEXT = TSymbolUniqueId(4901); >- static constexpr const TSymbolUniqueId gl_SecondaryFragDataEXT = TSymbolUniqueId(4902); >- static constexpr const TSymbolUniqueId gl_FragDepthEXT = TSymbolUniqueId(4903); >- static constexpr const TSymbolUniqueId gl_LastFragData = TSymbolUniqueId(4904); >- static constexpr const TSymbolUniqueId gl_LastFragDataNonCoherent = TSymbolUniqueId(4905); >- static constexpr const TSymbolUniqueId gl_LastFragColor = TSymbolUniqueId(4906); >- static constexpr const TSymbolUniqueId gl_LastFragDataNV = TSymbolUniqueId(4907); >- static constexpr const TSymbolUniqueId gl_LastFragColorARM = TSymbolUniqueId(4908); >- static constexpr const TSymbolUniqueId gl_PrimitiveID = TSymbolUniqueId(4909); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDES3_2 = TSymbolUniqueId(4910); >- static constexpr const TSymbolUniqueId gl_Layer = TSymbolUniqueId(4911); >- static constexpr const TSymbolUniqueId gl_LayerES3_2 = TSymbolUniqueId(4912); >- static constexpr const TSymbolUniqueId gl_SampleID = TSymbolUniqueId(4913); >- static constexpr const TSymbolUniqueId gl_SampleIDES3_2 = TSymbolUniqueId(4914); >- static constexpr const TSymbolUniqueId gl_SamplePosition = TSymbolUniqueId(4915); >- static constexpr const TSymbolUniqueId gl_SamplePositionES3_2 = TSymbolUniqueId(4916); >- static constexpr const TSymbolUniqueId gl_SampleMaskIn = TSymbolUniqueId(4917); >- static constexpr const TSymbolUniqueId gl_SampleMaskInES3_2 = TSymbolUniqueId(4918); >- static constexpr const TSymbolUniqueId gl_SampleMask = TSymbolUniqueId(4919); >- static constexpr const TSymbolUniqueId gl_SampleMaskES3_2 = TSymbolUniqueId(4920); >- static constexpr const TSymbolUniqueId gl_CullDistance = TSymbolUniqueId(4921); >- static constexpr const TSymbolUniqueId gl_ClipDistance = TSymbolUniqueId(4922); >- static constexpr const TSymbolUniqueId gl_Position = TSymbolUniqueId(4923); >- static constexpr const TSymbolUniqueId gl_PointSize = TSymbolUniqueId(4924); >- static constexpr const TSymbolUniqueId gl_InstanceID = TSymbolUniqueId(4925); >- static constexpr const TSymbolUniqueId gl_InstanceIndex = TSymbolUniqueId(4926); >- static constexpr const TSymbolUniqueId gl_VertexID = TSymbolUniqueId(4927); >- static constexpr const TSymbolUniqueId gl_VertexIndex = TSymbolUniqueId(4928); >- static constexpr const TSymbolUniqueId gl_ViewportIndex = TSymbolUniqueId(4929); >- static constexpr const TSymbolUniqueId gl_LayerVS = TSymbolUniqueId(4930); >- static constexpr const TSymbolUniqueId gl_PointSize300 = TSymbolUniqueId(4931); >- static constexpr const TSymbolUniqueId gl_DrawID = TSymbolUniqueId(4932); >- static constexpr const TSymbolUniqueId gl_BaseVertex = TSymbolUniqueId(4933); >- static constexpr const TSymbolUniqueId gl_BaseInstance = TSymbolUniqueId(4934); >- static constexpr const TSymbolUniqueId angle_BaseVertex = TSymbolUniqueId(4935); >- static constexpr const TSymbolUniqueId angle_BaseInstance = TSymbolUniqueId(4936); >- static constexpr const TSymbolUniqueId gl_ClipDistanceAPPLE = TSymbolUniqueId(4937); >- static constexpr const TSymbolUniqueId gl_CullDistanceEXT = TSymbolUniqueId(4938); >- static constexpr const TSymbolUniqueId gl_NumWorkGroups = TSymbolUniqueId(4939); >- static constexpr const TSymbolUniqueId gl_WorkGroupSize = TSymbolUniqueId(4940); >- static constexpr const TSymbolUniqueId gl_WorkGroupID = TSymbolUniqueId(4941); >- static constexpr const TSymbolUniqueId gl_LocalInvocationID = TSymbolUniqueId(4942); >- static constexpr const TSymbolUniqueId gl_GlobalInvocationID = TSymbolUniqueId(4943); >- static constexpr const TSymbolUniqueId gl_LocalInvocationIndex = TSymbolUniqueId(4944); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDIn = TSymbolUniqueId(4945); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDInES3_2 = TSymbolUniqueId(4946); >- static constexpr const TSymbolUniqueId gl_InvocationID = TSymbolUniqueId(4947); >- static constexpr const TSymbolUniqueId gl_InvocationIDES3_2 = TSymbolUniqueId(4948); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDGS = TSymbolUniqueId(4949); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDGSES3_2 = TSymbolUniqueId(4950); >- static constexpr const TSymbolUniqueId gl_LayerGS = TSymbolUniqueId(4951); >- static constexpr const TSymbolUniqueId gl_LayerGSES3_2 = TSymbolUniqueId(4952); >- static constexpr const TSymbolUniqueId gl_PerVertex = TSymbolUniqueId(4953); >- static constexpr const TSymbolUniqueId gl_PerVertexES3_2 = TSymbolUniqueId(4954); >- static constexpr const TSymbolUniqueId gl_in = TSymbolUniqueId(4955); >- static constexpr const TSymbolUniqueId gl_inES3_2 = TSymbolUniqueId(4956); >- static constexpr const TSymbolUniqueId gl_PerVertexOutBlock = TSymbolUniqueId(4957); >- static constexpr const TSymbolUniqueId gl_PerVertexOutBlockES3_2 = TSymbolUniqueId(4958); >- static constexpr const TSymbolUniqueId gl_PositionGS = TSymbolUniqueId(4959); >- static constexpr const TSymbolUniqueId gl_PositionGSES3_2 = TSymbolUniqueId(4960); >- static constexpr const TSymbolUniqueId gl_PatchVerticesInTCS = TSymbolUniqueId(4961); >- static constexpr const TSymbolUniqueId gl_PatchVerticesInTCSES3_2 = TSymbolUniqueId(4962); >- static constexpr const TSymbolUniqueId gl_InvocationIDTCS = TSymbolUniqueId(4963); >- static constexpr const TSymbolUniqueId gl_InvocationIDTCSES3_2 = TSymbolUniqueId(4964); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDTCS = TSymbolUniqueId(4965); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDTCSES3_2 = TSymbolUniqueId(4966); >- static constexpr const TSymbolUniqueId gl_TessLevelOuterTCS = TSymbolUniqueId(4967); >- static constexpr const TSymbolUniqueId gl_TessLevelOuterTCSES3_2 = TSymbolUniqueId(4968); >- static constexpr const TSymbolUniqueId gl_TessLevelInnerTCS = TSymbolUniqueId(4969); >- static constexpr const TSymbolUniqueId gl_TessLevelInnerTCSES3_2 = TSymbolUniqueId(4970); >- static constexpr const TSymbolUniqueId gl_PerVertexTCS = TSymbolUniqueId(4971); >- static constexpr const TSymbolUniqueId gl_PerVertexTCSES3_2 = TSymbolUniqueId(4972); >- static constexpr const TSymbolUniqueId gl_inTCS = TSymbolUniqueId(4973); >- static constexpr const TSymbolUniqueId gl_inTCSES3_2 = TSymbolUniqueId(4974); >- static constexpr const TSymbolUniqueId gl_outTCS = TSymbolUniqueId(4975); >- static constexpr const TSymbolUniqueId gl_outTCSES3_2 = TSymbolUniqueId(4976); >- static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlock = TSymbolUniqueId(4977); >- static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlockES3_2 = TSymbolUniqueId(4978); >- static constexpr const TSymbolUniqueId gl_PositionTCS = TSymbolUniqueId(4979); >- static constexpr const TSymbolUniqueId gl_PositionTCSES3_2 = TSymbolUniqueId(4980); >- static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCS = TSymbolUniqueId(4981); >- static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCSES3_2 = TSymbolUniqueId(4982); >- static constexpr const TSymbolUniqueId gl_PatchVerticesInTES = TSymbolUniqueId(4983); >- static constexpr const TSymbolUniqueId gl_PatchVerticesInTESES3_2 = TSymbolUniqueId(4984); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDTES = TSymbolUniqueId(4985); >- static constexpr const TSymbolUniqueId gl_PrimitiveIDTESES3_2 = TSymbolUniqueId(4986); >- static constexpr const TSymbolUniqueId gl_TessCoord = TSymbolUniqueId(4987); >- static constexpr const TSymbolUniqueId gl_TessLevelOuterTES = TSymbolUniqueId(4988); >- static constexpr const TSymbolUniqueId gl_TessLevelOuterTESES3_2 = TSymbolUniqueId(4989); >- static constexpr const TSymbolUniqueId gl_TessLevelInnerTES = TSymbolUniqueId(4990); >- static constexpr const TSymbolUniqueId gl_TessLevelInnerTESES3_2 = TSymbolUniqueId(4991); >- static constexpr const TSymbolUniqueId gl_PerVertexTES = TSymbolUniqueId(4992); >- static constexpr const TSymbolUniqueId gl_PerVertexTESES3_2 = TSymbolUniqueId(4993); >- static constexpr const TSymbolUniqueId gl_inTES = TSymbolUniqueId(4994); >- static constexpr const TSymbolUniqueId gl_inTESES3_2 = TSymbolUniqueId(4995); >- static constexpr const TSymbolUniqueId gl_outTES = TSymbolUniqueId(4996); >- static constexpr const TSymbolUniqueId gl_outTESES3_2 = TSymbolUniqueId(4997); >- static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlock = TSymbolUniqueId(4998); >- static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlockES3_2 = TSymbolUniqueId(4999); >- static constexpr const TSymbolUniqueId gl_PositionTES = TSymbolUniqueId(5000); >- static constexpr const TSymbolUniqueId gl_PositionTESES3_2 = TSymbolUniqueId(5001); >- static constexpr const TSymbolUniqueId gl_ViewID_OVR = TSymbolUniqueId(5002); >+ TSymbolUniqueId(5459); >+ static constexpr const TSymbolUniqueId gl_FragCoord = TSymbolUniqueId(5460); >+ static constexpr const TSymbolUniqueId gl_FrontFacing = TSymbolUniqueId(5461); >+ static constexpr const TSymbolUniqueId gl_PointCoord = TSymbolUniqueId(5462); >+ static constexpr const TSymbolUniqueId gl_FragColor = TSymbolUniqueId(5463); >+ static constexpr const TSymbolUniqueId gl_FragData = TSymbolUniqueId(5464); >+ static constexpr const TSymbolUniqueId gl_FragDepth = TSymbolUniqueId(5465); >+ static constexpr const TSymbolUniqueId gl_HelperInvocation = TSymbolUniqueId(5466); >+ static constexpr const TSymbolUniqueId gl_FragCoord300 = TSymbolUniqueId(5467); >+ static constexpr const TSymbolUniqueId gl_SecondaryFragColorEXT = TSymbolUniqueId(5468); >+ static constexpr const TSymbolUniqueId gl_SecondaryFragDataEXT = TSymbolUniqueId(5469); >+ static constexpr const TSymbolUniqueId gl_FragDepthEXT = TSymbolUniqueId(5470); >+ static constexpr const TSymbolUniqueId gl_LastFragData = TSymbolUniqueId(5471); >+ static constexpr const TSymbolUniqueId gl_LastFragDataNonCoherent = TSymbolUniqueId(5472); >+ static constexpr const TSymbolUniqueId gl_LastFragColor = TSymbolUniqueId(5473); >+ static constexpr const TSymbolUniqueId gl_LastFragDataNV = TSymbolUniqueId(5474); >+ static constexpr const TSymbolUniqueId gl_LastFragColorARM = TSymbolUniqueId(5475); >+ static constexpr const TSymbolUniqueId gl_PrimitiveID = TSymbolUniqueId(5476); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDES3_2 = TSymbolUniqueId(5477); >+ static constexpr const TSymbolUniqueId gl_Layer = TSymbolUniqueId(5478); >+ static constexpr const TSymbolUniqueId gl_LayerES3_2 = TSymbolUniqueId(5479); >+ static constexpr const TSymbolUniqueId gl_SampleID = TSymbolUniqueId(5480); >+ static constexpr const TSymbolUniqueId gl_SampleIDES3_2 = TSymbolUniqueId(5481); >+ static constexpr const TSymbolUniqueId gl_SamplePosition = TSymbolUniqueId(5482); >+ static constexpr const TSymbolUniqueId gl_SamplePositionES3_2 = TSymbolUniqueId(5483); >+ static constexpr const TSymbolUniqueId gl_SampleMaskIn = TSymbolUniqueId(5484); >+ static constexpr const TSymbolUniqueId gl_SampleMaskInES3_2 = TSymbolUniqueId(5485); >+ static constexpr const TSymbolUniqueId gl_SampleMask = TSymbolUniqueId(5486); >+ static constexpr const TSymbolUniqueId gl_SampleMaskES3_2 = TSymbolUniqueId(5487); >+ static constexpr const TSymbolUniqueId gl_CullDistance = TSymbolUniqueId(5488); >+ static constexpr const TSymbolUniqueId gl_ClipDistance = TSymbolUniqueId(5489); >+ static constexpr const TSymbolUniqueId gl_Position = TSymbolUniqueId(5490); >+ static constexpr const TSymbolUniqueId gl_PointSize = TSymbolUniqueId(5491); >+ static constexpr const TSymbolUniqueId gl_InstanceID = TSymbolUniqueId(5492); >+ static constexpr const TSymbolUniqueId gl_InstanceIndex = TSymbolUniqueId(5493); >+ static constexpr const TSymbolUniqueId gl_VertexID = TSymbolUniqueId(5494); >+ static constexpr const TSymbolUniqueId gl_VertexIndex = TSymbolUniqueId(5495); >+ static constexpr const TSymbolUniqueId gl_ViewportIndex = TSymbolUniqueId(5496); >+ static constexpr const TSymbolUniqueId gl_LayerVS = TSymbolUniqueId(5497); >+ static constexpr const TSymbolUniqueId gl_PointSize300 = TSymbolUniqueId(5498); >+ static constexpr const TSymbolUniqueId gl_DrawID = TSymbolUniqueId(5499); >+ static constexpr const TSymbolUniqueId gl_BaseVertex = TSymbolUniqueId(5500); >+ static constexpr const TSymbolUniqueId gl_BaseInstance = TSymbolUniqueId(5501); >+ static constexpr const TSymbolUniqueId angle_BaseVertex = TSymbolUniqueId(5502); >+ static constexpr const TSymbolUniqueId angle_BaseInstance = TSymbolUniqueId(5503); >+ static constexpr const TSymbolUniqueId gl_ClipDistanceAPPLE = TSymbolUniqueId(5504); >+ static constexpr const TSymbolUniqueId gl_CullDistanceEXT = TSymbolUniqueId(5505); >+ static constexpr const TSymbolUniqueId gl_NumWorkGroups = TSymbolUniqueId(5506); >+ static constexpr const TSymbolUniqueId gl_WorkGroupSize = TSymbolUniqueId(5507); >+ static constexpr const TSymbolUniqueId gl_WorkGroupID = TSymbolUniqueId(5508); >+ static constexpr const TSymbolUniqueId gl_LocalInvocationID = TSymbolUniqueId(5509); >+ static constexpr const TSymbolUniqueId gl_GlobalInvocationID = TSymbolUniqueId(5510); >+ static constexpr const TSymbolUniqueId gl_LocalInvocationIndex = TSymbolUniqueId(5511); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDIn = TSymbolUniqueId(5512); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDInES3_2 = TSymbolUniqueId(5513); >+ static constexpr const TSymbolUniqueId gl_InvocationID = TSymbolUniqueId(5514); >+ static constexpr const TSymbolUniqueId gl_InvocationIDES3_2 = TSymbolUniqueId(5515); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDGS = TSymbolUniqueId(5516); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDGSES3_2 = TSymbolUniqueId(5517); >+ static constexpr const TSymbolUniqueId gl_LayerGS = TSymbolUniqueId(5518); >+ static constexpr const TSymbolUniqueId gl_LayerGSES3_2 = TSymbolUniqueId(5519); >+ static constexpr const TSymbolUniqueId gl_PerVertex = TSymbolUniqueId(5520); >+ static constexpr const TSymbolUniqueId gl_PerVertexES3_2 = TSymbolUniqueId(5521); >+ static constexpr const TSymbolUniqueId gl_in = TSymbolUniqueId(5522); >+ static constexpr const TSymbolUniqueId gl_inES3_2 = TSymbolUniqueId(5523); >+ static constexpr const TSymbolUniqueId gl_PerVertexOutBlock = TSymbolUniqueId(5524); >+ static constexpr const TSymbolUniqueId gl_PerVertexOutBlockES3_2 = TSymbolUniqueId(5525); >+ static constexpr const TSymbolUniqueId gl_PositionGS = TSymbolUniqueId(5526); >+ static constexpr const TSymbolUniqueId gl_PositionGSES3_2 = TSymbolUniqueId(5527); >+ static constexpr const TSymbolUniqueId gl_PatchVerticesInTCS = TSymbolUniqueId(5528); >+ static constexpr const TSymbolUniqueId gl_PatchVerticesInTCSES3_2 = TSymbolUniqueId(5529); >+ static constexpr const TSymbolUniqueId gl_InvocationIDTCS = TSymbolUniqueId(5530); >+ static constexpr const TSymbolUniqueId gl_InvocationIDTCSES3_2 = TSymbolUniqueId(5531); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDTCS = TSymbolUniqueId(5532); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDTCSES3_2 = TSymbolUniqueId(5533); >+ static constexpr const TSymbolUniqueId gl_TessLevelOuterTCS = TSymbolUniqueId(5534); >+ static constexpr const TSymbolUniqueId gl_TessLevelOuterTCSES3_2 = TSymbolUniqueId(5535); >+ static constexpr const TSymbolUniqueId gl_TessLevelInnerTCS = TSymbolUniqueId(5536); >+ static constexpr const TSymbolUniqueId gl_TessLevelInnerTCSES3_2 = TSymbolUniqueId(5537); >+ static constexpr const TSymbolUniqueId gl_PerVertexTCS = TSymbolUniqueId(5538); >+ static constexpr const TSymbolUniqueId gl_PerVertexTCSES3_2 = TSymbolUniqueId(5539); >+ static constexpr const TSymbolUniqueId gl_inTCS = TSymbolUniqueId(5540); >+ static constexpr const TSymbolUniqueId gl_inTCSES3_2 = TSymbolUniqueId(5541); >+ static constexpr const TSymbolUniqueId gl_outTCS = TSymbolUniqueId(5542); >+ static constexpr const TSymbolUniqueId gl_outTCSES3_2 = TSymbolUniqueId(5543); >+ static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlock = TSymbolUniqueId(5544); >+ static constexpr const TSymbolUniqueId gl_PerVertexOutTcsBlockES3_2 = TSymbolUniqueId(5545); >+ static constexpr const TSymbolUniqueId gl_PositionTCS = TSymbolUniqueId(5546); >+ static constexpr const TSymbolUniqueId gl_PositionTCSES3_2 = TSymbolUniqueId(5547); >+ static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCS = TSymbolUniqueId(5548); >+ static constexpr const TSymbolUniqueId gl_BoundingBoxEXTTCSES3_2 = TSymbolUniqueId(5549); >+ static constexpr const TSymbolUniqueId gl_PatchVerticesInTES = TSymbolUniqueId(5550); >+ static constexpr const TSymbolUniqueId gl_PatchVerticesInTESES3_2 = TSymbolUniqueId(5551); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDTES = TSymbolUniqueId(5552); >+ static constexpr const TSymbolUniqueId gl_PrimitiveIDTESES3_2 = TSymbolUniqueId(5553); >+ static constexpr const TSymbolUniqueId gl_TessCoord = TSymbolUniqueId(5554); >+ static constexpr const TSymbolUniqueId gl_TessLevelOuterTES = TSymbolUniqueId(5555); >+ static constexpr const TSymbolUniqueId gl_TessLevelOuterTESES3_2 = TSymbolUniqueId(5556); >+ static constexpr const TSymbolUniqueId gl_TessLevelInnerTES = TSymbolUniqueId(5557); >+ static constexpr const TSymbolUniqueId gl_TessLevelInnerTESES3_2 = TSymbolUniqueId(5558); >+ static constexpr const TSymbolUniqueId gl_PerVertexTES = TSymbolUniqueId(5559); >+ static constexpr const TSymbolUniqueId gl_PerVertexTESES3_2 = TSymbolUniqueId(5560); >+ static constexpr const TSymbolUniqueId gl_inTES = TSymbolUniqueId(5561); >+ static constexpr const TSymbolUniqueId gl_inTESES3_2 = TSymbolUniqueId(5562); >+ static constexpr const TSymbolUniqueId gl_outTES = TSymbolUniqueId(5563); >+ static constexpr const TSymbolUniqueId gl_outTESES3_2 = TSymbolUniqueId(5564); >+ static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlock = TSymbolUniqueId(5565); >+ static constexpr const TSymbolUniqueId gl_PerVertexOutTesBlockES3_2 = TSymbolUniqueId(5566); >+ static constexpr const TSymbolUniqueId gl_PositionTES = TSymbolUniqueId(5567); >+ static constexpr const TSymbolUniqueId gl_PositionTESES3_2 = TSymbolUniqueId(5568); >+ static constexpr const TSymbolUniqueId gl_ViewID_OVR = TSymbolUniqueId(5569); > > }; // class BuiltInId > >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.cpp >index bb963a52e38a2d8962e2b4d4b2644a41654e39d9..43f8e7778fb6939abeeec75b497a8274cc32888e 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.cpp >@@ -26,7 +26,7 @@ constexpr ImmutableString kEmulatedDepthRangeParams = ImmutableString("ANGLEDept > > constexpr const char kViewport[] = "viewport"; > constexpr const char kClipDistancesEnabled[] = "clipDistancesEnabled"; >-constexpr const char kXfbActiveUnpaused[] = "xfbActiveUnpaused"; >+constexpr const char kUnused[] = "_unused"; > constexpr const char kXfbVerticesPerInstance[] = "xfbVerticesPerInstance"; > constexpr const char kXfbBufferOffsets[] = "xfbBufferOffsets"; > constexpr const char kAcbBufferOffsets[] = "acbBufferOffsets"; >@@ -81,7 +81,7 @@ TFieldList *DriverUniform::createUniformFields(TSymbolTable *symbolTable) > { > constexpr size_t kNumGraphicsDriverUniforms = 8; > constexpr std::array<const char *, kNumGraphicsDriverUniforms> kGraphicsDriverUniformNames = { >- {kViewport, kClipDistancesEnabled, kXfbActiveUnpaused, kXfbVerticesPerInstance, kNumSamples, >+ {kViewport, kClipDistancesEnabled, kUnused, kXfbVerticesPerInstance, kNumSamples, > kXfbBufferOffsets, kAcbBufferOffsets, kDepthRange}}; > > // This field list mirrors the structure of GraphicsDriverUniforms in ContextVk.cpp. >@@ -91,7 +91,7 @@ TFieldList *DriverUniform::createUniformFields(TSymbolTable *symbolTable) > new TType(EbtFloat, EbpHigh, EvqGlobal, 4), > new TType(EbtUInt, EbpHigh, > EvqGlobal), // uint clipDistancesEnabled; // 32 bits for 32 clip distances max >- new TType(EbtUInt, EbpLow, EvqGlobal), // uint xfbActiveUnpaused; // 1 bit >+ new TType(EbtUInt, EbpHigh, EvqGlobal), // Gap usable for future > new TType(EbtInt, EbpHigh, EvqGlobal), > new TType(EbtInt, EbpLow, EvqGlobal), // uint numSamples; // Up to 16 > new TType(EbtInt, EbpHigh, EvqGlobal, 4), >@@ -189,7 +189,7 @@ bool DriverUniform::addGraphicsDriverUniformsToShader(TIntermBlock *root, TSymbo > return mDriverUniforms != nullptr; > } > >-TIntermBinary *DriverUniform::createDriverUniformRef(const char *fieldName) const >+TIntermTyped *DriverUniform::createDriverUniformRef(const char *fieldName) const > { > size_t fieldIndex = 0; > if (mMode == DriverUniformMode::InterfaceBlock) >@@ -214,49 +214,44 @@ TIntermBinary *DriverUniform::createDriverUniformRef(const char *fieldName) cons > return new TIntermBinary(EOpIndexDirectStruct, angleUniformsRef, indexRef); > } > >-TIntermBinary *DriverUniform::getViewportRef() const >+TIntermTyped *DriverUniform::getViewportRef() const > { > return createDriverUniformRef(kViewport); > } > >-TIntermBinary *DriverUniform::getAbcBufferOffsets() const >+TIntermTyped *DriverUniform::getAbcBufferOffsets() const > { > return createDriverUniformRef(kAcbBufferOffsets); > } > >-TIntermBinary *DriverUniform::getXfbActiveUnpaused() const >-{ >- return createDriverUniformRef(kXfbActiveUnpaused); >-} >- >-TIntermBinary *DriverUniform::getXfbVerticesPerInstance() const >+TIntermTyped *DriverUniform::getXfbVerticesPerInstance() const > { > return createDriverUniformRef(kXfbVerticesPerInstance); > } > >-TIntermBinary *DriverUniform::getXfbBufferOffsets() const >+TIntermTyped *DriverUniform::getXfbBufferOffsets() const > { > return createDriverUniformRef(kXfbBufferOffsets); > } > >-TIntermBinary *DriverUniform::getClipDistancesEnabled() const >+TIntermTyped *DriverUniform::getClipDistancesEnabled() const > { > return createDriverUniformRef(kClipDistancesEnabled); > } > >-TIntermBinary *DriverUniform::getDepthRangeRef() const >+TIntermTyped *DriverUniform::getDepthRangeRef() const > { > return createDriverUniformRef(kDepthRange); > } > >-TIntermBinary *DriverUniform::getDepthRangeReservedFieldRef() const >+TIntermTyped *DriverUniform::getDepthRangeReservedFieldRef() const > { >- TIntermBinary *depthRange = createDriverUniformRef(kDepthRange); >+ TIntermTyped *depthRange = createDriverUniformRef(kDepthRange); > > return new TIntermBinary(EOpIndexDirectStruct, depthRange, CreateIndexNode(3)); > } > >-TIntermBinary *DriverUniform::getNumSamplesRef() const >+TIntermTyped *DriverUniform::getNumSamplesRef() const > { > return createDriverUniformRef(kNumSamples); > } >@@ -296,48 +291,38 @@ TFieldList *DriverUniformExtended::createUniformFields(TSymbolTable *symbolTable > return driverFieldList; > } > >-TIntermBinary *DriverUniformExtended::getFlipXYRef() const >+TIntermTyped *DriverUniformExtended::getFlipXYRef() const > { > return createDriverUniformRef(kFlipXY); > } > >-TIntermBinary *DriverUniformExtended::getNegFlipXYRef() const >+TIntermTyped *DriverUniformExtended::getNegFlipXYRef() const > { > return createDriverUniformRef(kNegFlipXY); > } > >-TIntermSwizzle *DriverUniformExtended::getNegFlipYRef() const >+TIntermTyped *DriverUniformExtended::getNegFlipYRef() const > { > // Create a swizzle to "negFlipXY.y" >- TIntermBinary *negFlipXY = createDriverUniformRef(kNegFlipXY); >+ TIntermTyped *negFlipXY = createDriverUniformRef(kNegFlipXY); > TVector<int> swizzleOffsetY = {1}; > TIntermSwizzle *negFlipY = new TIntermSwizzle(negFlipXY, swizzleOffsetY); > return negFlipY; > } > >-TIntermBinary *DriverUniformExtended::getPreRotationMatrixRef() const >+TIntermTyped *DriverUniformExtended::getPreRotationMatrixRef() const > { > return createDriverUniformRef(kPreRotation); > } > >-TIntermBinary *DriverUniformExtended::getFragRotationMatrixRef() const >+TIntermTyped *DriverUniformExtended::getFragRotationMatrixRef() const > { > return createDriverUniformRef(kFragRotation); > } > >-TIntermBinary *DriverUniformExtended::getHalfRenderAreaRef() const >+TIntermTyped *DriverUniformExtended::getHalfRenderAreaRef() const > { > return createDriverUniformRef(kHalfRenderArea); > } > >-TIntermBinary *DriverUniformExtended::getEmulatedInstanceId() const >-{ >- return createDriverUniformRef(kEmulatedInstanceId); >-} >- >-TIntermBinary *DriverUniformExtended::getCoverageMask() const >-{ >- return createDriverUniformRef(kCoverageMask); >-} >- > } // namespace sh >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.h >index 2732a0b81bd9e0801cf74f2c6b8b22a2090e3eb4..ac713d9ad9e5ea5e76509eff836bdfc28d5eac1a 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/DriverUniform.h >@@ -45,29 +45,26 @@ class DriverUniform > bool addComputeDriverUniformsToShader(TIntermBlock *root, TSymbolTable *symbolTable); > bool addGraphicsDriverUniformsToShader(TIntermBlock *root, TSymbolTable *symbolTable); > >- TIntermBinary *getViewportRef() const; >- TIntermBinary *getAbcBufferOffsets() const; >- TIntermBinary *getXfbActiveUnpaused() const; >- TIntermBinary *getXfbVerticesPerInstance() const; >- TIntermBinary *getXfbBufferOffsets() const; >- TIntermBinary *getClipDistancesEnabled() const; >- TIntermBinary *getDepthRangeRef() const; >- TIntermBinary *getDepthRangeReservedFieldRef() const; >- TIntermBinary *getNumSamplesRef() const; >- >- virtual TIntermBinary *getFlipXYRef() const { return nullptr; } >- virtual TIntermBinary *getNegFlipXYRef() const { return nullptr; } >- virtual TIntermBinary *getPreRotationMatrixRef() const { return nullptr; } >- virtual TIntermBinary *getFragRotationMatrixRef() const { return nullptr; } >- virtual TIntermBinary *getHalfRenderAreaRef() const { return nullptr; } >- virtual TIntermSwizzle *getNegFlipYRef() const { return nullptr; } >- virtual TIntermBinary *getEmulatedInstanceId() const { return nullptr; } >- virtual TIntermBinary *getCoverageMask() const { return nullptr; } >+ TIntermTyped *getViewportRef() const; >+ TIntermTyped *getAbcBufferOffsets() const; >+ TIntermTyped *getXfbVerticesPerInstance() const; >+ TIntermTyped *getXfbBufferOffsets() const; >+ TIntermTyped *getClipDistancesEnabled() const; >+ TIntermTyped *getDepthRangeRef() const; >+ TIntermTyped *getDepthRangeReservedFieldRef() const; >+ TIntermTyped *getNumSamplesRef() const; >+ >+ virtual TIntermTyped *getFlipXYRef() const { return nullptr; } >+ virtual TIntermTyped *getNegFlipXYRef() const { return nullptr; } >+ virtual TIntermTyped *getPreRotationMatrixRef() const { return nullptr; } >+ virtual TIntermTyped *getFragRotationMatrixRef() const { return nullptr; } >+ virtual TIntermTyped *getHalfRenderAreaRef() const { return nullptr; } >+ virtual TIntermTyped *getNegFlipYRef() const { return nullptr; } > > const TVariable *getDriverUniformsVariable() const { return mDriverUniforms; } > > protected: >- TIntermBinary *createDriverUniformRef(const char *fieldName) const; >+ TIntermTyped *createDriverUniformRef(const char *fieldName) const; > virtual TFieldList *createUniformFields(TSymbolTable *symbolTable); > TType *createEmulatedDepthRangeType(TSymbolTable *symbolTable); > >@@ -82,14 +79,12 @@ class DriverUniformExtended : public DriverUniform > DriverUniformExtended(DriverUniformMode mode) : DriverUniform(mode) {} > virtual ~DriverUniformExtended() override {} > >- TIntermBinary *getFlipXYRef() const override; >- TIntermBinary *getNegFlipXYRef() const override; >- TIntermBinary *getPreRotationMatrixRef() const override; >- TIntermBinary *getFragRotationMatrixRef() const override; >- TIntermBinary *getHalfRenderAreaRef() const override; >- TIntermSwizzle *getNegFlipYRef() const override; >- TIntermBinary *getEmulatedInstanceId() const override; >- TIntermBinary *getCoverageMask() const override; >+ TIntermTyped *getFlipXYRef() const override; >+ TIntermTyped *getNegFlipXYRef() const override; >+ TIntermTyped *getPreRotationMatrixRef() const override; >+ TIntermTyped *getFragRotationMatrixRef() const override; >+ TIntermTyped *getHalfRenderAreaRef() const override; >+ TIntermTyped *getNegFlipYRef() const override; > > protected: > virtual TFieldList *createUniformFields(TSymbolTable *symbolTable) override; >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp >index b082dd7221149ea7f2142a51a056b8df6c029e8d..8565e3d90125cc118c866191d957906eeb4f23e8 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/ReplaceArrayOfMatrixVarying.cpp >@@ -120,7 +120,7 @@ ANGLE_NO_DISCARD bool ReplaceArrayOfMatrixVarying(TCompiler *compiler, > { > TIntermBinary *tempMatrixIndexed = > new TIntermBinary(EOpIndexDirect, tempReplaceSymbol->deepCopy(), CreateIndexNode(i)); >- for (int col = 0; col < type.getCols(); ++col) >+ for (uint8_t col = 0; col < type.getCols(); ++col) > { > > TIntermBinary *tempMatrixColIndexed = new TIntermBinary( >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.cpp >index 41fcfc27d0e93cebca2d548a5d90142dd844ecf2..7993673253e9bb397f553518a4d9966cf6b4c377 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.cpp >@@ -494,7 +494,7 @@ TIntermSymbol *SpecConst::getDrawableHeight() > return new TIntermSymbol(mDrawableHeightVar); > } > >-TIntermBinary *SpecConst::getHalfRenderArea() >+TIntermTyped *SpecConst::getHalfRenderArea() > { > if ((mCompileOptions & SH_USE_SPECIALIZATION_CONSTANT) == 0) > { >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.h b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.h >index e4ac8c30e25051413113b0ea495c20a6a606321d..3f61bb0feee08d18b0f5f7fb9ab116addc191253 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.h >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/tree_util/SpecializationConstant.h >@@ -43,7 +43,7 @@ class SpecConst > TIntermTyped *getFragRotationMultiplyFlipXY(); > > // Half render area >- TIntermBinary *getHalfRenderArea(); >+ TIntermTyped *getHalfRenderArea(); > > void declareSpecConsts(TIntermBlock *root); > SpecConstUsageBits getSpecConstUsageBits() const { return mUsageBits; } >diff --git a/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp b/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp >index 674689cb623599d88574a470346b5018a7b90112..7f829c5450d9f0ffc03e3a799a89b87e05306709 100644 >--- a/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp >+++ b/Source/ThirdParty/ANGLE/src/compiler/translator/util.cpp >@@ -990,7 +990,8 @@ bool IsPrecisionApplicableToType(TBasicType type) > > bool IsRedeclarableBuiltIn(const ImmutableString &name) > { >- return name == "gl_ClipDistance" || name == "gl_CullDistance" || name == "gl_LastFragData"; >+ return name == "gl_ClipDistance" || name == "gl_CullDistance" || name == "gl_LastFragData" || >+ name == "gl_PerVertex" || name == "gl_Position" || name == "gl_PointSize"; > } > > size_t FindFieldIndex(const TFieldList &fieldList, const char *fieldName) >diff --git a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.cpp b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.cpp >index 15ab497c2a0bd3676f3dfec28d179501bf18494a..37af6781d1ea57378703d76aceaaa54792eb2c16 100644 >--- a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.cpp >+++ b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.cpp >@@ -47,6 +47,8 @@ std::string VendorName(VendorID vendor) > return "VMWare"; > case kVendorID_Apple: > return "Apple"; >+ case kVendorID_Microsoft: >+ return "Microsoft"; > default: > return "Unknown (" + std::to_string(vendor) + ")"; > } >@@ -165,6 +167,11 @@ bool IsApple(VendorID vendorId) > return vendorId == kVendorID_Apple; > } > >+bool IsMicrosoft(VendorID vendorId) >+{ >+ return vendorId == kVendorID_Microsoft; >+} >+ > bool ParseAMDBrahmaDriverVersion(const std::string &content, std::string *version) > { > const size_t begin = content.find_first_of("0123456789"); >@@ -298,7 +305,9 @@ void PrintSystemInfo(const SystemInfo &info) > const auto &gpu = info.gpus[i]; > > std::cout << " " << i << " - " << VendorName(gpu.vendorId) << " device id: 0x" << std::hex >- << std::uppercase << gpu.deviceId << std::dec << "\n"; >+ << std::uppercase << gpu.deviceId << std::dec << ", revision id: 0x" << std::hex >+ << std::uppercase << gpu.revisionId << std::dec << ", system device id: 0x" >+ << std::hex << std::uppercase << gpu.systemDeviceId << std::dec << "\n"; > if (!gpu.driverVendor.empty()) > { > std::cout << " Driver Vendor: " << gpu.driverVendor << "\n"; >@@ -311,6 +320,15 @@ void PrintSystemInfo(const SystemInfo &info) > { > std::cout << " Driver Date: " << gpu.driverDate << "\n"; > } >+ if (gpu.detailedDriverVersion.major != 0 || gpu.detailedDriverVersion.minor != 0 || >+ gpu.detailedDriverVersion.subMinor != 0 || gpu.detailedDriverVersion.patch != 0) >+ { >+ std::cout << " Detailed Driver Version:\n" >+ << " major: " << gpu.detailedDriverVersion.major >+ << " minor: " << gpu.detailedDriverVersion.minor >+ << " subMinor: " << gpu.detailedDriverVersion.subMinor >+ << " patch: " << gpu.detailedDriverVersion.patch << "\n"; >+ } > } > > std::cout << "\n"; >@@ -319,12 +337,18 @@ void PrintSystemInfo(const SystemInfo &info) > std::cout << "\n"; > std::cout << "Optimus: " << (info.isOptimus ? "true" : "false") << "\n"; > std::cout << "AMD Switchable: " << (info.isAMDSwitchable ? "true" : "false") << "\n"; >+ std::cout << "Mac Switchable: " << (info.isMacSwitchable ? "true" : "false") << "\n"; >+ std::cout << "Needs EAGL on Mac: " << (info.needsEAGLOnMac ? "true" : "false") << "\n"; > > std::cout << "\n"; > if (!info.machineManufacturer.empty()) > { > std::cout << "Machine Manufacturer: " << info.machineManufacturer << "\n"; > } >+ if (info.androidSdkLevel != 0) >+ { >+ std::cout << "Android SDK Level: " << info.androidSdkLevel << "\n"; >+ } > if (!info.machineModelName.empty()) > { > std::cout << "Machine Model: " << info.machineModelName << "\n"; >@@ -345,4 +369,20 @@ VersionInfo ParseNvidiaDriverVersion(uint32_t version) > version & 0x3f // patch > }; > } >+ >+uint64_t GetSystemDeviceIdFromParts(uint32_t highPart, uint32_t lowPart) >+{ >+ return (static_cast<uint64_t>(highPart) << 32) | lowPart; >+} >+ >+uint32_t GetSystemDeviceIdHighPart(uint64_t systemDeviceId) >+{ >+ return (systemDeviceId >> 32) & 0xffffffff; >+} >+ >+uint32_t GetSystemDeviceIdLowPart(uint64_t systemDeviceId) >+{ >+ return systemDeviceId & 0xffffffff; >+} >+ > } // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.h b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.h >index b7934ac5e6f1ee257f71d38ba21f69ebd76c3e2a..c57cff2ca09cf5f59d4ea3369acb76c25a98effa 100644 >--- a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.h >+++ b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo.h >@@ -16,9 +16,10 @@ > namespace angle > { > >-using VendorID = uint32_t; >-using DeviceID = uint32_t; >-using RevisionID = uint32_t; >+using VendorID = uint32_t; >+using DeviceID = uint32_t; >+using RevisionID = uint32_t; >+using SystemDeviceID = uint64_t; > > struct VersionInfo > { >@@ -35,9 +36,10 @@ struct GPUDeviceInfo > > GPUDeviceInfo(const GPUDeviceInfo &other); > >- VendorID vendorId = 0; >- DeviceID deviceId = 0; >- RevisionID revisionId = 0; >+ VendorID vendorId = 0; >+ DeviceID deviceId = 0; >+ RevisionID revisionId = 0; >+ SystemDeviceID systemDeviceId = 0; > > std::string driverVendor; > std::string driverVersion; >@@ -92,16 +94,17 @@ bool GetSystemInfo(SystemInfo *info); > bool GetSystemInfoVulkan(SystemInfo *info); > > // Known PCI vendor IDs >-constexpr VendorID kVendorID_AMD = 0x1002; >-constexpr VendorID kVendorID_ARM = 0x13B5; >-constexpr VendorID kVendorID_Broadcom = 0x14E4; >-constexpr VendorID kVendorID_GOOGLE = 0x1AE0; >-constexpr VendorID kVendorID_ImgTec = 0x1010; >-constexpr VendorID kVendorID_Intel = 0x8086; >-constexpr VendorID kVendorID_NVIDIA = 0x10DE; >-constexpr VendorID kVendorID_Qualcomm = 0x5143; >-constexpr VendorID kVendorID_VMWare = 0x15ad; >-constexpr VendorID kVendorID_Apple = 0x106B; >+constexpr VendorID kVendorID_AMD = 0x1002; >+constexpr VendorID kVendorID_ARM = 0x13B5; >+constexpr VendorID kVendorID_Broadcom = 0x14E4; >+constexpr VendorID kVendorID_GOOGLE = 0x1AE0; >+constexpr VendorID kVendorID_ImgTec = 0x1010; >+constexpr VendorID kVendorID_Intel = 0x8086; >+constexpr VendorID kVendorID_NVIDIA = 0x10DE; >+constexpr VendorID kVendorID_Qualcomm = 0x5143; >+constexpr VendorID kVendorID_VMWare = 0x15ad; >+constexpr VendorID kVendorID_Apple = 0x106B; >+constexpr VendorID kVendorID_Microsoft = 0x1414; > > // Known non-PCI (i.e. Khronos-registered) vendor IDs > constexpr VendorID kVendorID_Vivante = 0x10001; >@@ -128,6 +131,7 @@ bool IsVeriSilicon(VendorID vendorId); > bool IsVMWare(VendorID vendorId); > bool IsVivante(VendorID vendorId); > bool IsApple(VendorID vendorId); >+bool IsMicrosoft(VendorID vendorId); > > // Returns a readable vendor name given the VendorID > std::string VendorName(VendorID vendor); >@@ -153,6 +157,10 @@ uint64_t GetGpuIDFromOpenGLDisplayMask(uint32_t displayMask); > VendorID GetVendorIDFromMetalDeviceRegistryID(uint64_t registryID); > #endif > >+uint64_t GetSystemDeviceIdFromParts(uint32_t highPart, uint32_t lowPart); >+uint32_t GetSystemDeviceIdHighPart(uint64_t systemDeviceId); >+uint32_t GetSystemDeviceIdLowPart(uint64_t systemDeviceId); >+ > } // namespace angle > > #endif // GPU_INFO_UTIL_SYSTEM_INFO_H_ >diff --git a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_macos.mm b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_macos.mm >index 85aa4122200eccfe37a829560fba13f4630ca3f0..83a1b75bf731a77208f0499ffb8bc2041e950155 100644 >--- a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_macos.mm >+++ b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_macos.mm >@@ -97,8 +97,8 @@ bool GetEntryProperty(io_registry_entry_t entry, CFStringRef name, uint32_t *val > void GetIORegistryDevices(std::vector<GPUDeviceInfo> *devices) > { > constexpr uint32_t kNumServices = 2; >- const char *kServiceNames[kNumServices] = {"IOPCIDevice", "AGXAccelerator"}; >- const bool kServiceIsVGA[kNumServices] = {true, false}; >+ const char *kServiceNames[kNumServices] = {"IOGraphicsAccelerator2", "AGXAccelerator"}; >+ const bool kServiceIsGraphicsAccelerator2[kNumServices] = {true, false}; > for (uint32_t i = 0; i < kNumServices; ++i) > { > // matchDictionary will be consumed by IOServiceGetMatchingServices, no need to release it. >@@ -125,35 +125,65 @@ void GetIORegistryDevices(std::vector<GPUDeviceInfo> *devices) > constexpr uint32_t kClassCodeDisplayVGA = 0x30000; > uint32_t classCode; > GPUDeviceInfo info; >- >- // AGXAccelerator entries only provide a vendor ID. >- if (!GetEntryProperty(entry, CFSTR("vendor-id"), &info.vendorId)) >+ // The registry ID of an IOGraphicsAccelerator2 or AGXAccelerator matches the ID used >+ // for GPU selection by ANGLE_platform_angle_device_id >+ if (IORegistryEntryGetRegistryEntryID(entry, &info.systemDeviceId) != kIOReturnSuccess) > { >+ IOObjectRelease(entry); > continue; > } > >- if (kServiceIsVGA[i]) >+ io_registry_entry_t queryEntry = entry; >+ if (kServiceIsGraphicsAccelerator2[i]) >+ { >+ // If the matching entry is an IOGraphicsAccelerator2, get the parent entry that >+ // will be the IOPCIDevice which holds vendor-id and device-id >+ io_registry_entry_t deviceEntry = IO_OBJECT_NULL; >+ if (IORegistryEntryGetParentEntry(entry, kIOServicePlane, &deviceEntry) != >+ kIOReturnSuccess || >+ deviceEntry == IO_OBJECT_NULL) >+ { >+ IOObjectRelease(entry); >+ continue; >+ } >+ IOObjectRelease(entry); >+ queryEntry = deviceEntry; >+ } >+ >+ if (!GetEntryProperty(queryEntry, CFSTR("vendor-id"), &info.vendorId)) >+ { >+ IOObjectRelease(queryEntry); >+ continue; >+ } >+ // AGXAccelerator entries only provide a vendor ID. >+ if (kServiceIsGraphicsAccelerator2[i]) > { >- if (!GetEntryProperty(entry, CFSTR("class-code"), &classCode)) >+ if (!GetEntryProperty(queryEntry, CFSTR("class-code"), &classCode)) > { >+ IOObjectRelease(queryEntry); > continue; > } > if (classCode != kClassCodeDisplayVGA) > { >+ IOObjectRelease(queryEntry); > continue; > } >- if (!GetEntryProperty(entry, CFSTR("device-id"), &info.deviceId)) >+ if (!GetEntryProperty(queryEntry, CFSTR("device-id"), &info.deviceId)) > { >+ IOObjectRelease(queryEntry); > continue; > } >+ // Populate revisionId if we can >+ GetEntryProperty(queryEntry, CFSTR("revision-id"), &info.revisionId); > } > > devices->push_back(info); >- IOObjectRelease(entry); >+ IOObjectRelease(queryEntry); > } > IOObjectRelease(entryIterator); > >- // If any devices have been populated by IOPCIDevice, do not continue to AGXAccelerator. >+ // If any devices have been populated by IOGraphicsAccelerator2, do not continue to >+ // AGXAccelerator. > if (!devices->empty()) > { > break; >diff --git a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_win.cpp b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_win.cpp >index f4bb137f2329e9fef1e773d87c40642e9446ec6f..291acc1ef0a8c52a99915b925c3e19785550d5bc 100644 >--- a/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_win.cpp >+++ b/Source/ThirdParty/ANGLE/src/gpu_info_util/SystemInfo_win.cpp >@@ -71,6 +71,8 @@ bool GetDevicesFromDXGI(std::vector<GPUDeviceInfo> *devices) > device.vendorId = desc.VendorId; > device.deviceId = desc.DeviceId; > device.driverVersion = o.str(); >+ device.systemDeviceId = >+ GetSystemDeviceIdFromParts(desc.AdapterLuid.HighPart, desc.AdapterLuid.LowPart); > > devices->push_back(device); > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp >index 8c6e053fe3d5186c9b2ee2567e15742253029945..41000b137d256bf30dfde69ab43f6794db3a7529 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Caps.cpp >@@ -910,6 +910,12 @@ void TypePrecision::setIEEEFloat() > precision = 23; > } > >+void TypePrecision::setIEEEHalfFloat() >+{ >+ range = {{15, 15}}; >+ precision = 10; >+} >+ > void TypePrecision::setTwosComplementInt(unsigned int bits) > { > range = {{static_cast<GLint>(bits) - 1, static_cast<GLint>(bits) - 2}}; >@@ -1342,6 +1348,7 @@ std::vector<std::string> ClientExtensions::getStrings() const > InsertExtensionString("EGL_ANGLE_platform_angle_metal", platformANGLEMetal, &extensionStrings); > InsertExtensionString("EGL_ANGLE_platform_device_context_volatile_eagl", platformANGLEDeviceContextVolatileEagl, &extensionStrings); > InsertExtensionString("EGL_ANGLE_platform_device_context_volatile_cgl", platformANGLEDeviceContextVolatileCgl, &extensionStrings); >+ InsertExtensionString("EGL_ANGLE_platform_angle_device_id", platformANGLEDeviceId, &extensionStrings); > InsertExtensionString("EGL_ANGLE_device_creation", deviceCreation, &extensionStrings); > InsertExtensionString("EGL_ANGLE_device_creation_d3d11", deviceCreationD3D11, &extensionStrings); > InsertExtensionString("EGL_ANGLE_x11_visual", x11Visual, &extensionStrings); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h b/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h >index 396adf9b06d9f4f604eede78c5c1726a47fa990d..bf936ca11d68dce2097c737047ef7fb25e918248 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Caps.h >@@ -164,6 +164,7 @@ struct TypePrecision > TypePrecision &operator=(const TypePrecision &other); > > void setIEEEFloat(); >+ void setIEEEHalfFloat(); > void setTwosComplementInt(unsigned int bits); > void setSimulatedFloat(unsigned int range, unsigned int precision); > void setSimulatedInt(unsigned int range); >@@ -714,6 +715,9 @@ struct ClientExtensions > // EGL_ANGLE_platform_angle_device_context_volatile_cgl > bool platformANGLEDeviceContextVolatileCgl = false; > >+ // EGL_ANGLE_platform_angle_device_id >+ bool platformANGLEDeviceId = false; >+ > // EGL_ANGLE_device_creation > bool deviceCreation = false; > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp >index 4a7f1a8fc6a47f82f93dfa5dd693a3d4404db174..18f16ac8f944fef9053b9b9197eae8ebd328d268 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Compiler.cpp >@@ -156,6 +156,8 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const State &state, egl::Disp > mResources.EXT_shader_framebuffer_fetch_non_coherent = > extensions.shaderFramebufferFetchNonCoherentEXT; > >+ mResources.EXT_shader_framebuffer_fetch = extensions.shaderFramebufferFetchEXT; >+ > // GL_EXT_clip_cull_distance > mResources.EXT_clip_cull_distance = extensions.clipCullDistanceEXT; > >@@ -181,6 +183,9 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const State &state, egl::Disp > mResources.OES_sample_variables = extensions.sampleVariablesOES; > mResources.MaxSamples = caps.maxSamples; > >+ // ANDROID_extension_pack_es31a >+ mResources.ANDROID_extension_pack_es31a = extensions.extensionPackEs31aANDROID; >+ > // GLSL ES 3.1 constants > mResources.MaxProgramTextureGatherOffset = caps.maxProgramTextureGatherOffset; > mResources.MinProgramTextureGatherOffset = caps.minProgramTextureGatherOffset; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp >index 5c18acac8ec05c5972930cd9e76311321c8a3476..7d41a4231abe06dfb5c3145c4da27490abe2afb3 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Context.cpp >@@ -8,7 +8,10 @@ > // rendering operations. It is the GLES2 specific implementation of EGLContext. > #include "libANGLE/Context.inl.h" > >+#include <stdarg.h> >+#include <stdio.h> > #include <string.h> >+ > #include <iterator> > #include <sstream> > #include <vector> >@@ -160,9 +163,12 @@ Version GetClientVersion(egl::Display *display, const egl::AttributeMap &attribs > > GLenum GetResetStrategy(const egl::AttributeMap &attribs) > { >- EGLAttrib attrib = >+ EGLAttrib resetStrategyExt = > attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, EGL_NO_RESET_NOTIFICATION); >- switch (attrib) >+ EGLAttrib resetStrategyCore = >+ attribs.get(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY, resetStrategyExt); >+ >+ switch (resetStrategyCore) > { > case EGL_NO_RESET_NOTIFICATION: > return GL_NO_RESET_NOTIFICATION_EXT; >@@ -176,9 +182,14 @@ GLenum GetResetStrategy(const egl::AttributeMap &attribs) > > bool GetRobustAccess(const egl::AttributeMap &attribs) > { >- return (attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE) == EGL_TRUE) || >- ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) != >- 0); >+ EGLAttrib robustAccessExt = attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT, EGL_FALSE); >+ EGLAttrib robustAccessCore = attribs.get(EGL_CONTEXT_OPENGL_ROBUST_ACCESS, robustAccessExt); >+ >+ bool attribRobustAccess = (robustAccessCore == EGL_TRUE); >+ bool contextFlagsRobustAccess = >+ ((attribs.get(EGL_CONTEXT_FLAGS_KHR, 0) & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) != 0); >+ >+ return (attribRobustAccess || contextFlagsRobustAccess); > } > > bool GetDebug(const egl::AttributeMap &attribs) >@@ -373,7 +384,7 @@ Context::Context(egl::Display *display, > memoryProgramCache != nullptr, > GetContextPriority(attribs), > GetProtectedContent(attribs)), >- mShared(shareContext != nullptr), >+ mShared(shareContext != nullptr || shareTextures != nullptr || shareSemaphores != nullptr), > mSkipValidation(GetNoError(attribs)), > mDisplayTextureShareGroup(shareTextures != nullptr), > mDisplaySemaphoreShareGroup(shareSemaphores != nullptr), >@@ -401,7 +412,8 @@ Context::Context(egl::Display *display, > mDrawFramebufferObserverBinding(this, kDrawFramebufferSubjectIndex), > mReadFramebufferObserverBinding(this, kReadFramebufferSubjectIndex), > mProgramPipelineObserverBinding(this, kProgramPipelineSubjectIndex), >- mThreadPool(nullptr), >+ mSingleThreadPool(nullptr), >+ mMultiThreadPool(nullptr), > mFrameCapture(new angle::FrameCapture), > mRefCount(0), > mOverlay(mImplementation.get()), >@@ -645,8 +657,8 @@ void Context::initializeDefaultResources() > mCopyImageDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING); > mCopyImageDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER); > >- mInvalidateDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING); >- mInvalidateDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING); >+ mReadInvalidateDirtyBits.set(State::DIRTY_BIT_READ_FRAMEBUFFER_BINDING); >+ mDrawInvalidateDirtyBits.set(State::DIRTY_BIT_DRAW_FRAMEBUFFER_BINDING); > > // Initialize overlay after implementation is initialized. > ANGLE_CONTEXT_TRY(mOverlay.init(this)); >@@ -737,7 +749,8 @@ egl::Error Context::onDestroy(const egl::Display *display) > mState.mMemoryObjectManager->release(this); > mState.mSemaphoreManager->release(this); > >- mThreadPool.reset(); >+ mSingleThreadPool.reset(); >+ mMultiThreadPool.reset(); > > mImplementation->onDestroy(this); > >@@ -916,14 +929,7 @@ GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLcha > return 0u; > } > >- // If frame capture is enabled, don't detach the shader since we need the following >- // to recreate the Shader and Program during MEC setup: >- // 1.) Shader ID >- // 2.) Shader source >- if (!getShareGroup()->getFrameCaptureShared()->enabled()) >- { >- programObject->detachShader(this, shaderObject); >- } >+ programObject->detachShader(this, shaderObject); > } > > InfoLog &programInfoLog = programObject->getExecutable().getInfoLog(); >@@ -1738,12 +1744,21 @@ void Context::getIntegervImpl(GLenum pname, GLint *params) const > // Desktop client flags > case GL_CONTEXT_FLAGS: > { >- ASSERT(getClientType() == EGL_OPENGL_API); > GLint contextFlags = 0; > if (mState.hasProtectedContent()) > { > contextFlags |= GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT; > } >+ >+ if (mState.isDebugContext()) >+ { >+ contextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT_KHR; >+ } >+ >+ if (mRobustAccess) >+ { >+ contextFlags |= GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT; >+ } > *params = contextFlags; > } > break; >@@ -2776,6 +2791,28 @@ void Context::validationError(angle::EntryPoint entryPoint, > const_cast<Context *>(this)->mErrors.validationError(entryPoint, errorCode, message); > } > >+void Context::validationErrorF(angle::EntryPoint entryPoint, >+ GLenum errorCode, >+ const char *format, >+ ...) const >+{ >+ va_list vargs; >+ va_start(vargs, format); >+ constexpr size_t kMessageSize = 256; >+ char message[kMessageSize]; >+ int r = vsnprintf(message, kMessageSize, format, vargs); >+ va_end(vargs); >+ >+ if (r > 0) >+ { >+ validationError(entryPoint, errorCode, message); >+ } >+ else >+ { >+ validationError(entryPoint, errorCode, format); >+ } >+} >+ > // Get one of the recorded errors and clear its flag, if any. > // [OpenGL ES 2.0.24] section 2.5 page 13. > GLenum Context::getError() >@@ -3440,9 +3477,6 @@ Extensions Context::generateSupportedExtensions() const > { > Extensions supportedExtensions = mImplementation->getNativeExtensions(); > >- // Explicitly enable GL_KHR_parallel_shader_compile >- supportedExtensions.parallelShaderCompileKHR = true; >- > if (getClientVersion() < ES_2_0) > { > // Default extensions for GLES1 >@@ -3464,6 +3498,7 @@ Extensions Context::generateSupportedExtensions() const > supportedExtensions.textureNorm16EXT = false; > supportedExtensions.multiviewOVR = false; > supportedExtensions.multiview2OVR = false; >+ supportedExtensions.multiviewMultisampleANGLE = false; > supportedExtensions.copyTexture3dANGLE = false; > supportedExtensions.textureMultisampleANGLE = false; > supportedExtensions.drawBuffersIndexedEXT = false; >@@ -3471,6 +3506,26 @@ Extensions Context::generateSupportedExtensions() const > supportedExtensions.EGLImageArrayEXT = false; > supportedExtensions.textureFormatSRGBOverrideEXT = false; > >+ // The spec requires ES 3.1 but these are used for WebGL 2.0 >+ supportedExtensions.baseVertexBaseInstanceANGLE = false; >+ supportedExtensions.baseVertexBaseInstanceShaderBuiltinANGLE = false; >+ >+ // Requires immutable textures >+ supportedExtensions.yuvInternalFormatANGLE = false; >+ >+ // Require ESSL 3.0 >+ supportedExtensions.shaderMultisampleInterpolationOES = false; >+ supportedExtensions.shaderNoperspectiveInterpolationNV = false; >+ supportedExtensions.sampleVariablesOES = false; >+ >+ // Require ES 3.1 but could likely be exposed on 3.0 >+ supportedExtensions.textureCubeMapArrayEXT = false; >+ supportedExtensions.textureCubeMapArrayOES = false; >+ >+ // Require RED and RG formats >+ supportedExtensions.textureSRGBR8EXT = false; >+ supportedExtensions.textureSRGBRG8EXT = false; >+ > // Requires glCompressedTexImage3D > supportedExtensions.textureCompressionAstcOES = false; > >@@ -3504,9 +3559,17 @@ Extensions Context::generateSupportedExtensions() const > if (getClientVersion() < ES_3_1) > { > // Disable ES3.1+ extensions >- supportedExtensions.geometryShaderEXT = false; >- supportedExtensions.geometryShaderOES = false; >- supportedExtensions.tessellationShaderEXT = false; >+ supportedExtensions.geometryShaderEXT = false; >+ supportedExtensions.geometryShaderOES = false; >+ supportedExtensions.tessellationShaderEXT = false; >+ supportedExtensions.extensionPackEs31aANDROID = false; >+ supportedExtensions.gpuShader5EXT = false; >+ supportedExtensions.primitiveBoundingBoxEXT = false; >+ supportedExtensions.shaderImageAtomicOES = false; >+ supportedExtensions.shaderIoBlocksEXT = false; >+ supportedExtensions.shaderIoBlocksOES = false; >+ supportedExtensions.textureBufferEXT = false; >+ supportedExtensions.textureBufferOES = false; > > // TODO(http://anglebug.com/2775): Multisample arrays could be supported on ES 3.0 as well > // once 2D multisample texture extension is exposed there. >@@ -3913,6 +3976,20 @@ void Context::initCaps() > INFO() << "Disabling GL_OES_depth32 during capture, which is not widely supported on " > "mobile"; > mState.mExtensions.depth32OES = false; >+ >+ // Pixel 4 (Qualcomm) only supports 6 atomic counter buffer bindings. >+ constexpr GLint maxAtomicCounterBufferBindings = 6; >+ INFO() << "Limiting max atomic counter buffer bindings to " >+ << maxAtomicCounterBufferBindings; >+ ANGLE_LIMIT_CAP(mState.mCaps.maxAtomicCounterBufferBindings, >+ maxAtomicCounterBufferBindings); >+ >+ // SwiftShader only supports 12 shader storage buffer bindings. >+ constexpr GLint maxShaderStorageBufferBindings = 12; >+ INFO() << "Limiting max shader storage buffer bindings to " >+ << maxShaderStorageBufferBindings; >+ ANGLE_LIMIT_CAP(mState.mCaps.maxShaderStorageBufferBindings, >+ maxShaderStorageBufferBindings); > } > > // Disable support for OES_get_program_binary >@@ -4060,7 +4137,11 @@ void Context::updateCaps() > mValidBufferBindings.set(BufferBinding::Texture); > } > >- mThreadPool = angle::WorkerThreadPool::Create( >+ if (!mState.mExtensions.parallelShaderCompileKHR) >+ { >+ mSingleThreadPool = angle::WorkerThreadPool::Create(false); >+ } >+ mMultiThreadPool = angle::WorkerThreadPool::Create( > mState.mExtensions.parallelShaderCompileKHR || > getFrontendFeatures().enableCompressingPipelineCacheInThreadPool.enabled); > >@@ -4152,7 +4233,9 @@ angle::Result Context::prepareForInvalidate(GLenum target) > effectiveTarget = GL_DRAW_FRAMEBUFFER; > } > ANGLE_TRY(mState.syncDirtyObject(this, effectiveTarget)); >- return syncDirtyBits(mInvalidateDirtyBits, Command::Invalidate); >+ return syncDirtyBits(effectiveTarget == GL_READ_FRAMEBUFFER ? mReadInvalidateDirtyBits >+ : mDrawInvalidateDirtyBits, >+ Command::Invalidate); > } > > angle::Result Context::syncState(const State::DirtyBits &bitMask, >@@ -8358,6 +8441,17 @@ void Context::getnUniformiv(ShaderProgramID program, > programObject->getUniformiv(this, location, params); > } > >+void Context::getnUniformuiv(ShaderProgramID program, >+ UniformLocation location, >+ GLsizei bufSize, >+ GLuint *params) >+{ >+ Program *programObject = getProgramResolveLink(program); >+ ASSERT(programObject); >+ >+ programObject->getUniformuiv(this, location, params); >+} >+ > void Context::getnUniformivRobust(ShaderProgramID program, > UniformLocation location, > GLsizei bufSize, >@@ -8939,20 +9033,20 @@ void Context::maxShaderCompilerThreads(GLuint count) > // A count of zero specifies a request for no parallel compiling or linking. > if ((oldCount == 0 || count == 0) && (oldCount != 0 || count != 0)) > { >- mThreadPool = angle::WorkerThreadPool::Create(count > 0); >+ mMultiThreadPool = angle::WorkerThreadPool::Create(count > 0); > } >- mThreadPool->setMaxThreads(count); >+ mMultiThreadPool->setMaxThreads(count); > mImplementation->setMaxShaderCompilerThreads(count); > } > > void Context::framebufferParameteriMESA(GLenum target, GLenum pname, GLint param) > { >- UNIMPLEMENTED(); >+ framebufferParameteri(target, pname, param); > } > > void Context::getFramebufferParameterivMESA(GLenum target, GLenum pname, GLint *params) > { >- UNIMPLEMENTED(); >+ getFramebufferParameteriv(target, pname, params); > } > > bool Context::isGLES1() const >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Context.h b/Source/ThirdParty/ANGLE/src/libANGLE/Context.h >index 1f684929236b2cb656501b447399046acc7923e6..b3e0ccd39d0950186d250dade6d5d819925920fa 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Context.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Context.h >@@ -455,6 +455,11 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl > unsigned int line); > > void validationError(angle::EntryPoint entryPoint, GLenum errorCode, const char *message) const; >+ ANGLE_FORMAT_PRINTF(4, 5) >+ void validationErrorF(angle::EntryPoint entryPoint, >+ GLenum errorCode, >+ const char *format, >+ ...) const; > > void markContextLost(GraphicsResetStatus status); > >@@ -579,7 +584,20 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl > static int TexCoordArrayIndex(unsigned int unit); > > // GL_KHR_parallel_shader_compile >- std::shared_ptr<angle::WorkerThreadPool> getWorkerThreadPool() const { return mThreadPool; } >+ std::shared_ptr<angle::WorkerThreadPool> getShaderCompileThreadPool() const >+ { >+ if (mState.mExtensions.parallelShaderCompileKHR) >+ { >+ return mMultiThreadPool; >+ } >+ return mSingleThreadPool; >+ } >+ >+ // Generic multithread pool. >+ std::shared_ptr<angle::WorkerThreadPool> getWorkerThreadPool() const >+ { >+ return mMultiThreadPool; >+ } > > const StateCache &getStateCache() const { return mStateCache; } > StateCache &getStateCache() { return mStateCache; } >@@ -771,7 +789,8 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl > State::DirtyObjects mComputeDirtyObjects; > State::DirtyBits mCopyImageDirtyBits; > State::DirtyObjects mCopyImageDirtyObjects; >- State::DirtyBits mInvalidateDirtyBits; >+ State::DirtyBits mReadInvalidateDirtyBits; >+ State::DirtyBits mDrawInvalidateDirtyBits; > > // Binding to container objects that use dependent state updates. > angle::ObserverBinding mVertexArrayObserverBinding; >@@ -788,7 +807,11 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl > mutable Optional<angle::ScratchBuffer> mScratchBuffer; > mutable Optional<angle::ScratchBuffer> mZeroFilledBuffer; > >- std::shared_ptr<angle::WorkerThreadPool> mThreadPool; >+ // Single-threaded pool may not always be initialized. It currently depends on the extension >+ // GL_KHR_parallel_shader_compile being disabled. >+ std::shared_ptr<angle::WorkerThreadPool> mSingleThreadPool; >+ // Multithreaded pool will always be initialized so it can be used for more generic work. >+ std::shared_ptr<angle::WorkerThreadPool> mMultiThreadPool; > > // Note: we use a raw pointer here so we can exclude frame capture sources from the build. > std::unique_ptr<angle::FrameCapture> mFrameCapture; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Context_gl.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Context_gl.cpp >index fac9430b3220eafa16dde90002ffa295fbe42a51..cfe32d84294539a838af601fe0a44c75d3d0e56b 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Context_gl.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Context_gl.cpp >@@ -3346,14 +3346,6 @@ void Context::getnUniformdv(ShaderProgramID program, > UNIMPLEMENTED(); > } > >-void Context::getnUniformuiv(ShaderProgramID program, >- UniformLocation location, >- GLsizei bufSize, >- GLuint *params) >-{ >- UNIMPLEMENTED(); >-} >- > void Context::invalidateNamedFramebufferData(FramebufferID framebuffer, > GLsizei numAttachments, > const GLenum *attachments) >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Context_gles_ext_autogen.h b/Source/ThirdParty/ANGLE/src/libANGLE/Context_gles_ext_autogen.h >index 9f27354d0392943e6592169d090bc921f400f318..6abf5ed10efc8d416f883eaa1f97ee9167a5160a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Context_gles_ext_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Context_gles_ext_autogen.h >@@ -47,6 +47,7 @@ > \ > /* GLES2+ Extensions */ \ > \ >+ /* GL_ANDROID_extension_pack_es31a */ \ > /* GL_ANGLE_depth_texture */ \ > /* GL_ANGLE_framebuffer_blit */ \ > /* GL_ANGLE_instanced_arrays */ \ >@@ -178,6 +179,7 @@ > /* GL_EXT_semaphore_fd */ \ > void importSemaphoreFd(SemaphoreID semaphorePacked, HandleType handleTypePacked, GLint fd); \ > /* GL_EXT_separate_shader_objects */ \ >+ /* GL_EXT_shader_framebuffer_fetch */ \ > /* GL_EXT_shader_framebuffer_fetch_non_coherent */ \ > void framebufferFetchBarrier(); \ > /* GL_EXT_shader_io_blocks */ \ >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp >index cb929140cf2f62b85607cf970005e1bb95376381..02702639bdad50dedcc32c94da03066c7fce1d55 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Display.cpp >@@ -1859,6 +1859,7 @@ static ClientExtensions GenerateClientExtensions() > # else > extensions.platformANGLED3D11ON12 = IsWindows10OrGreater(); > # endif >+ extensions.platformANGLEDeviceId = true; > #endif > > #if defined(ANGLE_ENABLE_OPENGL) >@@ -1884,7 +1885,8 @@ static ClientExtensions GenerateClientExtensions() > #endif > > #if defined(ANGLE_ENABLE_METAL) >- extensions.platformANGLEMetal = true; >+ extensions.platformANGLEMetal = true; >+ extensions.platformANGLEDeviceId = true; > #endif > > #if defined(ANGLE_USE_X11) >@@ -2076,13 +2078,13 @@ void Display::initializeFrontendFeatures() > // No longer enable this on any Impl - crbug.com/1165751 > ANGLE_FEATURE_CONDITION((&mFrontendFeatures), scalarizeVecAndMatConstructorArgs, false); > >- mImplementation->initializeFrontendFeatures(&mFrontendFeatures); >- >- rx::ApplyFeatureOverrides(&mFrontendFeatures, mState); >- > // Disabled by default. To reduce the risk, create a feature to enable > // compressing pipeline cache in multi-thread pool. > ANGLE_FEATURE_CONDITION(&mFrontendFeatures, enableCompressingPipelineCacheInThreadPool, false); >+ >+ mImplementation->initializeFrontendFeatures(&mFrontendFeatures); >+ >+ rx::ApplyFeatureOverrides(&mFrontendFeatures, mState); > } > > const DisplayExtensions &Display::getExtensions() const >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h b/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h >index 9033ea78b8f8626a8feac5a6c0ff1bad3d89f481..7eb80e0aa0c4ead3480b2041a3a68574e9b54b53 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/ErrorStrings.h >@@ -521,6 +521,7 @@ MSG kTextureNotPow2 = "The texture is a non-power-of-two texture."; > MSG kTextureRectangleNotSupported = "Context does not support GL_ANGLE_texture_rectangle"; > MSG kTextureSizeTooSmall = "Texture dimensions must all be greater than zero."; > MSG kTextureTargetMismatch = "Textarget must match the texture target type."; >+MSG kTextureTargetMismatchWithLabel = "Textarget must match the texture target type. Requested: %d Texture's: %d label: %s"; > MSG kTextureTargetRequiresES31 = "Texture target requires at least OpenGL ES 3.1."; > MSG kTextureTypeConflict = "Two textures of different types use the same sampler location."; > MSG kTextureTypeMismatch = "Passed in texture type must match the one originally used to define the texture."; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp >index de4e4eda496d8c020b9ca38eb7f3a91fc8faa4fa..111bd06f92da80741ef32e1565158e13e1bf7046 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.cpp >@@ -363,6 +363,7 @@ FramebufferState::FramebufferState(rx::Serial serial) > mDefaultSamples(0), > mDefaultFixedSampleLocations(GL_FALSE), > mDefaultLayers(0), >+ mFlipY(GL_FALSE), > mWebGLDepthStencilConsistent(true), > mDefaultFramebufferReadAttachmentInitialized(false), > mSrgbWriteControlMode(SrgbWriteControlMode::Default) >@@ -385,6 +386,7 @@ FramebufferState::FramebufferState(const Caps &caps, FramebufferID id, rx::Seria > mDefaultSamples(0), > mDefaultFixedSampleLocations(GL_FALSE), > mDefaultLayers(0), >+ mFlipY(GL_FALSE), > mWebGLDepthStencilConsistent(true), > mDefaultFramebufferReadAttachmentInitialized(false), > mSrgbWriteControlMode(SrgbWriteControlMode::Default) >@@ -2227,6 +2229,11 @@ GLint Framebuffer::getDefaultLayers() const > return mState.getDefaultLayers(); > } > >+bool Framebuffer::getFlipY() const >+{ >+ return mState.getFlipY(); >+} >+ > void Framebuffer::setDefaultWidth(const Context *context, GLint defaultWidth) > { > mState.mDefaultWidth = defaultWidth; >@@ -2262,6 +2269,13 @@ void Framebuffer::setDefaultLayers(GLint defaultLayers) > mDirtyBits.set(DIRTY_BIT_DEFAULT_LAYERS); > } > >+void Framebuffer::setFlipY(bool flipY) >+{ >+ mState.mFlipY = flipY; >+ mDirtyBits.set(DIRTY_BIT_FLIP_Y); >+ invalidateCompletenessCache(); >+} >+ > GLsizei Framebuffer::getNumViews() const > { > return mState.getNumViews(); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h b/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h >index b813c02841bacf8f6350ba08ba57607c67b4d918..f19c591fc3f45c94fe63964454218c5ce45bda73 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Framebuffer.h >@@ -105,6 +105,7 @@ class FramebufferState final : angle::NonCopyable > GLint getDefaultSamples() const { return mDefaultSamples; } > bool getDefaultFixedSampleLocations() const { return mDefaultFixedSampleLocations; } > GLint getDefaultLayers() const { return mDefaultLayers; } >+ bool getFlipY() const { return mFlipY; } > > bool hasDepth() const; > bool hasStencil() const; >@@ -168,6 +169,7 @@ class FramebufferState final : angle::NonCopyable > GLint mDefaultSamples; > bool mDefaultFixedSampleLocations; > GLint mDefaultLayers; >+ bool mFlipY; > > // It's necessary to store all this extra state so we can restore attachments > // when DEPTH_STENCIL/DEPTH/STENCIL is unbound in WebGL 1. >@@ -295,11 +297,13 @@ class Framebuffer final : public angle::ObserverInterface, > GLint getDefaultSamples() const; > bool getDefaultFixedSampleLocations() const; > GLint getDefaultLayers() const; >+ bool getFlipY() const; > void setDefaultWidth(const Context *context, GLint defaultWidth); > void setDefaultHeight(const Context *context, GLint defaultHeight); > void setDefaultSamples(const Context *context, GLint defaultSamples); > void setDefaultFixedSampleLocations(const Context *context, bool defaultFixedSampleLocations); > void setDefaultLayers(GLint defaultLayers); >+ void setFlipY(bool flipY); > > void invalidateCompletenessCache(); > ANGLE_INLINE bool cachedStatusValid() { return mCachedStatus.valid(); } >@@ -394,6 +398,7 @@ class Framebuffer final : public angle::ObserverInterface, > DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS, > DIRTY_BIT_DEFAULT_LAYERS, > DIRTY_BIT_FRAMEBUFFER_SRGB_WRITE_CONTROL_MODE, >+ DIRTY_BIT_FLIP_Y, > DIRTY_BIT_UNKNOWN, > DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN > }; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Observer.h b/Source/ThirdParty/ANGLE/src/libANGLE/Observer.h >index 50dcecee6f623aa4a7fea803ca3ccd5c0db29e22..c6864eb0f03b19e4191a97125e0bfa370b5ffd68 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Observer.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Observer.h >@@ -67,6 +67,8 @@ enum class SubjectMessage > ProgramRelinked, > // Indicates a separable program's sampler uniforms were updated. > SamplerUniformsUpdated, >+ // Other types of uniform change. >+ ProgramUniformUpdated, > > // Indicates a Storage of back-end in gl::Texture has been released. > StorageReleased, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/OverlayWidgets.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/OverlayWidgets.cpp >index f94e7cd3c99f41991f5d00e8ca6bc9179e06118b..c9ae7c83b77b7592ce220e186ce6580154adeba1 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/OverlayWidgets.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/OverlayWidgets.cpp >@@ -40,10 +40,15 @@ constexpr angle::PackedEnumMap<WidgetType, WidgetInternalType> kWidgetTypeToInte > // Structures and limits matching uniform buffers in vulkan/shaders/src/OverlayDraw.comp. The size > // of text and graph widgets is chosen such that they could fit in uniform buffers with minimum > // required Vulkan size. >+#if ANDROID >+constexpr size_t kMaxRenderableTextWidgets = 16; >+constexpr size_t kMaxRenderableGraphWidgets = 16; >+#else > constexpr size_t kMaxRenderableTextWidgets = 32; > constexpr size_t kMaxRenderableGraphWidgets = 32; >-constexpr size_t kMaxTextLength = 256; >-constexpr size_t kMaxGraphDataSize = 256; >+#endif >+constexpr size_t kMaxTextLength = 256; >+constexpr size_t kMaxGraphDataSize = 256; > > constexpr angle::PackedEnumMap<WidgetInternalType, size_t> kWidgetInternalTypeMaxWidgets = { > {WidgetInternalType::Text, kMaxRenderableTextWidgets}, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp >index 67797d551e641c0b4a7b369263c72c51f940ca8b..27aba63c3151c57cf269e78a58a36c6cb9cdad14 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Program.cpp >@@ -233,91 +233,6 @@ void CopyStringToBuffer(GLchar *buffer, > } > } > >-std::string GetInterfaceBlockLimitName(ShaderType shaderType, sh::BlockType blockType) >-{ >- std::ostringstream stream; >- stream << "GL_MAX_" << GetShaderTypeString(shaderType) << "_"; >- >- switch (blockType) >- { >- case sh::BlockType::BLOCK_UNIFORM: >- stream << "UNIFORM_BUFFERS"; >- break; >- case sh::BlockType::BLOCK_BUFFER: >- stream << "SHADER_STORAGE_BLOCKS"; >- break; >- default: >- UNREACHABLE(); >- return ""; >- } >- >- if (shaderType == ShaderType::Geometry) >- { >- stream << "_EXT"; >- } >- >- return stream.str(); >-} >- >-const char *GetInterfaceBlockTypeString(sh::BlockType blockType) >-{ >- switch (blockType) >- { >- case sh::BlockType::BLOCK_UNIFORM: >- return "uniform block"; >- case sh::BlockType::BLOCK_BUFFER: >- return "shader storage block"; >- default: >- UNREACHABLE(); >- return ""; >- } >-} >- >-void LogInterfaceBlocksExceedLimit(InfoLog &infoLog, >- ShaderType shaderType, >- sh::BlockType blockType, >- GLuint limit) >-{ >- infoLog << GetShaderTypeString(shaderType) << " shader " >- << GetInterfaceBlockTypeString(blockType) << " count exceeds " >- << GetInterfaceBlockLimitName(shaderType, blockType) << " (" << limit << ")"; >-} >- >-bool ValidateInterfaceBlocksCount(GLuint maxInterfaceBlocks, >- const std::vector<sh::InterfaceBlock> &interfaceBlocks, >- ShaderType shaderType, >- sh::BlockType blockType, >- GLuint *combinedInterfaceBlocksCount, >- InfoLog &infoLog) >-{ >- GLuint blockCount = 0; >- for (const sh::InterfaceBlock &block : interfaceBlocks) >- { >- if (IsActiveInterfaceBlock(block)) >- { >- blockCount += std::max(block.arraySize, 1u); >- if (blockCount > maxInterfaceBlocks) >- { >- LogInterfaceBlocksExceedLimit(infoLog, shaderType, blockType, maxInterfaceBlocks); >- return false; >- } >- } >- } >- >- // [OpenGL ES 3.1] Chapter 7.6.2 Page 105: >- // If a uniform block is used by multiple shader stages, each such use counts separately >- // against this combined limit. >- // [OpenGL ES 3.1] Chapter 7.8 Page 111: >- // If a shader storage block in a program is referenced by multiple shaders, each such >- // reference counts separately against this combined limit. >- if (combinedInterfaceBlocksCount) >- { >- *combinedInterfaceBlocksCount += blockCount; >- } >- >- return true; >-} >- > GLuint GetInterfaceBlockIndex(const std::vector<InterfaceBlock> &list, const std::string &name) > { > std::vector<unsigned int> subscripts; >@@ -440,228 +355,6 @@ const char *GetLinkMismatchErrorString(LinkMismatchError linkError) > } > } > >-LinkMismatchError LinkValidateInterfaceBlockFields(const sh::ShaderVariable &blockField1, >- const sh::ShaderVariable &blockField2, >- bool webglCompatibility, >- std::string *mismatchedBlockFieldName) >-{ >- if (blockField1.name != blockField2.name) >- { >- return LinkMismatchError::FIELD_NAME_MISMATCH; >- } >- >- // If webgl, validate precision of UBO fields, otherwise don't. See Khronos bug 10287. >- LinkMismatchError linkError = LinkValidateProgramVariables( >- blockField1, blockField2, webglCompatibility, false, false, mismatchedBlockFieldName); >- if (linkError != LinkMismatchError::NO_MISMATCH) >- { >- AddProgramVariableParentPrefix(blockField1.name, mismatchedBlockFieldName); >- return linkError; >- } >- >- if (blockField1.isRowMajorLayout != blockField2.isRowMajorLayout) >- { >- AddProgramVariableParentPrefix(blockField1.name, mismatchedBlockFieldName); >- return LinkMismatchError::MATRIX_PACKING_MISMATCH; >- } >- >- return LinkMismatchError::NO_MISMATCH; >-} >- >-LinkMismatchError AreMatchingInterfaceBlocks(const sh::InterfaceBlock &interfaceBlock1, >- const sh::InterfaceBlock &interfaceBlock2, >- bool webglCompatibility, >- std::string *mismatchedBlockFieldName) >-{ >- // validate blocks for the same member types >- if (interfaceBlock1.fields.size() != interfaceBlock2.fields.size()) >- { >- return LinkMismatchError::FIELD_NUMBER_MISMATCH; >- } >- if (interfaceBlock1.arraySize != interfaceBlock2.arraySize) >- { >- return LinkMismatchError::ARRAY_SIZE_MISMATCH; >- } >- if (interfaceBlock1.layout != interfaceBlock2.layout || >- interfaceBlock1.binding != interfaceBlock2.binding) >- { >- return LinkMismatchError::LAYOUT_QUALIFIER_MISMATCH; >- } >- if (interfaceBlock1.instanceName.empty() != interfaceBlock2.instanceName.empty()) >- { >- return LinkMismatchError::INSTANCE_NAME_MISMATCH; >- } >- const unsigned int numBlockMembers = static_cast<unsigned int>(interfaceBlock1.fields.size()); >- for (unsigned int blockMemberIndex = 0; blockMemberIndex < numBlockMembers; blockMemberIndex++) >- { >- const sh::ShaderVariable &member1 = interfaceBlock1.fields[blockMemberIndex]; >- const sh::ShaderVariable &member2 = interfaceBlock2.fields[blockMemberIndex]; >- >- LinkMismatchError linkError = LinkValidateInterfaceBlockFields( >- member1, member2, webglCompatibility, mismatchedBlockFieldName); >- if (linkError != LinkMismatchError::NO_MISMATCH) >- { >- return linkError; >- } >- } >- return LinkMismatchError::NO_MISMATCH; >-} >- >-using ShaderInterfaceBlock = std::pair<ShaderType, const sh::InterfaceBlock *>; >-using InterfaceBlockMap = std::map<std::string, ShaderInterfaceBlock>; >- >-void InitializeInterfaceBlockMap(const std::vector<sh::InterfaceBlock> &interfaceBlocks, >- ShaderType shaderType, >- InterfaceBlockMap *linkedInterfaceBlocks) >-{ >- ASSERT(linkedInterfaceBlocks); >- >- for (const sh::InterfaceBlock &interfaceBlock : interfaceBlocks) >- { >- (*linkedInterfaceBlocks)[interfaceBlock.name] = std::make_pair(shaderType, &interfaceBlock); >- } >-} >- >-bool ValidateGraphicsInterfaceBlocksPerShader( >- const std::vector<sh::InterfaceBlock> &interfaceBlocksToLink, >- ShaderType shaderType, >- bool webglCompatibility, >- InterfaceBlockMap *linkedBlocks, >- InfoLog &infoLog) >-{ >- ASSERT(linkedBlocks); >- >- for (const sh::InterfaceBlock &block : interfaceBlocksToLink) >- { >- const auto &entry = linkedBlocks->find(block.name); >- if (entry != linkedBlocks->end()) >- { >- const sh::InterfaceBlock &linkedBlock = *(entry->second.second); >- std::string mismatchedStructFieldName; >- LinkMismatchError linkError = AreMatchingInterfaceBlocks( >- block, linkedBlock, webglCompatibility, &mismatchedStructFieldName); >- if (linkError != LinkMismatchError::NO_MISMATCH) >- { >- LogLinkMismatch(infoLog, block.name, GetInterfaceBlockTypeString(block.blockType), >- linkError, mismatchedStructFieldName, entry->second.first, >- shaderType); >- return false; >- } >- } >- else >- { >- (*linkedBlocks)[block.name] = std::make_pair(shaderType, &block); >- } >- } >- >- return true; >-} >- >-void LogAmbiguousFieldLinkMismatch(InfoLog &infoLog, >- const std::string &blockName1, >- const std::string &blockName2, >- const std::string &fieldName, >- ShaderType shaderType1, >- ShaderType shaderType2) >-{ >- infoLog << "Ambiguous field '" << fieldName << "' in blocks '" << blockName1 << "' (" >- << GetShaderTypeString(shaderType1) << " shader) and '" << blockName2 << "' (" >- << GetShaderTypeString(shaderType2) << " shader) which don't have instance names."; >-} >- >-bool ValidateInstancelessGraphicsInterfaceBlocksPerShader( >- const std::vector<sh::InterfaceBlock> &interfaceBlocks, >- ShaderType shaderType, >- InterfaceBlockMap *instancelessBlocksFields, >- InfoLog &infoLog) >-{ >- ASSERT(instancelessBlocksFields); >- >- for (const sh::InterfaceBlock &block : interfaceBlocks) >- { >- if (!block.instanceName.empty()) >- { >- continue; >- } >- >- for (const sh::ShaderVariable &field : block.fields) >- { >- const auto &entry = instancelessBlocksFields->find(field.name); >- if (entry != instancelessBlocksFields->end()) >- { >- const sh::InterfaceBlock &linkedBlock = *(entry->second.second); >- if (block.name != linkedBlock.name) >- { >- LogAmbiguousFieldLinkMismatch(infoLog, block.name, linkedBlock.name, field.name, >- entry->second.first, shaderType); >- return false; >- } >- } >- else >- { >- (*instancelessBlocksFields)[field.name] = std::make_pair(shaderType, &block); >- } >- } >- } >- >- return true; >-} >- >-bool ValidateInterfaceBlocksMatch( >- GLuint numShadersHasInterfaceBlocks, >- const ShaderMap<const std::vector<sh::InterfaceBlock> *> &shaderInterfaceBlocks, >- InfoLog &infoLog, >- bool webglCompatibility, >- InterfaceBlockMap *instancelessInterfaceBlocksFields) >-{ >- for (ShaderType shaderType : kAllGraphicsShaderTypes) >- { >- // Validate that instanceless blocks of different names don't have fields of the same name. >- if (shaderInterfaceBlocks[shaderType] && >- !ValidateInstancelessGraphicsInterfaceBlocksPerShader( >- *shaderInterfaceBlocks[shaderType], shaderType, instancelessInterfaceBlocksFields, >- infoLog)) >- { >- return false; >- } >- } >- >- if (numShadersHasInterfaceBlocks < 2u) >- { >- return true; >- } >- >- ASSERT(!shaderInterfaceBlocks[ShaderType::Compute]); >- >- // Check that interface blocks defined in the graphics shaders are identical >- >- InterfaceBlockMap linkedInterfaceBlocks; >- >- bool interfaceBlockMapInitialized = false; >- for (ShaderType shaderType : kAllGraphicsShaderTypes) >- { >- if (!shaderInterfaceBlocks[shaderType]) >- { >- continue; >- } >- >- if (!interfaceBlockMapInitialized) >- { >- InitializeInterfaceBlockMap(*shaderInterfaceBlocks[shaderType], shaderType, >- &linkedInterfaceBlocks); >- interfaceBlockMapInitialized = true; >- } >- else if (!ValidateGraphicsInterfaceBlocksPerShader(*shaderInterfaceBlocks[shaderType], >- shaderType, webglCompatibility, >- &linkedInterfaceBlocks, infoLog)) >- { >- return false; >- } >- } >- >- return true; >-} >- > void UpdateInterfaceVariable(std::vector<sh::ShaderVariable> *block, const sh::ShaderVariable &var) > { > if (!var.isStruct()) >@@ -1221,7 +914,6 @@ ProgramState::ProgramState() > : mLabel(), > mAttachedShaders{}, > mLocationsUsedForXfbExtension(0), >- mAtomicCounterUniformRange(0, 0), > mBinaryRetrieveableHint(false), > mSeparable(false), > mNumViews(-1), >@@ -1291,8 +983,7 @@ GLuint ProgramState::getSamplerIndexFromUniformIndex(GLuint uniformIndex) const > > GLuint ProgramState::getUniformIndexFromSamplerIndex(GLuint samplerIndex) const > { >- ASSERT(samplerIndex < mExecutable->mSamplerUniformRange.length()); >- return samplerIndex + mExecutable->mSamplerUniformRange.low(); >+ return mExecutable->getUniformIndexFromSamplerIndex(samplerIndex); > } > > bool ProgramState::isImageUniformIndex(GLuint index) const >@@ -1562,19 +1253,24 @@ angle::Result Program::linkImpl(const Context *context) > &mState.mExecutable->mShaderStorageBlocks, &mState.mBufferVariables, > &mState.mExecutable->mAtomicCounterBuffers); > >+ // TODO: Fix incomplete linking. http://anglebug.com/6358 >+ updateLinkedShaderStages(); >+ >+ InitUniformBlockLinker(mState, &resources.uniformBlockLinker); >+ InitShaderStorageBlockLinker(mState, &resources.shaderStorageBlockLinker); >+ > if (mState.mAttachedShaders[ShaderType::Compute]) > { >- GLuint combinedImageUniforms = 0u; >- if (!linkUniforms(context->getCaps(), context->getClientVersion(), infoLog, >- mState.mUniformLocationBindings, &combinedImageUniforms, >- &resources.unusedUniforms)) >+ GLuint combinedImageUniforms = 0; >+ if (!linkUniforms(context, &resources.unusedUniforms, &combinedImageUniforms, infoLog)) > { > return angle::Result::Continue; > } > > GLuint combinedShaderStorageBlocks = 0u; >- if (!linkInterfaceBlocks(context->getCaps(), context->getClientVersion(), >- context->isWebGL(), infoLog, &combinedShaderStorageBlocks)) >+ if (!LinkValidateProgramInterfaceBlocks(context, >+ mState.mExecutable->getLinkedShaderStages(), >+ resources, infoLog, &combinedShaderStorageBlocks)) > { > return angle::Result::Continue; > } >@@ -1594,9 +1290,6 @@ angle::Result Program::linkImpl(const Context *context) > << context->getCaps().maxCombinedShaderOutputResources << ")"; > return angle::Result::Continue; > } >- >- InitUniformBlockLinker(mState, &resources.uniformBlockLinker); >- InitShaderStorageBlockLinker(mState, &resources.shaderStorageBlockLinker); > } > else > { >@@ -1610,17 +1303,16 @@ angle::Result Program::linkImpl(const Context *context) > return angle::Result::Continue; > } > >- GLuint combinedImageUniforms = 0u; >- if (!linkUniforms(context->getCaps(), context->getClientVersion(), infoLog, >- mState.mUniformLocationBindings, &combinedImageUniforms, >- &resources.unusedUniforms)) >+ GLuint combinedImageUniforms = 0; >+ if (!linkUniforms(context, &resources.unusedUniforms, &combinedImageUniforms, infoLog)) > { > return angle::Result::Continue; > } > > GLuint combinedShaderStorageBlocks = 0u; >- if (!linkInterfaceBlocks(context->getCaps(), context->getClientVersion(), >- context->isWebGL(), infoLog, &combinedShaderStorageBlocks)) >+ if (!LinkValidateProgramInterfaceBlocks(context, >+ mState.mExecutable->getLinkedShaderStages(), >+ resources, infoLog, &combinedShaderStorageBlocks)) > { > return angle::Result::Continue; > } >@@ -1649,14 +1341,11 @@ angle::Result Program::linkImpl(const Context *context) > return angle::Result::Continue; > } > >- mState.mEarlyFramentTestsOptimization = >+ mState.mExecutable->mUsesEarlyFragmentTestsOptimization = > fragmentShader->hasEarlyFragmentTestsOptimization(); > mState.mSpecConstUsageBits |= fragmentShader->getSpecConstUsageBits(); > } > >- InitUniformBlockLinker(mState, &resources.uniformBlockLinker); >- InitShaderStorageBlockLinker(mState, &resources.shaderStorageBlockLinker); >- > mergedVaryings = GetMergedVaryingsFromLinkingVariables(linkingVariables); > if (!mState.mExecutable->linkMergedVaryings( > context, mergedVaryings, mState.mTransformFeedbackVaryingNames, linkingVariables, >@@ -1666,8 +1355,6 @@ angle::Result Program::linkImpl(const Context *context) > } > } > >- updateLinkedShaderStages(); >- > mLinkingState = std::move(linkingState); > mLinkingState->linkingFromBinary = false; > mLinkingState->programHash = programHash; >@@ -2621,7 +2308,10 @@ bool Program::shouldIgnoreUniform(UniformLocation location) const > return false; > } > >-void Program::setUniform1fv(UniformLocation location, GLsizei count, const GLfloat *v) >+template <typename UniformT, >+ GLint UniformSize, >+ void (rx::ProgramImpl::*SetUniformFunc)(GLint, GLsizei, const UniformT *)> >+void Program::setUniformGeneric(UniformLocation location, GLsizei count, const UniformT *v) > { > ASSERT(!mLinkingState); > if (shouldIgnoreUniform(location)) >@@ -2630,47 +2320,29 @@ void Program::setUniform1fv(UniformLocation location, GLsizei count, const GLflo > } > > const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 1, v); >- mProgram->setUniform1fv(location.value, clampedCount, v); >+ GLsizei clampedCount = clampUniformCount(locationInfo, count, UniformSize, v); >+ (mProgram->*SetUniformFunc)(location.value, clampedCount, v); >+ onStateChange(angle::SubjectMessage::ProgramUniformUpdated); > } > >-void Program::setUniform2fv(UniformLocation location, GLsizei count, const GLfloat *v) >+void Program::setUniform1fv(UniformLocation location, GLsizei count, const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >+ setUniformGeneric<GLfloat, 1, &rx::ProgramImpl::setUniform1fv>(location, count, v); >+} > >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v); >- mProgram->setUniform2fv(location.value, clampedCount, v); >+void Program::setUniform2fv(UniformLocation location, GLsizei count, const GLfloat *v) >+{ >+ setUniformGeneric<GLfloat, 2, &rx::ProgramImpl::setUniform2fv>(location, count, v); > } > > void Program::setUniform3fv(UniformLocation location, GLsizei count, const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v); >- mProgram->setUniform3fv(location.value, clampedCount, v); >+ setUniformGeneric<GLfloat, 3, &rx::ProgramImpl::setUniform3fv>(location, count, v); > } > > void Program::setUniform4fv(UniformLocation location, GLsizei count, const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v); >- mProgram->setUniform4fv(location.value, clampedCount, v); >+ setUniformGeneric<GLfloat, 4, &rx::ProgramImpl::setUniform4fv>(location, count, v); > } > > void Program::setUniform1iv(Context *context, >@@ -2693,87 +2365,56 @@ void Program::setUniform1iv(Context *context, > { > updateSamplerUniform(context, locationInfo, clampedCount, v); > } >+ else >+ { >+ onStateChange(angle::SubjectMessage::ProgramUniformUpdated); >+ } > } > > void Program::setUniform2iv(UniformLocation location, GLsizei count, const GLint *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v); >- mProgram->setUniform2iv(location.value, clampedCount, v); >+ setUniformGeneric<GLint, 2, &rx::ProgramImpl::setUniform2iv>(location, count, v); > } > > void Program::setUniform3iv(UniformLocation location, GLsizei count, const GLint *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v); >- mProgram->setUniform3iv(location.value, clampedCount, v); >+ setUniformGeneric<GLint, 3, &rx::ProgramImpl::setUniform3iv>(location, count, v); > } > > void Program::setUniform4iv(UniformLocation location, GLsizei count, const GLint *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v); >- mProgram->setUniform4iv(location.value, clampedCount, v); >+ setUniformGeneric<GLint, 4, &rx::ProgramImpl::setUniform4iv>(location, count, v); > } > > void Program::setUniform1uiv(UniformLocation location, GLsizei count, const GLuint *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 1, v); >- mProgram->setUniform1uiv(location.value, clampedCount, v); >+ setUniformGeneric<GLuint, 1, &rx::ProgramImpl::setUniform1uiv>(location, count, v); > } > > void Program::setUniform2uiv(UniformLocation location, GLsizei count, const GLuint *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 2, v); >- mProgram->setUniform2uiv(location.value, clampedCount, v); >+ setUniformGeneric<GLuint, 2, &rx::ProgramImpl::setUniform2uiv>(location, count, v); > } > > void Program::setUniform3uiv(UniformLocation location, GLsizei count, const GLuint *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 3, v); >- mProgram->setUniform3uiv(location.value, clampedCount, v); >+ setUniformGeneric<GLuint, 3, &rx::ProgramImpl::setUniform3uiv>(location, count, v); > } > > void Program::setUniform4uiv(UniformLocation location, GLsizei count, const GLuint *v) >+{ >+ setUniformGeneric<GLuint, 4, &rx::ProgramImpl::setUniform4uiv>(location, count, v); >+} >+ >+template < >+ typename UniformT, >+ GLint MatrixC, >+ GLint MatrixR, >+ void (rx::ProgramImpl::*SetUniformMatrixFunc)(GLint, GLsizei, GLboolean, const UniformT *)> >+void Program::setUniformMatrixGeneric(UniformLocation location, >+ GLsizei count, >+ GLboolean transpose, >+ const UniformT *v) > { > ASSERT(!mLinkingState); > if (shouldIgnoreUniform(location)) >@@ -2781,9 +2422,9 @@ void Program::setUniform4uiv(UniformLocation location, GLsizei count, const GLui > return; > } > >- const VariableLocation &locationInfo = mState.mUniformLocations[location.value]; >- GLsizei clampedCount = clampUniformCount(locationInfo, count, 4, v); >- mProgram->setUniform4uiv(location.value, clampedCount, v); >+ GLsizei clampedCount = clampMatrixUniformCount<MatrixC, MatrixR>(location, count, transpose, v); >+ (mProgram->*SetUniformMatrixFunc)(location.value, clampedCount, transpose, v); >+ onStateChange(angle::SubjectMessage::ProgramUniformUpdated); > } > > void Program::setUniformMatrix2fv(UniformLocation location, >@@ -2791,14 +2432,8 @@ void Program::setUniformMatrix2fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<2, 2>(location, count, transpose, v); >- mProgram->setUniformMatrix2fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 2, 2, &rx::ProgramImpl::setUniformMatrix2fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix3fv(UniformLocation location, >@@ -2806,14 +2441,8 @@ void Program::setUniformMatrix3fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<3, 3>(location, count, transpose, v); >- mProgram->setUniformMatrix3fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 3, 3, &rx::ProgramImpl::setUniformMatrix3fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix4fv(UniformLocation location, >@@ -2821,14 +2450,8 @@ void Program::setUniformMatrix4fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<4, 4>(location, count, transpose, v); >- mProgram->setUniformMatrix4fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 4, 4, &rx::ProgramImpl::setUniformMatrix4fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix2x3fv(UniformLocation location, >@@ -2836,14 +2459,8 @@ void Program::setUniformMatrix2x3fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<2, 3>(location, count, transpose, v); >- mProgram->setUniformMatrix2x3fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 2, 3, &rx::ProgramImpl::setUniformMatrix2x3fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix2x4fv(UniformLocation location, >@@ -2851,14 +2468,8 @@ void Program::setUniformMatrix2x4fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<2, 4>(location, count, transpose, v); >- mProgram->setUniformMatrix2x4fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 2, 4, &rx::ProgramImpl::setUniformMatrix2x4fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix3x2fv(UniformLocation location, >@@ -2866,14 +2477,8 @@ void Program::setUniformMatrix3x2fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<3, 2>(location, count, transpose, v); >- mProgram->setUniformMatrix3x2fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 3, 2, &rx::ProgramImpl::setUniformMatrix3x2fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix3x4fv(UniformLocation location, >@@ -2881,14 +2486,8 @@ void Program::setUniformMatrix3x4fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<3, 4>(location, count, transpose, v); >- mProgram->setUniformMatrix3x4fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 3, 4, &rx::ProgramImpl::setUniformMatrix3x4fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix4x2fv(UniformLocation location, >@@ -2896,14 +2495,8 @@ void Program::setUniformMatrix4x2fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<4, 2>(location, count, transpose, v); >- mProgram->setUniformMatrix4x2fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 4, 2, &rx::ProgramImpl::setUniformMatrix4x2fv>(location, count, >+ transpose, v); > } > > void Program::setUniformMatrix4x3fv(UniformLocation location, >@@ -2911,14 +2504,8 @@ void Program::setUniformMatrix4x3fv(UniformLocation location, > GLboolean transpose, > const GLfloat *v) > { >- ASSERT(!mLinkingState); >- if (shouldIgnoreUniform(location)) >- { >- return; >- } >- >- GLsizei clampedCount = clampMatrixUniformCount<4, 3>(location, count, transpose, v); >- mProgram->setUniformMatrix4x3fv(location.value, clampedCount, transpose, v); >+ setUniformMatrixGeneric<GLfloat, 4, 3, &rx::ProgramImpl::setUniformMatrix4x3fv>(location, count, >+ transpose, v); > } > > GLuint Program::getSamplerUniformBinding(const VariableLocation &uniformLocation) const >@@ -3546,33 +3133,33 @@ bool Program::linkVaryings(InfoLog &infoLog) const > return true; > } > >-bool Program::linkUniforms(const Caps &caps, >- const Version &version, >- InfoLog &infoLog, >- const ProgramAliasedBindings &uniformLocationBindings, >- GLuint *combinedImageUniformsCount, >- std::vector<UnusedUniform> *unusedUniforms) >+bool Program::linkUniforms(const Context *context, >+ std::vector<UnusedUniform> *unusedUniformsOutOrNull, >+ GLuint *combinedImageUniformsOut, >+ InfoLog &infoLog) > { >- UniformLinker linker(mState); >- if (!linker.link(caps, infoLog, uniformLocationBindings)) >+ // Initialize executable shader map. >+ ShaderMap<std::vector<sh::ShaderVariable>> shaderUniforms; >+ for (Shader *shader : mState.mAttachedShaders) > { >- return false; >+ if (shader) >+ { >+ shaderUniforms[shader->getType()] = shader->getUniforms(); >+ } > } > >- linker.getResults(&mState.mExecutable->mUniforms, unusedUniforms, &mState.mUniformLocations); >- >- linkSamplerAndImageBindings(combinedImageUniformsCount); >- >- if (!linkAtomicCounterBuffers()) >+ if (!mState.mExecutable->linkUniforms(context, shaderUniforms, infoLog, >+ mState.mUniformLocationBindings, combinedImageUniformsOut, >+ unusedUniformsOutOrNull, &mState.mUniformLocations)) > { > return false; > } > >- if (version >= Version(3, 1)) >+ if (context->getClientVersion() >= Version(3, 1)) > { > GLint locationSize = static_cast<GLint>(mState.getUniformLocations().size()); > >- if (locationSize > caps.maxUniformLocations) >+ if (locationSize > context->getCaps().maxUniformLocations) > { > infoLog << "Exceeded maximum uniform location size"; > return false; >@@ -3582,148 +3169,6 @@ bool Program::linkUniforms(const Caps &caps, > return true; > } > >-void Program::linkSamplerAndImageBindings(GLuint *combinedImageUniforms) >-{ >- ASSERT(combinedImageUniforms); >- >- // Iterate over mExecutable->mUniforms from the back, and find the range of subpass inputs, >- // atomic counters, images and samplers in that order. >- auto highIter = mState.mExecutable->getUniforms().rbegin(); >- auto lowIter = highIter; >- >- unsigned int high = static_cast<unsigned int>(mState.mExecutable->getUniforms().size()); >- unsigned int low = high; >- >- // Note that uniform block uniforms are not yet appended to this list. >- ASSERT(mState.mExecutable->getUniforms().size() == 0 || highIter->isAtomicCounter() || >- highIter->isImage() || highIter->isSampler() || highIter->isInDefaultBlock() || >- highIter->isFragmentInOut); >- >- for (; lowIter != mState.mExecutable->getUniforms().rend() && lowIter->isFragmentInOut; >- ++lowIter) >- { >- --low; >- } >- >- mState.mExecutable->mFragmentInoutRange = RangeUI(low, high); >- >- highIter = lowIter; >- high = low; >- >- for (; lowIter != mState.mExecutable->getUniforms().rend() && lowIter->isAtomicCounter(); >- ++lowIter) >- { >- --low; >- } >- >- mState.mAtomicCounterUniformRange = RangeUI(low, high); >- >- highIter = lowIter; >- high = low; >- >- for (; lowIter != mState.mExecutable->getUniforms().rend() && lowIter->isImage(); ++lowIter) >- { >- --low; >- } >- >- mState.mExecutable->mImageUniformRange = RangeUI(low, high); >- *combinedImageUniforms = 0u; >- std::vector<ImageBinding> &imageBindings = mState.mExecutable->mImageBindings; >- // If uniform is a image type, insert it into the mImageBindings array. >- for (unsigned int imageIndex : mState.mExecutable->getImageUniformRange()) >- { >- // ES3.1 (section 7.6.1) and GLSL ES3.1 (section 4.4.5), Uniform*i{v} commands >- // cannot load values into a uniform defined as an image. if declare without a >- // binding qualifier, any uniform image variable (include all elements of >- // unbound image array) should be bound to unit zero. >- auto &imageUniform = mState.mExecutable->getUniforms()[imageIndex]; >- TextureType textureType = ImageTypeToTextureType(imageUniform.type); >- const GLuint arraySize = imageUniform.isArray() ? imageUniform.arraySizes[0] : 1u; >- >- if (imageUniform.binding == -1) >- { >- imageBindings.emplace_back( >- ImageBinding(imageUniform.getBasicTypeElementCount(), textureType)); >- } >- else >- { >- // The arrays of arrays are flattened to arrays, it needs to record the array offset for >- // the correct binding image unit. >- imageBindings.emplace_back( >- ImageBinding(imageUniform.binding + imageUniform.parentArrayIndex() * arraySize, >- imageUniform.getBasicTypeElementCount(), textureType)); >- } >- >- *combinedImageUniforms += imageUniform.activeShaderCount() * arraySize; >- } >- >- highIter = lowIter; >- high = low; >- >- for (; lowIter != mState.mExecutable->getUniforms().rend() && lowIter->isSampler(); ++lowIter) >- { >- --low; >- } >- >- mState.mExecutable->mSamplerUniformRange = RangeUI(low, high); >- >- // If uniform is a sampler type, insert it into the mSamplerBindings array. >- for (unsigned int samplerIndex : mState.mExecutable->getSamplerUniformRange()) >- { >- const auto &samplerUniform = mState.mExecutable->getUniforms()[samplerIndex]; >- TextureType textureType = SamplerTypeToTextureType(samplerUniform.type); >- GLenum samplerType = samplerUniform.typeInfo->type; >- unsigned int elementCount = samplerUniform.getBasicTypeElementCount(); >- SamplerFormat format = samplerUniform.typeInfo->samplerFormat; >- mState.mExecutable->mSamplerBindings.emplace_back(textureType, samplerType, format, >- elementCount); >- } >- >- // Whatever is left constitutes the default uniforms. >- mState.mExecutable->mDefaultUniformRange = RangeUI(0, low); >-} >- >-bool Program::linkAtomicCounterBuffers() >-{ >- for (unsigned int index : mState.mAtomicCounterUniformRange) >- { >- auto &uniform = mState.mExecutable->mUniforms[index]; >- uniform.blockInfo.offset = uniform.offset; >- uniform.blockInfo.arrayStride = (uniform.isArray() ? 4 : 0); >- uniform.blockInfo.matrixStride = 0; >- uniform.blockInfo.isRowMajorMatrix = false; >- >- bool found = false; >- for (unsigned int bufferIndex = 0; >- bufferIndex < mState.mExecutable->getActiveAtomicCounterBufferCount(); ++bufferIndex) >- { >- auto &buffer = mState.mExecutable->mAtomicCounterBuffers[bufferIndex]; >- if (buffer.binding == uniform.binding) >- { >- buffer.memberIndexes.push_back(index); >- uniform.bufferIndex = bufferIndex; >- found = true; >- buffer.unionReferencesWith(uniform); >- break; >- } >- } >- if (!found) >- { >- AtomicCounterBuffer atomicCounterBuffer; >- atomicCounterBuffer.binding = uniform.binding; >- atomicCounterBuffer.memberIndexes.push_back(index); >- atomicCounterBuffer.unionReferencesWith(uniform); >- mState.mExecutable->mAtomicCounterBuffers.push_back(atomicCounterBuffer); >- uniform.bufferIndex = >- static_cast<int>(mState.mExecutable->getActiveAtomicCounterBufferCount() - 1); >- } >- } >- // TODO(jie.a.chen@intel.com): Count each atomic counter buffer to validate against >- // gl_Max[Vertex|Fragment|Compute|Geometry|Combined]AtomicCounterBuffers. >- >- return true; >-} >- > // Assigns locations to all attributes (except built-ins) from the bindings and program locations. > bool Program::linkAttributes(const Context *context, InfoLog &infoLog) > { >@@ -3885,105 +3330,6 @@ bool Program::linkAttributes(const Context *context, InfoLog &infoLog) > return true; > } > >-bool Program::linkInterfaceBlocks(const Caps &caps, >- const Version &version, >- bool webglCompatibility, >- InfoLog &infoLog, >- GLuint *combinedShaderStorageBlocksCount) >-{ >- ASSERT(combinedShaderStorageBlocksCount); >- >- GLuint combinedUniformBlocksCount = 0u; >- GLuint numShadersHasUniformBlocks = 0u; >- ShaderMap<const std::vector<sh::InterfaceBlock> *> allShaderUniformBlocks = {}; >- InterfaceBlockMap instancelessInterfaceBlocksFields; >- >- for (ShaderType shaderType : AllShaderTypes()) >- { >- Shader *shader = mState.mAttachedShaders[shaderType]; >- if (!shader) >- { >- continue; >- } >- >- const auto &uniformBlocks = shader->getUniformBlocks(); >- if (!uniformBlocks.empty()) >- { >- if (!ValidateInterfaceBlocksCount( >- static_cast<GLuint>(caps.maxShaderUniformBlocks[shaderType]), uniformBlocks, >- shaderType, sh::BlockType::BLOCK_UNIFORM, &combinedUniformBlocksCount, infoLog)) >- { >- return false; >- } >- >- allShaderUniformBlocks[shaderType] = &uniformBlocks; >- ++numShadersHasUniformBlocks; >- } >- } >- >- if (combinedUniformBlocksCount > static_cast<GLuint>(caps.maxCombinedUniformBlocks)) >- { >- infoLog << "The sum of the number of active uniform blocks exceeds " >- "MAX_COMBINED_UNIFORM_BLOCKS (" >- << caps.maxCombinedUniformBlocks << ")."; >- return false; >- } >- >- if (!ValidateInterfaceBlocksMatch(numShadersHasUniformBlocks, allShaderUniformBlocks, infoLog, >- webglCompatibility, &instancelessInterfaceBlocksFields)) >- { >- return false; >- } >- >- if (version >= Version(3, 1)) >- { >- *combinedShaderStorageBlocksCount = 0u; >- GLuint numShadersHasShaderStorageBlocks = 0u; >- ShaderMap<const std::vector<sh::InterfaceBlock> *> allShaderStorageBlocks = {}; >- for (ShaderType shaderType : AllShaderTypes()) >- { >- Shader *shader = mState.mAttachedShaders[shaderType]; >- if (!shader) >- { >- continue; >- } >- >- const auto &shaderStorageBlocks = shader->getShaderStorageBlocks(); >- if (!shaderStorageBlocks.empty()) >- { >- if (!ValidateInterfaceBlocksCount( >- static_cast<GLuint>(caps.maxShaderStorageBlocks[shaderType]), >- shaderStorageBlocks, shaderType, sh::BlockType::BLOCK_BUFFER, >- combinedShaderStorageBlocksCount, infoLog)) >- { >- return false; >- } >- >- allShaderStorageBlocks[shaderType] = &shaderStorageBlocks; >- ++numShadersHasShaderStorageBlocks; >- } >- } >- >- if (*combinedShaderStorageBlocksCount > >- static_cast<GLuint>(caps.maxCombinedShaderStorageBlocks)) >- { >- infoLog << "The sum of the number of active shader storage blocks exceeds " >- "MAX_COMBINED_SHADER_STORAGE_BLOCKS (" >- << caps.maxCombinedShaderStorageBlocks << ")."; >- return false; >- } >- >- if (!ValidateInterfaceBlocksMatch(numShadersHasShaderStorageBlocks, allShaderStorageBlocks, >- infoLog, webglCompatibility, >- &instancelessInterfaceBlocksFields)) >- { >- return false; >- } >- } >- >- return true; >-} >- > void Program::setUniformValuesFromBindingQualifiers() > { > for (unsigned int samplerIndex : mState.mExecutable->getSamplerUniformRange()) >@@ -4294,9 +3640,6 @@ angle::Result Program::serialize(const Context *context, angle::MemoryBuffer *bi > "driver."; > } > >- stream.writeInt(mState.getAtomicCounterUniformRange().low()); >- stream.writeInt(mState.getAtomicCounterUniformRange().high()); >- > if (context->getShareGroup()->getFrameCaptureShared()->enabled()) > { > // Serialize the source for each stage for re-use during capture >@@ -4388,10 +3731,6 @@ angle::Result Program::deserialize(const Context *context, > mState.mBufferVariables.push_back(bufferVariable); > } > >- unsigned int atomicCounterRangeLow = stream.readInt<unsigned int>(); >- unsigned int atomicCounterRangeHigh = stream.readInt<unsigned int>(); >- mState.mAtomicCounterUniformRange = RangeUI(atomicCounterRangeLow, atomicCounterRangeHigh); >- > static_assert(static_cast<unsigned long>(ShaderType::EnumCount) <= sizeof(unsigned long) * 8, > "Too many shader types"); > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Program.h b/Source/ThirdParty/ANGLE/src/libANGLE/Program.h >index f66417d8ff18510b0cc3eebdd6922bc42f6ed46d..d35c0a86d4e1b3f5766477ca6922d4ab0a0a2eed 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Program.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Program.h >@@ -287,7 +287,10 @@ class ProgramState final : angle::NonCopyable > const RangeUI &getDefaultUniformRange() const { return mExecutable->getDefaultUniformRange(); } > const RangeUI &getSamplerUniformRange() const { return mExecutable->getSamplerUniformRange(); } > const RangeUI &getImageUniformRange() const { return mExecutable->getImageUniformRange(); } >- const RangeUI &getAtomicCounterUniformRange() const { return mAtomicCounterUniformRange; } >+ const RangeUI &getAtomicCounterUniformRange() const >+ { >+ return mExecutable->getAtomicCounterUniformRange(); >+ } > const RangeUI &getFragmentInoutRange() const { return mExecutable->getFragmentInoutRange(); } > > const std::vector<TransformFeedbackVarying> &getLinkedTransformFeedbackVaryings() const >@@ -385,7 +388,6 @@ class ProgramState final : angle::NonCopyable > > std::vector<VariableLocation> mUniformLocations; > std::vector<BufferVariable> mBufferVariables; >- RangeUI mAtomicCounterUniformRange; > > bool mBinaryRetrieveableHint; > bool mSeparable; >@@ -630,6 +632,7 @@ class Program final : public LabeledObject, public angle::Subject > GLint getActiveUniformBlockMaxNameLength() const; > GLint getActiveShaderStorageBlockMaxNameLength() const; > >+ const std::vector<LinkedUniform> &getUniforms() const { return mState.getUniforms(); } > GLuint getUniformBlockIndex(const std::string &name) const; > GLuint getShaderStorageBlockIndex(const std::string &name) const; > >@@ -795,21 +798,12 @@ class Program final : public LabeledObject, public angle::Subject > > bool linkValidateShaders(InfoLog &infoLog); > bool linkAttributes(const Context *context, InfoLog &infoLog); >- bool linkInterfaceBlocks(const Caps &caps, >- const Version &version, >- bool webglCompatibility, >- InfoLog &infoLog, >- GLuint *combinedShaderStorageBlocksCount); > bool linkVaryings(InfoLog &infoLog) const; > >- bool linkUniforms(const Caps &caps, >- const Version &version, >- InfoLog &infoLog, >- const ProgramAliasedBindings &uniformLocationBindings, >- GLuint *combinedImageUniformsCount, >- std::vector<UnusedUniform> *unusedUniforms); >- void linkSamplerAndImageBindings(GLuint *combinedImageUniformsCount); >- bool linkAtomicCounterBuffers(); >+ bool linkUniforms(const Context *context, >+ std::vector<UnusedUniform> *unusedUniformsOutOrNull, >+ GLuint *combinedImageUniformsOut, >+ InfoLog &infoLog); > > void updateLinkedShaderStages(); > >@@ -859,6 +853,21 @@ class Program final : public LabeledObject, public angle::Subject > > void postResolveLink(const gl::Context *context); > >+ template <typename UniformT, >+ GLint UniformSize, >+ void (rx::ProgramImpl::*SetUniformFunc)(GLint, GLsizei, const UniformT *)> >+ void setUniformGeneric(UniformLocation location, GLsizei count, const UniformT *v); >+ >+ template < >+ typename UniformT, >+ GLint MatrixC, >+ GLint MatrixR, >+ void (rx::ProgramImpl::*SetUniformMatrixFunc)(GLint, GLsizei, GLboolean, const UniformT *)> >+ void setUniformMatrixGeneric(UniformLocation location, >+ GLsizei count, >+ GLboolean transpose, >+ const UniformT *v); >+ > rx::Serial mSerial; > ProgramState mState; > rx::ProgramImpl *mProgram; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.cpp >index 52a4281b4a62e566233b2bee76e37a6c2ef38fd1..1e5107c40e1914a60399e1796bfa808267226686 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.cpp >@@ -150,6 +150,23 @@ bool IsOutputSecondaryForLink(const ProgramAliasedBindings &fragmentOutputIndexe > return false; > } > >+RangeUI AddUniforms(const ShaderMap<Program *> &programs, >+ ShaderBitSet activeShaders, >+ std::vector<LinkedUniform> &outputUniforms, >+ const std::function<RangeUI(const ProgramState &)> &getRange) >+{ >+ unsigned int startRange = static_cast<unsigned int>(outputUniforms.size()); >+ for (ShaderType shaderType : activeShaders) >+ { >+ const ProgramState &programState = programs[shaderType]->getState(); >+ const std::vector<LinkedUniform> &programUniforms = programState.getUniforms(); >+ const RangeUI uniformRange = getRange(programState); >+ >+ outputUniforms.insert(outputUniforms.end(), programUniforms.begin() + uniformRange.low(), >+ programUniforms.begin() + uniformRange.high()); >+ } >+ return RangeUI(startRange, static_cast<unsigned int>(outputUniforms.size())); >+} > } // anonymous namespace > > ProgramExecutable::ProgramExecutable() >@@ -163,13 +180,9 @@ ProgramExecutable::ProgramExecutable() > mDefaultUniformRange(0, 0), > mSamplerUniformRange(0, 0), > mImageUniformRange(0, 0), >+ mAtomicCounterUniformRange(0, 0), > mFragmentInoutRange(0, 0), >- mPipelineHasUniformBuffers(false), >- mPipelineHasStorageBuffers(false), >- mPipelineHasAtomicCounterBuffers(false), >- mPipelineHasDefaultUniforms(false), >- mPipelineHasTextures(false), >- mPipelineHasImages(false), >+ mUsesEarlyFragmentTestsOptimization(false), > // [GL_EXT_geometry_shader] Table 20.22 > mGeometryShaderInputPrimitiveType(PrimitiveMode::Triangles), > mGeometryShaderOutputPrimitiveType(PrimitiveMode::TriangleStrip), >@@ -210,18 +223,14 @@ ProgramExecutable::ProgramExecutable(const ProgramExecutable &other) > mUniforms(other.mUniforms), > mDefaultUniformRange(other.mDefaultUniformRange), > mSamplerUniformRange(other.mSamplerUniformRange), >+ mImageUniformRange(other.mImageUniformRange), >+ mAtomicCounterUniformRange(other.mAtomicCounterUniformRange), > mUniformBlocks(other.mUniformBlocks), > mActiveUniformBlockBindings(other.mActiveUniformBlockBindings), > mAtomicCounterBuffers(other.mAtomicCounterBuffers), >- mImageUniformRange(other.mImageUniformRange), > mShaderStorageBlocks(other.mShaderStorageBlocks), > mFragmentInoutRange(other.mFragmentInoutRange), >- mPipelineHasUniformBuffers(other.mPipelineHasUniformBuffers), >- mPipelineHasStorageBuffers(other.mPipelineHasStorageBuffers), >- mPipelineHasAtomicCounterBuffers(other.mPipelineHasAtomicCounterBuffers), >- mPipelineHasDefaultUniforms(other.mPipelineHasDefaultUniforms), >- mPipelineHasTextures(other.mPipelineHasTextures), >- mPipelineHasImages(other.mPipelineHasImages) >+ mUsesEarlyFragmentTestsOptimization(other.mUsesEarlyFragmentTestsOptimization) > { > reset(); > } >@@ -260,11 +269,13 @@ void ProgramExecutable::reset() > mSamplerBindings.clear(); > mImageBindings.clear(); > >- mPipelineHasUniformBuffers = false; >- mPipelineHasStorageBuffers = false; >- mPipelineHasAtomicCounterBuffers = false; >- mPipelineHasDefaultUniforms = false; >- mPipelineHasTextures = false; >+ mDefaultUniformRange = RangeUI(0, 0); >+ mSamplerUniformRange = RangeUI(0, 0); >+ mImageUniformRange = RangeUI(0, 0); >+ mAtomicCounterUniformRange = RangeUI(0, 0); >+ >+ mFragmentInoutRange = RangeUI(0, 0); >+ mUsesEarlyFragmentTestsOptimization = false; > > mGeometryShaderInputPrimitiveType = PrimitiveMode::Triangles; > mGeometryShaderOutputPrimitiveType = PrimitiveMode::TriangleStrip; >@@ -295,13 +306,9 @@ void ProgramExecutable::load(bool isSeparable, gl::BinaryInputStream *stream) > unsigned int fragmentInoutRangeHigh = stream->readInt<uint32_t>(); > mFragmentInoutRange = RangeUI(fragmentInoutRangeLow, fragmentInoutRangeHigh); > >- mLinkedShaderStages = ShaderBitSet(stream->readInt<uint8_t>()); >+ mUsesEarlyFragmentTestsOptimization = stream->readBool(); > >- mPipelineHasUniformBuffers = stream->readBool(); >- mPipelineHasStorageBuffers = stream->readBool(); >- mPipelineHasAtomicCounterBuffers = stream->readBool(); >- mPipelineHasDefaultUniforms = stream->readBool(); >- mPipelineHasTextures = stream->readBool(); >+ mLinkedShaderStages = ShaderBitSet(stream->readInt<uint8_t>()); > > mGeometryShaderInputPrimitiveType = stream->readEnum<PrimitiveMode>(); > mGeometryShaderOutputPrimitiveType = stream->readEnum<PrimitiveMode>(); >@@ -480,6 +487,10 @@ void ProgramExecutable::load(bool isSeparable, gl::BinaryInputStream *stream) > mImageBindings.emplace_back(imageBinding); > } > >+ unsigned int atomicCounterRangeLow = stream->readInt<unsigned int>(); >+ unsigned int atomicCounterRangeHigh = stream->readInt<unsigned int>(); >+ mAtomicCounterUniformRange = RangeUI(atomicCounterRangeLow, atomicCounterRangeHigh); >+ > // These values are currently only used by PPOs, so only load them when the program is marked > // separable to save memory. > if (isSeparable) >@@ -523,13 +534,9 @@ void ProgramExecutable::save(bool isSeparable, gl::BinaryOutputStream *stream) c > stream->writeInt(mFragmentInoutRange.low()); > stream->writeInt(mFragmentInoutRange.high()); > >- stream->writeInt(mLinkedShaderStages.bits()); >+ stream->writeBool(mUsesEarlyFragmentTestsOptimization); > >- stream->writeBool(mPipelineHasUniformBuffers); >- stream->writeBool(mPipelineHasStorageBuffers); >- stream->writeBool(mPipelineHasAtomicCounterBuffers); >- stream->writeBool(mPipelineHasDefaultUniforms); >- stream->writeBool(mPipelineHasTextures); >+ stream->writeInt(mLinkedShaderStages.bits()); > > ASSERT(mGeometryShaderInvocations >= 1 && mGeometryShaderMaxVertices >= 0); > stream->writeEnum(mGeometryShaderInputPrimitiveType); >@@ -665,6 +672,9 @@ void ProgramExecutable::save(bool isSeparable, gl::BinaryOutputStream *stream) c > } > } > >+ stream->writeInt(getAtomicCounterUniformRange().low()); >+ stream->writeInt(getAtomicCounterUniformRange().high()); >+ > // These values are currently only used by PPOs, so only save them when the program is marked > // separable to save memory. > if (isSeparable) >@@ -728,34 +738,32 @@ AttributesMask ProgramExecutable::getAttributesMask() const > > bool ProgramExecutable::hasDefaultUniforms() const > { >- return !getDefaultUniformRange().empty() || mPipelineHasDefaultUniforms; >+ return !getDefaultUniformRange().empty(); > } > > bool ProgramExecutable::hasTextures() const > { >- return !getSamplerBindings().empty() || mPipelineHasTextures; >+ return !getSamplerBindings().empty(); > } > >-// TODO: http://anglebug.com/3570: Remove mHas*UniformBuffers once PPO's have valid data in >-// mUniformBlocks > bool ProgramExecutable::hasUniformBuffers() const > { >- return !mUniformBlocks.empty() || mPipelineHasUniformBuffers; >+ return !mUniformBlocks.empty(); > } > > bool ProgramExecutable::hasStorageBuffers() const > { >- return !mShaderStorageBlocks.empty() || mPipelineHasStorageBuffers; >+ return !mShaderStorageBlocks.empty(); > } > > bool ProgramExecutable::hasAtomicCounterBuffers() const > { >- return !mAtomicCounterBuffers.empty() || mPipelineHasAtomicCounterBuffers; >+ return !mAtomicCounterBuffers.empty(); > } > > bool ProgramExecutable::hasImages() const > { >- return !mImageBindings.empty() || mPipelineHasImages; >+ return !mImageBindings.empty(); > } > > bool ProgramExecutable::usesFramebufferFetch() const >@@ -769,6 +777,12 @@ GLuint ProgramExecutable::getUniformIndexFromImageIndex(GLuint imageIndex) const > return imageIndex + mImageUniformRange.low(); > } > >+GLuint ProgramExecutable::getUniformIndexFromSamplerIndex(GLuint samplerIndex) const >+{ >+ ASSERT(samplerIndex < mSamplerUniformRange.length()); >+ return samplerIndex + mSamplerUniformRange.low(); >+} >+ > void ProgramExecutable::updateActiveSamplers(const ProgramState &programState) > { > const std::vector<SamplerBinding> &samplerBindings = programState.getSamplerBindings(); >@@ -1129,6 +1143,11 @@ void ProgramExecutable::gatherTransformFeedbackVaryings( > > void ProgramExecutable::updateTransformFeedbackStrides() > { >+ if (mLinkedTransformFeedbackVaryings.empty()) >+ { >+ return; >+ } >+ > if (mTransformFeedbackBufferMode == GL_INTERLEAVED_ATTRIBS) > { > mTransformFeedbackStrides.resize(1); >@@ -1447,4 +1466,222 @@ bool ProgramExecutable::linkValidateOutputVariables( > return true; > } > >+bool ProgramExecutable::linkUniforms( >+ const Context *context, >+ const ShaderMap<std::vector<sh::ShaderVariable>> &shaderUniforms, >+ InfoLog &infoLog, >+ const ProgramAliasedBindings &uniformLocationBindings, >+ GLuint *combinedImageUniformsCountOut, >+ std::vector<UnusedUniform> *unusedUniformsOutOrNull, >+ std::vector<VariableLocation> *uniformLocationsOutOrNull) >+{ >+ UniformLinker linker(mLinkedShaderStages, shaderUniforms); >+ if (!linker.link(context->getCaps(), infoLog, uniformLocationBindings)) >+ { >+ return false; >+ } >+ >+ linker.getResults(&mUniforms, unusedUniformsOutOrNull, uniformLocationsOutOrNull); >+ >+ linkSamplerAndImageBindings(combinedImageUniformsCountOut); >+ >+ if (!linkAtomicCounterBuffers()) >+ { >+ return false; >+ } >+ >+ return true; >+} >+ >+void ProgramExecutable::linkSamplerAndImageBindings(GLuint *combinedImageUniforms) >+{ >+ ASSERT(combinedImageUniforms); >+ >+ // Iterate over mExecutable->mUniforms from the back, and find the range of subpass inputs, >+ // atomic counters, images and samplers in that order. >+ auto highIter = mUniforms.rbegin(); >+ auto lowIter = highIter; >+ >+ unsigned int high = static_cast<unsigned int>(mUniforms.size()); >+ unsigned int low = high; >+ >+ // Note that uniform block uniforms are not yet appended to this list. >+ ASSERT(mUniforms.empty() || highIter->isAtomicCounter() || highIter->isImage() || >+ highIter->isSampler() || highIter->isInDefaultBlock() || highIter->isFragmentInOut); >+ >+ for (; lowIter != mUniforms.rend() && lowIter->isFragmentInOut; ++lowIter) >+ { >+ --low; >+ } >+ >+ mFragmentInoutRange = RangeUI(low, high); >+ >+ highIter = lowIter; >+ high = low; >+ >+ for (; lowIter != mUniforms.rend() && lowIter->isAtomicCounter(); ++lowIter) >+ { >+ --low; >+ } >+ >+ mAtomicCounterUniformRange = RangeUI(low, high); >+ >+ highIter = lowIter; >+ high = low; >+ >+ for (; lowIter != mUniforms.rend() && lowIter->isImage(); ++lowIter) >+ { >+ --low; >+ } >+ >+ mImageUniformRange = RangeUI(low, high); >+ *combinedImageUniforms = 0u; >+ // If uniform is a image type, insert it into the mImageBindings array. >+ for (unsigned int imageIndex : mImageUniformRange) >+ { >+ // ES3.1 (section 7.6.1) and GLSL ES3.1 (section 4.4.5), Uniform*i{v} commands >+ // cannot load values into a uniform defined as an image. if declare without a >+ // binding qualifier, any uniform image variable (include all elements of >+ // unbound image array) should be bound to unit zero. >+ auto &imageUniform = mUniforms[imageIndex]; >+ TextureType textureType = ImageTypeToTextureType(imageUniform.type); >+ const GLuint arraySize = imageUniform.isArray() ? imageUniform.arraySizes[0] : 1u; >+ >+ if (imageUniform.binding == -1) >+ { >+ mImageBindings.emplace_back( >+ ImageBinding(imageUniform.getBasicTypeElementCount(), textureType)); >+ } >+ else >+ { >+ // The arrays of arrays are flattened to arrays, it needs to record the array offset for >+ // the correct binding image unit. >+ mImageBindings.emplace_back( >+ ImageBinding(imageUniform.binding + imageUniform.parentArrayIndex() * arraySize, >+ imageUniform.getBasicTypeElementCount(), textureType)); >+ } >+ >+ *combinedImageUniforms += imageUniform.activeShaderCount() * arraySize; >+ } >+ >+ highIter = lowIter; >+ high = low; >+ >+ for (; lowIter != mUniforms.rend() && lowIter->isSampler(); ++lowIter) >+ { >+ --low; >+ } >+ >+ mSamplerUniformRange = RangeUI(low, high); >+ >+ // If uniform is a sampler type, insert it into the mSamplerBindings array. >+ for (unsigned int samplerIndex : mSamplerUniformRange) >+ { >+ const auto &samplerUniform = mUniforms[samplerIndex]; >+ TextureType textureType = SamplerTypeToTextureType(samplerUniform.type); >+ GLenum samplerType = samplerUniform.typeInfo->type; >+ unsigned int elementCount = samplerUniform.getBasicTypeElementCount(); >+ SamplerFormat format = samplerUniform.typeInfo->samplerFormat; >+ mSamplerBindings.emplace_back(textureType, samplerType, format, elementCount); >+ } >+ >+ // Whatever is left constitutes the default uniforms. >+ mDefaultUniformRange = RangeUI(0, low); >+} >+ >+bool ProgramExecutable::linkAtomicCounterBuffers() >+{ >+ for (unsigned int index : mAtomicCounterUniformRange) >+ { >+ auto &uniform = mUniforms[index]; >+ uniform.blockInfo.offset = uniform.offset; >+ uniform.blockInfo.arrayStride = (uniform.isArray() ? 4 : 0); >+ uniform.blockInfo.matrixStride = 0; >+ uniform.blockInfo.isRowMajorMatrix = false; >+ >+ bool found = false; >+ for (unsigned int bufferIndex = 0; bufferIndex < getActiveAtomicCounterBufferCount(); >+ ++bufferIndex) >+ { >+ auto &buffer = mAtomicCounterBuffers[bufferIndex]; >+ if (buffer.binding == uniform.binding) >+ { >+ buffer.memberIndexes.push_back(index); >+ uniform.bufferIndex = bufferIndex; >+ found = true; >+ buffer.unionReferencesWith(uniform); >+ break; >+ } >+ } >+ if (!found) >+ { >+ AtomicCounterBuffer atomicCounterBuffer; >+ atomicCounterBuffer.binding = uniform.binding; >+ atomicCounterBuffer.memberIndexes.push_back(index); >+ atomicCounterBuffer.unionReferencesWith(uniform); >+ mAtomicCounterBuffers.push_back(atomicCounterBuffer); >+ uniform.bufferIndex = static_cast<int>(getActiveAtomicCounterBufferCount() - 1); >+ } >+ } >+ >+ // TODO(jie.a.chen@intel.com): Count each atomic counter buffer to validate against >+ // gl_Max[Vertex|Fragment|Compute|Geometry|Combined]AtomicCounterBuffers. >+ >+ return true; >+} >+ >+void ProgramExecutable::copyShaderBuffersFromProgram(const ProgramState &programState) >+{ >+ const std::vector<InterfaceBlock> &ubos = programState.getUniformBlocks(); >+ mUniformBlocks.insert(mUniformBlocks.end(), ubos.begin(), ubos.end()); >+ >+ const std::vector<InterfaceBlock> &ssbos = programState.getShaderStorageBlocks(); >+ mShaderStorageBlocks.insert(mShaderStorageBlocks.end(), ssbos.begin(), ssbos.end()); >+ >+ const std::vector<AtomicCounterBuffer> &atomics = programState.getAtomicCounterBuffers(); >+ mAtomicCounterBuffers.insert(mAtomicCounterBuffers.end(), atomics.begin(), atomics.end()); >+} >+ >+void ProgramExecutable::clearSamplerBindings() >+{ >+ mSamplerBindings.clear(); >+} >+ >+void ProgramExecutable::copySamplerBindingsFromProgram(const ProgramState &programState) >+{ >+ const std::vector<SamplerBinding> &bindings = programState.getSamplerBindings(); >+ mSamplerBindings.insert(mSamplerBindings.end(), bindings.begin(), bindings.end()); >+} >+ >+void ProgramExecutable::copyImageBindingsFromProgram(const ProgramState &programState) >+{ >+ const std::vector<ImageBinding> &bindings = programState.getImageBindings(); >+ mImageBindings.insert(mImageBindings.end(), bindings.begin(), bindings.end()); >+} >+ >+void ProgramExecutable::copyUniformsFromProgramMap(const ShaderMap<Program *> &programs) >+{ >+ // Merge default uniforms. >+ auto getDefaultRange = [](const ProgramState &state) { return state.getDefaultUniformRange(); }; >+ mDefaultUniformRange = AddUniforms(programs, mLinkedShaderStages, mUniforms, getDefaultRange); >+ >+ // Merge sampler uniforms. >+ auto getSamplerRange = [](const ProgramState &state) { return state.getSamplerUniformRange(); }; >+ mSamplerUniformRange = AddUniforms(programs, mLinkedShaderStages, mUniforms, getSamplerRange); >+ >+ // Merge image uniforms. >+ auto getImageRange = [](const ProgramState &state) { return state.getImageUniformRange(); }; >+ mImageUniformRange = AddUniforms(programs, mLinkedShaderStages, mUniforms, getImageRange); >+ >+ // Merge atomic counter uniforms. >+ auto getAtomicRange = [](const ProgramState &state) { >+ return state.getAtomicCounterUniformRange(); >+ }; >+ mAtomicCounterUniformRange = >+ AddUniforms(programs, mLinkedShaderStages, mUniforms, getAtomicRange); >+ >+ // Merge fragment in/out uniforms. >+ auto getInoutRange = [](const ProgramState &state) { return state.getFragmentInoutRange(); }; >+ mFragmentInoutRange = AddUniforms(programs, mLinkedShaderStages, mUniforms, getInoutRange); >+} > } // namespace gl >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.h b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.h >index 0196bbaefb33bdf97535538f5d41eadad631342c..53de227f40291a338b6d173433ae72b576563eb4 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramExecutable.h >@@ -217,7 +217,9 @@ class ProgramExecutable final : public angle::Subject > const RangeUI &getDefaultUniformRange() const { return mDefaultUniformRange; } > const RangeUI &getSamplerUniformRange() const { return mSamplerUniformRange; } > const RangeUI &getImageUniformRange() const { return mImageUniformRange; } >+ const RangeUI &getAtomicCounterUniformRange() const { return mAtomicCounterUniformRange; } > const RangeUI &getFragmentInoutRange() const { return mFragmentInoutRange; } >+ bool usesEarlyFragmentTestsOptimization() const { return mUsesEarlyFragmentTestsOptimization; } > const std::vector<TransformFeedbackVarying> &getLinkedTransformFeedbackVaryings() const > { > return mLinkedTransformFeedbackVaryings; >@@ -269,6 +271,8 @@ class ProgramExecutable final : public angle::Subject > > GLuint getUniformIndexFromImageIndex(GLuint imageIndex) const; > >+ GLuint getUniformIndexFromSamplerIndex(GLuint samplerIndex) const; >+ > void saveLinkedStateInfo(const ProgramState &state); > const std::vector<sh::ShaderVariable> &getLinkedOutputVaryings(ShaderType shaderType) const > { >@@ -329,6 +333,20 @@ class ProgramExecutable final : public angle::Subject > ComponentTypeMask getFragmentOutputsTypeMask() const { return mDrawBufferTypeMask; } > DrawBufferMask getActiveOutputVariablesMask() const { return mActiveOutputVariablesMask; } > >+ bool linkUniforms(const Context *context, >+ const ShaderMap<std::vector<sh::ShaderVariable>> &shaderUniforms, >+ InfoLog &infoLog, >+ const ProgramAliasedBindings &uniformLocationBindings, >+ GLuint *combinedImageUniformsCount, >+ std::vector<UnusedUniform> *unusedUniforms, >+ std::vector<VariableLocation> *uniformLocationsOutOrNull); >+ >+ void copyShaderBuffersFromProgram(const ProgramState &programState); >+ void clearSamplerBindings(); >+ void copySamplerBindingsFromProgram(const ProgramState &programState); >+ void copyImageBindingsFromProgram(const ProgramState &programState); >+ void copyUniformsFromProgramMap(const ShaderMap<Program *> &programs); >+ > private: > // TODO(timvp): http://anglebug.com/3570: Investigate removing these friend > // class declarations and accessing the necessary members with getters/setters. >@@ -374,6 +392,9 @@ class ProgramExecutable final : public angle::Subject > const ProgramAliasedBindings &fragmentOutputLocations, > const ProgramAliasedBindings &fragmentOutputIndices); > >+ void linkSamplerAndImageBindings(GLuint *combinedImageUniformsCount); >+ bool linkAtomicCounterBuffers(); >+ > InfoLog mInfoLog; > > ShaderBitSet mLinkedShaderStages; >@@ -427,15 +448,18 @@ class ProgramExecutable final : public angle::Subject > std::vector<LinkedUniform> mUniforms; > RangeUI mDefaultUniformRange; > RangeUI mSamplerUniformRange; >+ RangeUI mImageUniformRange; >+ RangeUI mAtomicCounterUniformRange; > std::vector<InterfaceBlock> mUniformBlocks; > > // For faster iteration on the blocks currently being bound. > UniformBlockBindingMask mActiveUniformBlockBindings; > > std::vector<AtomicCounterBuffer> mAtomicCounterBuffers; >- RangeUI mImageUniformRange; > std::vector<InterfaceBlock> mShaderStorageBlocks; >+ > RangeUI mFragmentInoutRange; >+ bool mUsesEarlyFragmentTestsOptimization; > > // An array of the samplers that are used by the program > std::vector<SamplerBinding> mSamplerBindings; >@@ -443,15 +467,6 @@ class ProgramExecutable final : public angle::Subject > // An array of the images that are used by the program > std::vector<ImageBinding> mImageBindings; > >- // TODO: http://anglebug.com/3570: Remove mPipelineHas*UniformBuffers once PPO's have valid data >- // in mUniformBlocks >- bool mPipelineHasUniformBuffers; >- bool mPipelineHasStorageBuffers; >- bool mPipelineHasAtomicCounterBuffers; >- bool mPipelineHasDefaultUniforms; >- bool mPipelineHasTextures; >- bool mPipelineHasImages; >- > ShaderMap<std::vector<sh::ShaderVariable>> mLinkedOutputVaryings; > ShaderMap<std::vector<sh::ShaderVariable>> mLinkedInputVaryings; > ShaderMap<std::vector<sh::ShaderVariable>> mLinkedUniforms; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.cpp >index fd4a75ba050379df07cc4094e2c4a648e5d9f50c..b5a25c8a6800202016bc213bc474c3af661c451e 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.cpp >@@ -85,41 +85,6 @@ LinkMismatchError LinkValidateUniforms(const sh::ShaderVariable &uniform1, > return LinkMismatchError::NO_MISMATCH; > } > >-using ShaderUniform = std::pair<ShaderType, const sh::ShaderVariable *>; >- >-bool ValidateGraphicsUniformsPerShader(Shader *shaderToLink, >- bool extendLinkedUniforms, >- std::map<std::string, ShaderUniform> *linkedUniforms, >- InfoLog &infoLog) >-{ >- ASSERT(shaderToLink && linkedUniforms); >- >- for (const sh::ShaderVariable &uniform : shaderToLink->getUniforms()) >- { >- const auto &entry = linkedUniforms->find(uniform.name); >- if (entry != linkedUniforms->end()) >- { >- const sh::ShaderVariable &linkedUniform = *(entry->second.second); >- std::string mismatchedStructFieldName; >- LinkMismatchError linkError = >- LinkValidateUniforms(uniform, linkedUniform, &mismatchedStructFieldName); >- if (linkError != LinkMismatchError::NO_MISMATCH) >- { >- LogLinkMismatch(infoLog, uniform.name, "uniform", linkError, >- mismatchedStructFieldName, entry->second.first, >- shaderToLink->getType()); >- return false; >- } >- } >- else if (extendLinkedUniforms) >- { >- (*linkedUniforms)[uniform.name] = std::make_pair(shaderToLink->getType(), &uniform); >- } >- } >- >- return true; >-} >- > GLuint GetMaximumShaderUniformVectors(ShaderType shaderType, const Caps &caps) > { > switch (shaderType) >@@ -789,29 +754,123 @@ bool DoShaderVariablesMatch(int frontShaderVersion, > > return false; > } >+ >+const char *GetInterfaceBlockTypeString(sh::BlockType blockType) >+{ >+ switch (blockType) >+ { >+ case sh::BlockType::BLOCK_UNIFORM: >+ return "uniform block"; >+ case sh::BlockType::BLOCK_BUFFER: >+ return "shader storage block"; >+ default: >+ UNREACHABLE(); >+ return ""; >+ } >+} >+ >+std::string GetInterfaceBlockLimitName(ShaderType shaderType, sh::BlockType blockType) >+{ >+ std::ostringstream stream; >+ stream << "GL_MAX_" << GetShaderTypeString(shaderType) << "_"; >+ >+ switch (blockType) >+ { >+ case sh::BlockType::BLOCK_UNIFORM: >+ stream << "UNIFORM_BUFFERS"; >+ break; >+ case sh::BlockType::BLOCK_BUFFER: >+ stream << "SHADER_STORAGE_BLOCKS"; >+ break; >+ default: >+ UNREACHABLE(); >+ return ""; >+ } >+ >+ if (shaderType == ShaderType::Geometry) >+ { >+ stream << "_EXT"; >+ } >+ >+ return stream.str(); >+} >+ >+void LogInterfaceBlocksExceedLimit(InfoLog &infoLog, >+ ShaderType shaderType, >+ sh::BlockType blockType, >+ GLuint limit) >+{ >+ infoLog << GetShaderTypeString(shaderType) << " shader " >+ << GetInterfaceBlockTypeString(blockType) << " count exceeds " >+ << GetInterfaceBlockLimitName(shaderType, blockType) << " (" << limit << ")"; >+} >+ >+bool ValidateInterfaceBlocksCount(GLuint maxInterfaceBlocks, >+ const std::vector<sh::InterfaceBlock> &interfaceBlocks, >+ ShaderType shaderType, >+ sh::BlockType blockType, >+ GLuint *combinedInterfaceBlocksCount, >+ InfoLog &infoLog) >+{ >+ GLuint blockCount = 0; >+ for (const sh::InterfaceBlock &block : interfaceBlocks) >+ { >+ if (IsActiveInterfaceBlock(block)) >+ { >+ blockCount += std::max(block.arraySize, 1u); >+ if (blockCount > maxInterfaceBlocks) >+ { >+ LogInterfaceBlocksExceedLimit(infoLog, shaderType, blockType, maxInterfaceBlocks); >+ return false; >+ } >+ } >+ } >+ >+ // [OpenGL ES 3.1] Chapter 7.6.2 Page 105: >+ // If a uniform block is used by multiple shader stages, each such use counts separately >+ // against this combined limit. >+ // [OpenGL ES 3.1] Chapter 7.8 Page 111: >+ // If a shader storage block in a program is referenced by multiple shaders, each such >+ // reference counts separately against this combined limit. >+ if (combinedInterfaceBlocksCount) >+ { >+ *combinedInterfaceBlocksCount += blockCount; >+ } >+ >+ return true; >+} > } // anonymous namespace > >-UniformLinker::UniformLinker(const ProgramState &state) : mState(state) {} >+UniformLinker::UniformLinker(const ShaderBitSet &activeShaderStages, >+ const ShaderMap<std::vector<sh::ShaderVariable>> &shaderUniforms) >+ : mActiveShaderStages(activeShaderStages), mShaderUniforms(shaderUniforms) >+{} > > UniformLinker::~UniformLinker() = default; > > void UniformLinker::getResults(std::vector<LinkedUniform> *uniforms, >- std::vector<UnusedUniform> *unusedUniforms, >- std::vector<VariableLocation> *uniformLocations) >+ std::vector<UnusedUniform> *unusedUniformsOutOrNull, >+ std::vector<VariableLocation> *uniformLocationsOutOrNull) > { > uniforms->swap(mUniforms); >- unusedUniforms->swap(mUnusedUniforms); >- uniformLocations->swap(mUniformLocations); >+ >+ if (unusedUniformsOutOrNull) >+ { >+ unusedUniformsOutOrNull->swap(mUnusedUniforms); >+ } >+ >+ if (uniformLocationsOutOrNull) >+ { >+ uniformLocationsOutOrNull->swap(mUniformLocations); >+ } > } > > bool UniformLinker::link(const Caps &caps, > InfoLog &infoLog, > const ProgramAliasedBindings &uniformLocationBindings) > { >- if (mState.getAttachedShader(ShaderType::Vertex) && >- mState.getAttachedShader(ShaderType::Fragment)) >+ if (mActiveShaderStages[ShaderType::Vertex] && mActiveShaderStages[ShaderType::Fragment]) > { >- ASSERT(mState.getAttachedShader(ShaderType::Compute) == nullptr); > if (!validateGraphicsUniforms(infoLog)) > { > return false; >@@ -843,27 +902,23 @@ bool UniformLinker::validateGraphicsUniforms(InfoLog &infoLog) const > // Check that uniforms defined in the graphics shaders are identical > std::map<std::string, ShaderUniform> linkedUniforms; > >- for (const ShaderType shaderType : kAllGraphicsShaderTypes) >+ for (const ShaderType shaderType : mActiveShaderStages) > { >- Shader *currentShader = mState.getAttachedShader(shaderType); >- if (currentShader) >+ if (shaderType == ShaderType::Vertex) > { >- if (shaderType == ShaderType::Vertex) >+ for (const sh::ShaderVariable &vertexUniform : mShaderUniforms[ShaderType::Vertex]) > { >- for (const sh::ShaderVariable &vertexUniform : currentShader->getUniforms()) >- { >- linkedUniforms[vertexUniform.name] = >- std::make_pair(ShaderType::Vertex, &vertexUniform); >- } >+ linkedUniforms[vertexUniform.name] = >+ std::make_pair(ShaderType::Vertex, &vertexUniform); > } >- else >+ } >+ else >+ { >+ bool isLastShader = (shaderType == ShaderType::Fragment); >+ if (!validateGraphicsUniformsPerShader(shaderType, !isLastShader, &linkedUniforms, >+ infoLog)) > { >- bool isLastShader = (shaderType == ShaderType::Fragment); >- if (!ValidateGraphicsUniformsPerShader(currentShader, !isLastShader, >- &linkedUniforms, infoLog)) >- { >- return false; >- } >+ return false; > } > } > } >@@ -871,6 +926,39 @@ bool UniformLinker::validateGraphicsUniforms(InfoLog &infoLog) const > return true; > } > >+bool UniformLinker::validateGraphicsUniformsPerShader( >+ ShaderType shaderToLink, >+ bool extendLinkedUniforms, >+ std::map<std::string, ShaderUniform> *linkedUniforms, >+ InfoLog &infoLog) const >+{ >+ ASSERT(mActiveShaderStages[shaderToLink] && linkedUniforms); >+ >+ for (const sh::ShaderVariable &uniform : mShaderUniforms[shaderToLink]) >+ { >+ const auto &entry = linkedUniforms->find(uniform.name); >+ if (entry != linkedUniforms->end()) >+ { >+ const sh::ShaderVariable &linkedUniform = *(entry->second.second); >+ std::string mismatchedStructFieldName; >+ LinkMismatchError linkError = >+ LinkValidateUniforms(uniform, linkedUniform, &mismatchedStructFieldName); >+ if (linkError != LinkMismatchError::NO_MISMATCH) >+ { >+ LogLinkMismatch(infoLog, uniform.name, "uniform", linkError, >+ mismatchedStructFieldName, entry->second.first, shaderToLink); >+ return false; >+ } >+ } >+ else if (extendLinkedUniforms) >+ { >+ (*linkedUniforms)[uniform.name] = std::make_pair(shaderToLink, &uniform); >+ } >+ } >+ >+ return true; >+} >+ > bool UniformLinker::indexUniforms(InfoLog &infoLog, > const ProgramAliasedBindings &uniformLocationBindings) > { >@@ -1059,7 +1147,7 @@ void UniformLinker::pruneUnusedUniforms() > } > > bool UniformLinker::flattenUniformsAndCheckCapsForShader( >- Shader *shader, >+ ShaderType shaderType, > const Caps &caps, > std::vector<LinkedUniform> &samplerUniforms, > std::vector<LinkedUniform> &imageUniforms, >@@ -1069,9 +1157,9 @@ bool UniformLinker::flattenUniformsAndCheckCapsForShader( > InfoLog &infoLog) > { > ShaderUniformCount shaderUniformCount; >- for (const sh::ShaderVariable &uniform : shader->getUniforms()) >+ for (const sh::ShaderVariable &uniform : mShaderUniforms[shaderType]) > { >- FlattenUniformVisitor flattener(shader->getType(), uniform, &mUniforms, &samplerUniforms, >+ FlattenUniformVisitor flattener(shaderType, uniform, &mUniforms, &samplerUniforms, > &imageUniforms, &atomicCounterUniforms, > &inputAttachmentUniforms, &unusedUniforms); > sh::TraverseShaderVariable(uniform, false, &flattener); >@@ -1088,9 +1176,7 @@ bool UniformLinker::flattenUniformsAndCheckCapsForShader( > } > } > >- ShaderType shaderType = shader->getType(); >- >- // TODO (jiawei.shao@intel.com): check whether we need finer-grained component counting >+ // This code does not do fine-grained component counting. > GLuint maxUniformVectorsCount = GetMaximumShaderUniformVectors(shaderType, caps); > if (shaderUniformCount.vectorCount > maxUniformVectorsCount) > { >@@ -1145,15 +1231,9 @@ bool UniformLinker::flattenUniformsAndCheckCaps(const Caps &caps, InfoLog &infoL > std::vector<LinkedUniform> inputAttachmentUniforms; > std::vector<UnusedUniform> unusedUniforms; > >- for (const ShaderType shaderType : AllShaderTypes()) >+ for (const ShaderType shaderType : mActiveShaderStages) > { >- Shader *shader = mState.getAttachedShader(shaderType); >- if (!shader) >- { >- continue; >- } >- >- if (!flattenUniformsAndCheckCapsForShader(shader, caps, samplerUniforms, imageUniforms, >+ if (!flattenUniformsAndCheckCapsForShader(shaderType, caps, samplerUniforms, imageUniforms, > atomicCounterUniforms, inputAttachmentUniforms, > unusedUniforms, infoLog)) > { >@@ -1953,4 +2033,317 @@ bool LinkValidateBuiltInVaryings(const std::vector<sh::ShaderVariable> &outputVa > } > return true; > } >+ >+void LogAmbiguousFieldLinkMismatch(InfoLog &infoLog, >+ const std::string &blockName1, >+ const std::string &blockName2, >+ const std::string &fieldName, >+ ShaderType shaderType1, >+ ShaderType shaderType2) >+{ >+ infoLog << "Ambiguous field '" << fieldName << "' in blocks '" << blockName1 << "' (" >+ << GetShaderTypeString(shaderType1) << " shader) and '" << blockName2 << "' (" >+ << GetShaderTypeString(shaderType2) << " shader) which don't have instance names."; >+} >+ >+bool ValidateInstancelessGraphicsInterfaceBlocksPerShader( >+ const std::vector<sh::InterfaceBlock> &interfaceBlocks, >+ ShaderType shaderType, >+ InterfaceBlockMap *instancelessBlocksFields, >+ InfoLog &infoLog) >+{ >+ ASSERT(instancelessBlocksFields); >+ >+ for (const sh::InterfaceBlock &block : interfaceBlocks) >+ { >+ if (!block.instanceName.empty()) >+ { >+ continue; >+ } >+ >+ for (const sh::ShaderVariable &field : block.fields) >+ { >+ const auto &entry = instancelessBlocksFields->find(field.name); >+ if (entry != instancelessBlocksFields->end()) >+ { >+ const sh::InterfaceBlock &linkedBlock = *(entry->second.second); >+ if (block.name != linkedBlock.name) >+ { >+ LogAmbiguousFieldLinkMismatch(infoLog, block.name, linkedBlock.name, field.name, >+ entry->second.first, shaderType); >+ return false; >+ } >+ } >+ else >+ { >+ (*instancelessBlocksFields)[field.name] = std::make_pair(shaderType, &block); >+ } >+ } >+ } >+ >+ return true; >+} >+ >+LinkMismatchError LinkValidateInterfaceBlockFields(const sh::ShaderVariable &blockField1, >+ const sh::ShaderVariable &blockField2, >+ bool webglCompatibility, >+ std::string *mismatchedBlockFieldName) >+{ >+ if (blockField1.name != blockField2.name) >+ { >+ return LinkMismatchError::FIELD_NAME_MISMATCH; >+ } >+ >+ // If webgl, validate precision of UBO fields, otherwise don't. See Khronos bug 10287. >+ LinkMismatchError linkError = LinkValidateProgramVariables( >+ blockField1, blockField2, webglCompatibility, false, false, mismatchedBlockFieldName); >+ if (linkError != LinkMismatchError::NO_MISMATCH) >+ { >+ AddProgramVariableParentPrefix(blockField1.name, mismatchedBlockFieldName); >+ return linkError; >+ } >+ >+ if (blockField1.isRowMajorLayout != blockField2.isRowMajorLayout) >+ { >+ AddProgramVariableParentPrefix(blockField1.name, mismatchedBlockFieldName); >+ return LinkMismatchError::MATRIX_PACKING_MISMATCH; >+ } >+ >+ return LinkMismatchError::NO_MISMATCH; >+} >+ >+LinkMismatchError AreMatchingInterfaceBlocks(const sh::InterfaceBlock &interfaceBlock1, >+ const sh::InterfaceBlock &interfaceBlock2, >+ bool webglCompatibility, >+ std::string *mismatchedBlockFieldName) >+{ >+ // validate blocks for the same member types >+ if (interfaceBlock1.fields.size() != interfaceBlock2.fields.size()) >+ { >+ return LinkMismatchError::FIELD_NUMBER_MISMATCH; >+ } >+ if (interfaceBlock1.arraySize != interfaceBlock2.arraySize) >+ { >+ return LinkMismatchError::ARRAY_SIZE_MISMATCH; >+ } >+ if (interfaceBlock1.layout != interfaceBlock2.layout || >+ interfaceBlock1.binding != interfaceBlock2.binding) >+ { >+ return LinkMismatchError::LAYOUT_QUALIFIER_MISMATCH; >+ } >+ if (interfaceBlock1.instanceName.empty() != interfaceBlock2.instanceName.empty()) >+ { >+ return LinkMismatchError::INSTANCE_NAME_MISMATCH; >+ } >+ const unsigned int numBlockMembers = static_cast<unsigned int>(interfaceBlock1.fields.size()); >+ for (unsigned int blockMemberIndex = 0; blockMemberIndex < numBlockMembers; blockMemberIndex++) >+ { >+ const sh::ShaderVariable &member1 = interfaceBlock1.fields[blockMemberIndex]; >+ const sh::ShaderVariable &member2 = interfaceBlock2.fields[blockMemberIndex]; >+ >+ LinkMismatchError linkError = LinkValidateInterfaceBlockFields( >+ member1, member2, webglCompatibility, mismatchedBlockFieldName); >+ if (linkError != LinkMismatchError::NO_MISMATCH) >+ { >+ return linkError; >+ } >+ } >+ return LinkMismatchError::NO_MISMATCH; >+} >+ >+void InitializeInterfaceBlockMap(const std::vector<sh::InterfaceBlock> &interfaceBlocks, >+ ShaderType shaderType, >+ InterfaceBlockMap *linkedInterfaceBlocks) >+{ >+ ASSERT(linkedInterfaceBlocks); >+ >+ for (const sh::InterfaceBlock &interfaceBlock : interfaceBlocks) >+ { >+ (*linkedInterfaceBlocks)[interfaceBlock.name] = std::make_pair(shaderType, &interfaceBlock); >+ } >+} >+ >+bool ValidateGraphicsInterfaceBlocksPerShader( >+ const std::vector<sh::InterfaceBlock> &interfaceBlocksToLink, >+ ShaderType shaderType, >+ bool webglCompatibility, >+ InterfaceBlockMap *linkedBlocks, >+ InfoLog &infoLog) >+{ >+ ASSERT(linkedBlocks); >+ >+ for (const sh::InterfaceBlock &block : interfaceBlocksToLink) >+ { >+ const auto &entry = linkedBlocks->find(block.name); >+ if (entry != linkedBlocks->end()) >+ { >+ const sh::InterfaceBlock &linkedBlock = *(entry->second.second); >+ std::string mismatchedStructFieldName; >+ LinkMismatchError linkError = AreMatchingInterfaceBlocks( >+ block, linkedBlock, webglCompatibility, &mismatchedStructFieldName); >+ if (linkError != LinkMismatchError::NO_MISMATCH) >+ { >+ LogLinkMismatch(infoLog, block.name, GetInterfaceBlockTypeString(block.blockType), >+ linkError, mismatchedStructFieldName, entry->second.first, >+ shaderType); >+ return false; >+ } >+ } >+ else >+ { >+ (*linkedBlocks)[block.name] = std::make_pair(shaderType, &block); >+ } >+ } >+ >+ return true; >+} >+ >+bool ValidateInterfaceBlocksMatch( >+ GLuint numShadersHasInterfaceBlocks, >+ const ShaderMap<const std::vector<sh::InterfaceBlock> *> &shaderInterfaceBlocks, >+ InfoLog &infoLog, >+ bool webglCompatibility, >+ InterfaceBlockMap *instancelessInterfaceBlocksFields) >+{ >+ for (ShaderType shaderType : kAllGraphicsShaderTypes) >+ { >+ // Validate that instanceless blocks of different names don't have fields of the same name. >+ if (shaderInterfaceBlocks[shaderType] && >+ !ValidateInstancelessGraphicsInterfaceBlocksPerShader( >+ *shaderInterfaceBlocks[shaderType], shaderType, instancelessInterfaceBlocksFields, >+ infoLog)) >+ { >+ return false; >+ } >+ } >+ >+ if (numShadersHasInterfaceBlocks < 2u) >+ { >+ return true; >+ } >+ >+ ASSERT(!shaderInterfaceBlocks[ShaderType::Compute]); >+ >+ // Check that interface blocks defined in the graphics shaders are identical >+ >+ InterfaceBlockMap linkedInterfaceBlocks; >+ >+ bool interfaceBlockMapInitialized = false; >+ for (ShaderType shaderType : kAllGraphicsShaderTypes) >+ { >+ if (!shaderInterfaceBlocks[shaderType]) >+ { >+ continue; >+ } >+ >+ if (!interfaceBlockMapInitialized) >+ { >+ InitializeInterfaceBlockMap(*shaderInterfaceBlocks[shaderType], shaderType, >+ &linkedInterfaceBlocks); >+ interfaceBlockMapInitialized = true; >+ } >+ else if (!ValidateGraphicsInterfaceBlocksPerShader(*shaderInterfaceBlocks[shaderType], >+ shaderType, webglCompatibility, >+ &linkedInterfaceBlocks, infoLog)) >+ { >+ return false; >+ } >+ } >+ >+ return true; >+} >+ >+bool LinkValidateProgramInterfaceBlocks(const Context *context, >+ ShaderBitSet activeProgramStages, >+ const ProgramLinkedResources &resources, >+ InfoLog &infoLog, >+ GLuint *combinedShaderStorageBlocksCountOut) >+{ >+ ASSERT(combinedShaderStorageBlocksCountOut); >+ >+ const Caps &caps = context->getCaps(); >+ const bool webglCompatibility = context->isWebGL(); >+ const Version &version = context->getClientVersion(); >+ >+ GLuint combinedUniformBlocksCount = 0u; >+ GLuint numShadersHasUniformBlocks = 0u; >+ ShaderMap<const std::vector<sh::InterfaceBlock> *> allShaderUniformBlocks = {}; >+ InterfaceBlockMap instancelessInterfaceBlocksFields; >+ >+ for (ShaderType shaderType : activeProgramStages) >+ { >+ const std::vector<sh::InterfaceBlock> &uniformBlocks = >+ resources.uniformBlockLinker.getShaderBlocks(shaderType); >+ if (!uniformBlocks.empty()) >+ { >+ if (!ValidateInterfaceBlocksCount( >+ static_cast<GLuint>(caps.maxShaderUniformBlocks[shaderType]), uniformBlocks, >+ shaderType, sh::BlockType::BLOCK_UNIFORM, &combinedUniformBlocksCount, infoLog)) >+ { >+ return false; >+ } >+ >+ allShaderUniformBlocks[shaderType] = &uniformBlocks; >+ ++numShadersHasUniformBlocks; >+ } >+ } >+ >+ if (combinedUniformBlocksCount > static_cast<GLuint>(caps.maxCombinedUniformBlocks)) >+ { >+ infoLog << "The sum of the number of active uniform blocks exceeds " >+ "MAX_COMBINED_UNIFORM_BLOCKS (" >+ << caps.maxCombinedUniformBlocks << ")."; >+ return false; >+ } >+ >+ if (!ValidateInterfaceBlocksMatch(numShadersHasUniformBlocks, allShaderUniformBlocks, infoLog, >+ webglCompatibility, &instancelessInterfaceBlocksFields)) >+ { >+ return false; >+ } >+ >+ if (version >= Version(3, 1)) >+ { >+ *combinedShaderStorageBlocksCountOut = 0u; >+ GLuint numShadersHasShaderStorageBlocks = 0u; >+ ShaderMap<const std::vector<sh::InterfaceBlock> *> allShaderStorageBlocks = {}; >+ for (ShaderType shaderType : activeProgramStages) >+ { >+ const std::vector<sh::InterfaceBlock> &shaderStorageBlocks = >+ resources.shaderStorageBlockLinker.getShaderBlocks(shaderType); >+ if (!shaderStorageBlocks.empty()) >+ { >+ if (!ValidateInterfaceBlocksCount( >+ static_cast<GLuint>(caps.maxShaderStorageBlocks[shaderType]), >+ shaderStorageBlocks, shaderType, sh::BlockType::BLOCK_BUFFER, >+ combinedShaderStorageBlocksCountOut, infoLog)) >+ { >+ return false; >+ } >+ >+ allShaderStorageBlocks[shaderType] = &shaderStorageBlocks; >+ ++numShadersHasShaderStorageBlocks; >+ } >+ } >+ >+ if (*combinedShaderStorageBlocksCountOut > >+ static_cast<GLuint>(caps.maxCombinedShaderStorageBlocks)) >+ { >+ infoLog << "The sum of the number of active shader storage blocks exceeds " >+ "MAX_COMBINED_SHADER_STORAGE_BLOCKS (" >+ << caps.maxCombinedShaderStorageBlocks << ")."; >+ return false; >+ } >+ >+ if (!ValidateInterfaceBlocksMatch(numShadersHasShaderStorageBlocks, allShaderStorageBlocks, >+ infoLog, webglCompatibility, >+ &instancelessInterfaceBlocksFields)) >+ { >+ return false; >+ } >+ } >+ >+ return true; >+} >+ > } // namespace gl >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.h b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.h >index b3b7c46c044c4bf5b2e4cbb1b3c0390625fd9ac1..f3835274972295905fe502cbfd0fd7211a4cbe29 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramLinkedResources.h >@@ -48,11 +48,13 @@ struct UnusedUniform; > struct VariableLocation; > > using AtomicCounterBuffer = ShaderVariableBuffer; >+using ShaderUniform = std::pair<ShaderType, const sh::ShaderVariable *>; > > class UniformLinker final : angle::NonCopyable > { > public: >- UniformLinker(const ProgramState &state); >+ UniformLinker(const ShaderBitSet &activeShaderStages, >+ const ShaderMap<std::vector<sh::ShaderVariable>> &shaderUniforms); > ~UniformLinker(); > > bool link(const Caps &caps, >@@ -60,13 +62,16 @@ class UniformLinker final : angle::NonCopyable > const ProgramAliasedBindings &uniformLocationBindings); > > void getResults(std::vector<LinkedUniform> *uniforms, >- std::vector<UnusedUniform> *unusedUniforms, >- std::vector<VariableLocation> *uniformLocations); >+ std::vector<UnusedUniform> *unusedUniformsOutOrNull, >+ std::vector<VariableLocation> *uniformLocationsOutOrNull); > > private: > bool validateGraphicsUniforms(InfoLog &infoLog) const; >- >- bool flattenUniformsAndCheckCapsForShader(Shader *shader, >+ bool validateGraphicsUniformsPerShader(ShaderType shaderToLink, >+ bool extendLinkedUniforms, >+ std::map<std::string, ShaderUniform> *linkedUniforms, >+ InfoLog &infoLog) const; >+ bool flattenUniformsAndCheckCapsForShader(ShaderType shaderType, > const Caps &caps, > std::vector<LinkedUniform> &samplerUniforms, > std::vector<LinkedUniform> &imageUniforms, >@@ -86,7 +91,8 @@ class UniformLinker final : angle::NonCopyable > int *maxUniformLocation); > void pruneUnusedUniforms(); > >- const ProgramState &mState; >+ ShaderBitSet mActiveShaderStages; >+ const ShaderMap<std::vector<sh::ShaderVariable>> &mShaderUniforms; > std::vector<LinkedUniform> mUniforms; > std::vector<UnusedUniform> mUnusedUniforms; > std::vector<VariableLocation> mUniformLocations; >@@ -113,6 +119,12 @@ class InterfaceBlockLinker : angle::NonCopyable > void linkBlocks(const GetBlockSizeFunc &getBlockSize, > const GetBlockMemberInfoFunc &getMemberInfo) const; > >+ const std::vector<sh::InterfaceBlock> &getShaderBlocks(ShaderType shaderType) const >+ { >+ ASSERT(mShaderBlocks[shaderType]); >+ return *mShaderBlocks[shaderType]; >+ } >+ > protected: > InterfaceBlockLinker(); > void init(std::vector<InterfaceBlock> *blocksOut, >@@ -277,6 +289,9 @@ class ProgramLinkedResourcesLinker final : angle::NonCopyable > CustomBlockLayoutEncoderFactory *mCustomEncoderFactory; > }; > >+using ShaderInterfaceBlock = std::pair<ShaderType, const sh::InterfaceBlock *>; >+using InterfaceBlockMap = std::map<std::string, ShaderInterfaceBlock>; >+ > bool LinkValidateProgramGlobalNames(InfoLog &infoLog, > const ProgramExecutable &executable, > const LinkingVariables &linkingVariables); >@@ -307,6 +322,11 @@ LinkMismatchError LinkValidateProgramVariables(const sh::ShaderVariable &variabl > std::string *mismatchedStructOrBlockMemberName); > void AddProgramVariableParentPrefix(const std::string &parentName, > std::string *mismatchedFieldName); >+bool LinkValidateProgramInterfaceBlocks(const Context *context, >+ ShaderBitSet activeProgramStages, >+ const ProgramLinkedResources &resources, >+ InfoLog &infoLog, >+ GLuint *combinedShaderStorageBlocksCountOut); > } // namespace gl > > #endif // LIBANGLE_UNIFORMLINKER_H_ >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.cpp >index b2a39b5ad1e4dad77dd5b31e7737645eb58fccb5..5578d9f1f2d780fefa5a137ada36bab460b09bc8 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.cpp >@@ -161,7 +161,7 @@ ProgramPipeline::ProgramPipeline(rx::GLImplFactory *factory, ProgramPipelineID h > > ProgramPipeline::~ProgramPipeline() > { >- mProgramPipelineImpl.release(); >+ mProgramPipelineImpl.reset(nullptr); > } > > void ProgramPipeline::onDestroy(const Context *context) >@@ -367,6 +367,20 @@ void ProgramPipeline::updateFragmentInoutRange() > mState.mExecutable->mFragmentInoutRange = fragmentExecutable.mFragmentInoutRange; > } > >+void ProgramPipeline::updateUsesEarlyFragmentTestsOptimization() >+{ >+ Program *fragmentProgram = getShaderProgram(gl::ShaderType::Fragment); >+ >+ if (!fragmentProgram) >+ { >+ return; >+ } >+ >+ const ProgramExecutable &fragmentExecutable = fragmentProgram->getExecutable(); >+ mState.mExecutable->mUsesEarlyFragmentTestsOptimization = >+ fragmentExecutable.mUsesEarlyFragmentTestsOptimization; >+} >+ > void ProgramPipeline::updateLinkedVaryings() > { > // Need to check all of the shader stages, not just linked, so we handle Compute correctly. >@@ -394,44 +408,6 @@ void ProgramPipeline::updateLinkedVaryings() > } > } > >-void ProgramPipeline::updateHasBooleans() >-{ >- // Need to check all of the shader stages, not just linked, so we handle Compute correctly. >- for (const gl::ShaderType shaderType : gl::AllShaderTypes()) >- { >- const Program *shaderProgram = getShaderProgram(shaderType); >- if (shaderProgram) >- { >- const ProgramExecutable &executable = shaderProgram->getExecutable(); >- >- if (executable.hasUniformBuffers()) >- { >- mState.mExecutable->mPipelineHasUniformBuffers = true; >- } >- if (executable.hasStorageBuffers()) >- { >- mState.mExecutable->mPipelineHasStorageBuffers = true; >- } >- if (executable.hasAtomicCounterBuffers()) >- { >- mState.mExecutable->mPipelineHasAtomicCounterBuffers = true; >- } >- if (executable.hasDefaultUniforms()) >- { >- mState.mExecutable->mPipelineHasDefaultUniforms = true; >- } >- if (executable.hasTextures()) >- { >- mState.mExecutable->mPipelineHasTextures = true; >- } >- if (executable.hasImages()) >- { >- mState.mExecutable->mPipelineHasImages = true; >- } >- } >- } >-} >- > void ProgramPipeline::updateExecutable() > { > // Vertex Shader ProgramExecutable properties >@@ -448,13 +424,11 @@ void ProgramPipeline::updateExecutable() > > // Fragment Shader ProgramExecutable properties > updateFragmentInoutRange(); >+ updateUsesEarlyFragmentTestsOptimization(); > > // All Shader ProgramExecutable properties > mState.updateExecutableTextures(); > updateLinkedVaryings(); >- >- // Must be last, since it queries things updated by earlier functions >- updateHasBooleans(); > } > > // The attached shaders are checked for linking errors by matching up their variables. >@@ -473,11 +447,21 @@ angle::Result ProgramPipeline::link(const Context *context) > > mState.mExecutable->reset(); > >- if (mState.mExecutable->hasLinkedShaderStage(gl::ShaderType::Vertex)) >+ InfoLog &infoLog = mState.mExecutable->getInfoLog(); >+ infoLog.reset(); >+ >+ // Build shader variable uniforms map for gl::UniformLinker. >+ ShaderMap<std::vector<sh::ShaderVariable>> shaderUniforms; >+ for (ShaderType shaderType : mState.mExecutable->mLinkedShaderStages) > { >- InfoLog &infoLog = mState.mExecutable->getInfoLog(); >- infoLog.reset(); >+ for (const LinkedUniform &uniform : mState.mPrograms[shaderType]->getUniforms()) >+ { >+ shaderUniforms[shaderType].push_back(uniform); >+ } >+ } > >+ if (mState.mExecutable->hasLinkedShaderStage(gl::ShaderType::Vertex)) >+ { > if (!linkVaryings(infoLog)) > { > return angle::Result::Stop; >@@ -491,9 +475,9 @@ angle::Result ProgramPipeline::link(const Context *context) > Program *fragmentShaderProgram = getShaderProgram(ShaderType::Fragment); > if (fragmentShaderProgram) > { >- // We should also be validating image uniforms and SSBOs. >- const int combinedImageUniforms = 0; >- const int combinedShaderStorageBlocks = 0; >+ // We should also be validating SSBO and image uniform counts. >+ const GLuint combinedImageUniforms = 0; >+ const GLuint combinedShaderStorageBlocks = 0; > const ProgramExecutable &fragmentExecutable = fragmentShaderProgram->getExecutable(); > if (!mState.mExecutable->linkValidateOutputVariables( > context->getCaps(), context->getExtensions(), context->getClientVersion(), >@@ -537,6 +521,19 @@ angle::Result ProgramPipeline::link(const Context *context) > } > } > >+ // Merge uniforms. >+ mState.mExecutable->copyUniformsFromProgramMap(mState.mPrograms); >+ >+ // Merge shader buffers (UBOs, SSBOs, and atomic counter buffers) into the executable. >+ // Also copy over image and sampler bindings. >+ for (ShaderType shaderType : mState.mExecutable->getLinkedShaderStages()) >+ { >+ const ProgramState &programState = mState.mPrograms[shaderType]->getState(); >+ mState.mExecutable->copyShaderBuffersFromProgram(programState); >+ mState.mExecutable->copySamplerBindingsFromProgram(programState); >+ mState.mExecutable->copyImageBindingsFromProgram(programState); >+ } >+ > if (mState.mExecutable->hasLinkedShaderStage(gl::ShaderType::Vertex) || > mState.mExecutable->hasLinkedShaderStage(gl::ShaderType::Compute)) > { >@@ -673,7 +670,17 @@ void ProgramPipeline::onSubjectStateChange(angle::SubjectIndex index, angle::Sub > onStateChange(angle::SubjectMessage::ProgramRelinked); > break; > case angle::SubjectMessage::SamplerUniformsUpdated: >- mState.mExecutable->resetCachedValidateSamplersResult(); >+ mState.mExecutable->clearSamplerBindings(); >+ for (ShaderType shaderType : mState.mExecutable->getLinkedShaderStages()) >+ { >+ const ProgramState &programState = mState.mPrograms[shaderType]->getState(); >+ mState.mExecutable->copySamplerBindingsFromProgram(programState); >+ } >+ mState.mExecutable->mActiveSamplerRefCounts.fill(0); >+ mState.updateExecutableTextures(); >+ break; >+ case angle::SubjectMessage::ProgramUniformUpdated: >+ mProgramPipelineImpl->onProgramUniformUpdate(static_cast<ShaderType>(index)); > break; > default: > UNREACHABLE(); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.h b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.h >index 2529f15a45a969abbea6b7e97faf9b2c070a0df5..879bb7fe92596e92d6f68d55f15501988063e39c 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/ProgramPipeline.h >@@ -142,8 +142,8 @@ class ProgramPipeline final : public RefCountObject<ProgramPipelineID>, > void updateExecutableGeometryProperties(); > void updateExecutableTessellationProperties(); > void updateFragmentInoutRange(); >+ void updateUsesEarlyFragmentTestsOptimization(); > void updateLinkedVaryings(); >- void updateHasBooleans(); > void updateExecutable(); > > std::unique_ptr<rx::ProgramPipelineImpl> mProgramPipelineImpl; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp >index a6016d5a67f7bb9323b2b94a3544a840fe3b69e6..4a87f0d29159ce64635464035c1c23de64186f63 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/State.cpp >@@ -349,6 +349,7 @@ State::State(const State *shareContextState, > mClientType(clientType), > mContextPriority(contextPriority), > mHasProtectedContent(hasProtectedContent), >+ mIsDebugContext(debug), > mClientVersion(clientVersion), > mShareGroup(shareGroup), > mBufferManager(AllocateOrGetSharedResourceManager(shareContextState, &State::mBufferManager)), >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/State.h b/Source/ThirdParty/ANGLE/src/libANGLE/State.h >index 41927cd1d2d2b456701705ee5602f4b45266020c..2cd3a446612f0c196fcf6cdc0071852b2ab2d2e0 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/State.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/State.h >@@ -80,6 +80,7 @@ class ActiveTexturesCache final : angle::NonCopyable > void set(size_t textureIndex, Texture *texture); > void reset(size_t textureIndex); > bool empty() const; >+ size_t size() const { return mTextures.size(); } > > private: > ActiveTextureArray<Texture *> mTextures; >@@ -112,6 +113,7 @@ class State : angle::NonCopyable > EGLenum getClientType() const { return mClientType; } > EGLenum getContextPriority() const { return mContextPriority; } > bool hasProtectedContent() const { return mHasProtectedContent; } >+ bool isDebugContext() const { return mIsDebugContext; } > GLint getClientMajorVersion() const { return mClientVersion.major; } > GLint getClientMinorVersion() const { return mClientVersion.minor; } > const Version &getClientVersion() const { return mClientVersion; } >@@ -362,7 +364,7 @@ class State : angle::NonCopyable > > // If both a Program and a ProgramPipeline are bound, the Program will > // always override the ProgramPipeline. >- const ProgramExecutable *getProgramExecutable() const { return mExecutable; } >+ ProgramExecutable *getProgramExecutable() const { return mExecutable; } > > // Program binding manipulation > angle::Result setProgram(const Context *context, Program *newProgram); >@@ -974,6 +976,7 @@ class State : angle::NonCopyable > EGLenum mClientType; > EGLenum mContextPriority; > bool mHasProtectedContent; >+ bool mIsDebugContext; > Version mClientVersion; > > // Caps to use for validation >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp >index c4c605c1a6faac87455082bd00db1b5f14a7b607..8b2186e6390412988ace39cac2610854cf12a33f 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Surface.cpp >@@ -302,6 +302,12 @@ EGLint Surface::getType() const > return mType; > } > >+Error Surface::prepareSwap(const gl::Context *context) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::prepareSwap"); >+ return mImplementation->prepareSwap(context); >+} >+ > Error Surface::swap(const gl::Context *context) > { > ANGLE_TRACE_EVENT0("gpu.angle", "egl::Surface::swap"); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h b/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h >index 8401bbe562ca19a26062b098baad6780d40aee4b..0856a629befab981c1eb3fa4c5928645b1931225 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Surface.h >@@ -76,6 +76,7 @@ class Surface : public LabeledObject, public gl::FramebufferAttachmentObject > Error initialize(const Display *display); > Error makeCurrent(const gl::Context *context); > Error unMakeCurrent(const gl::Context *context); >+ Error prepareSwap(const gl::Context *context); > Error swap(const gl::Context *context); > Error swapWithDamage(const gl::Context *context, const EGLint *rects, EGLint n_rects); > Error swapWithFrameToken(const gl::Context *context, EGLFrameTokenANGLE frameToken); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp >index 42152386a56b91dd83f739b6e2a5ae12ed36d4a8..16de39dc9d3f52865872be69dbf951e67c454cf3 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Texture.cpp >@@ -327,6 +327,85 @@ bool TextureState::computeSamplerCompleteness(const SamplerState &samplerState, > return true; > } > >+ // Check for all non-format-based completeness rules >+ if (!computeSamplerCompletenessForCopyImage(samplerState, state)) >+ { >+ return false; >+ } >+ >+ const ImageDesc &baseImageDesc = getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel()); >+ >+ // According to es 3.1 spec, texture is justified as incomplete if sized internalformat is >+ // unfilterable(table 20.11) and filter is not GL_NEAREST(8.16). The default value of minFilter >+ // is NEAREST_MIPMAP_LINEAR and magFilter is LINEAR(table 20.11,). For multismaple texture, >+ // filter state of multisample texture is ignored(11.1.3.3). So it shouldn't be judged as >+ // incomplete texture. So, we ignore filtering for multisample texture completeness here. >+ if (!IsMultisampled(mType) && >+ !baseImageDesc.format.info->filterSupport(state.getClientVersion(), >+ state.getExtensions()) && >+ !IsPointSampled(samplerState)) >+ { >+ return false; >+ } >+ >+ // OpenGLES 3.0.2 spec section 3.8.13 states that a texture is not mipmap complete if: >+ // The internalformat specified for the texture arrays is a sized internal depth or >+ // depth and stencil format (see table 3.13), the value of TEXTURE_COMPARE_- >+ // MODE is NONE, and either the magnification filter is not NEAREST or the mini- >+ // fication filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. >+ if (!IsMultisampled(mType) && baseImageDesc.format.info->depthBits > 0 && >+ state.getClientMajorVersion() >= 3) >+ { >+ // Note: we restrict this validation to sized types. For the OES_depth_textures >+ // extension, due to some underspecification problems, we must allow linear filtering >+ // for legacy compatibility with WebGL 1. >+ // See http://crbug.com/649200 >+ if (samplerState.getCompareMode() == GL_NONE && baseImageDesc.format.info->sized) >+ { >+ if ((samplerState.getMinFilter() != GL_NEAREST && >+ samplerState.getMinFilter() != GL_NEAREST_MIPMAP_NEAREST) || >+ samplerState.getMagFilter() != GL_NEAREST) >+ { >+ return false; >+ } >+ } >+ } >+ >+ // OpenGLES 3.1 spec section 8.16 states that a texture is not mipmap complete if: >+ // The internalformat specified for the texture is DEPTH_STENCIL format, the value of >+ // DEPTH_STENCIL_TEXTURE_MODE is STENCIL_INDEX, and either the magnification filter is >+ // not NEAREST or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. >+ // However, the ES 3.1 spec differs from the statement above, because it is incorrect. >+ // See the issue at https://github.com/KhronosGroup/OpenGL-API/issues/33. >+ // For multismaple texture, filter state of multisample texture is ignored(11.1.3.3). >+ // So it shouldn't be judged as incomplete texture. So, we ignore filtering for multisample >+ // texture completeness here. >+ if (!IsMultisampled(mType) && baseImageDesc.format.info->depthBits > 0 && >+ mDepthStencilTextureMode == GL_STENCIL_INDEX) >+ { >+ if ((samplerState.getMinFilter() != GL_NEAREST && >+ samplerState.getMinFilter() != GL_NEAREST_MIPMAP_NEAREST) || >+ samplerState.getMagFilter() != GL_NEAREST) >+ { >+ return false; >+ } >+ } >+ >+ return true; >+} >+ >+// CopyImageSubData has more lax rules for texture completeness: format-based completeness rules are >+// ignored, so a texture can still be considered complete even if it violates format-specific >+// conditions >+bool TextureState::computeSamplerCompletenessForCopyImage(const SamplerState &samplerState, >+ const State &state) const >+{ >+ // Buffer textures cannot be incomplete. >+ if (mType == TextureType::Buffer) >+ { >+ return true; >+ } >+ > if (!mImmutableFormat && mBaseLevel > mMaxLevel) > { > return false; >@@ -346,18 +425,6 @@ bool TextureState::computeSamplerCompleteness(const SamplerState &samplerState, > return false; > } > >- // According to es 3.1 spec, texture is justified as incomplete if sized internalformat is >- // unfilterable(table 20.11) and filter is not GL_NEAREST(8.16). The default value of minFilter >- // is NEAREST_MIPMAP_LINEAR and magFilter is LINEAR(table 20.11,). For multismaple texture, >- // filter state of multisample texture is ignored(11.1.3.3). So it shouldn't be judged as >- // incomplete texture. So, we ignore filtering for multisample texture completeness here. >- if (!IsMultisampled(mType) && >- !baseImageDesc.format.info->filterSupport(state.getClientVersion(), >- state.getExtensions()) && >- !IsPointSampled(samplerState)) >- { >- return false; >- } > bool npotSupport = state.getExtensions().textureNpotOES || state.getClientMajorVersion() >= 3; > if (!npotSupport) > { >@@ -420,49 +487,6 @@ bool TextureState::computeSamplerCompleteness(const SamplerState &samplerState, > } > } > >- // OpenGLES 3.0.2 spec section 3.8.13 states that a texture is not mipmap complete if: >- // The internalformat specified for the texture arrays is a sized internal depth or >- // depth and stencil format (see table 3.13), the value of TEXTURE_COMPARE_- >- // MODE is NONE, and either the magnification filter is not NEAREST or the mini- >- // fication filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. >- if (!IsMultisampled(mType) && baseImageDesc.format.info->depthBits > 0 && >- state.getClientMajorVersion() >= 3) >- { >- // Note: we restrict this validation to sized types. For the OES_depth_textures >- // extension, due to some underspecification problems, we must allow linear filtering >- // for legacy compatibility with WebGL 1. >- // See http://crbug.com/649200 >- if (samplerState.getCompareMode() == GL_NONE && baseImageDesc.format.info->sized) >- { >- if ((samplerState.getMinFilter() != GL_NEAREST && >- samplerState.getMinFilter() != GL_NEAREST_MIPMAP_NEAREST) || >- samplerState.getMagFilter() != GL_NEAREST) >- { >- return false; >- } >- } >- } >- >- // OpenGLES 3.1 spec section 8.16 states that a texture is not mipmap complete if: >- // The internalformat specified for the texture is DEPTH_STENCIL format, the value of >- // DEPTH_STENCIL_TEXTURE_MODE is STENCIL_INDEX, and either the magnification filter is >- // not NEAREST or the minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST. >- // However, the ES 3.1 spec differs from the statement above, because it is incorrect. >- // See the issue at https://github.com/KhronosGroup/OpenGL-API/issues/33. >- // For multismaple texture, filter state of multisample texture is ignored(11.1.3.3). >- // So it shouldn't be judged as incomplete texture. So, we ignore filtering for multisample >- // texture completeness here. >- if (!IsMultisampled(mType) && baseImageDesc.format.info->depthBits > 0 && >- mDepthStencilTextureMode == GL_STENCIL_INDEX) >- { >- if ((samplerState.getMinFilter() != GL_NEAREST && >- samplerState.getMinFilter() != GL_NEAREST_MIPMAP_NEAREST) || >- samplerState.getMagFilter() != GL_NEAREST) >- { >- return false; >- } >- } >- > return true; > } > >@@ -2127,6 +2151,16 @@ bool Texture::isSamplerComplete(const Context *context, const Sampler *optionalS > return mCompletenessCache.samplerComplete; > } > >+// CopyImageSubData requires that we ignore format-based completeness rules >+bool Texture::isSamplerCompleteForCopyImage(const Context *context, >+ const Sampler *optionalSampler) const >+{ >+ const gl::SamplerState &samplerState = >+ optionalSampler ? optionalSampler->getSamplerState() : mState.mSamplerState; >+ const gl::State &contextState = context->getState(); >+ return mState.computeSamplerCompletenessForCopyImage(samplerState, contextState); >+} >+ > Texture::SamplerCompletenessCache::SamplerCompletenessCache() > : context({0}), samplerState(), samplerComplete(false) > {} >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h b/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h >index 0a6be64fc69e1f717401ab2c29353012b0b2ad57..704fc3f93c1601046b6dd04c82778b56c8b44e23 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/Texture.h >@@ -184,6 +184,9 @@ class TextureState final : private angle::NonCopyable > friend bool operator==(const TextureState &a, const TextureState &b); > > bool computeSamplerCompleteness(const SamplerState &samplerState, const State &state) const; >+ bool computeSamplerCompletenessForCopyImage(const SamplerState &samplerState, >+ const State &state) const; >+ > bool computeMipmapCompleteness() const; > bool computeLevelCompleteness(TextureTarget target, size_t level) const; > SamplerFormat computeRequiredSamplerFormat(const SamplerState &samplerState) const; >@@ -513,6 +516,8 @@ class Texture final : public RefCountObject<TextureID>, > void signalDirtyStorage(InitState initState); > > bool isSamplerComplete(const Context *context, const Sampler *optionalSampler); >+ bool isSamplerCompleteForCopyImage(const Context *context, >+ const Sampler *optionalSampler) const; > > GLenum getImplementationColorReadFormat(const Context *context) const; > GLenum getImplementationColorReadType(const Context *context) const; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.cpp >index 03437c9e523eb94ff1e7b05de18c1cfc93d6057f..a00c9d8095c58b9ff1d34d3469f8bf05388e1611 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.cpp >@@ -171,7 +171,8 @@ std::string GetDefaultOutDirectory() > > std::string GetCaptureTrigger() > { >- return GetEnvironmentVarOrUnCachedAndroidProperty(kTriggerVarName, kAndroidTrigger); >+ // Use the GetAndSet variant to improve future lookup times >+ return GetAndSetEnvironmentVarOrUnCachedAndroidProperty(kTriggerVarName, kAndroidTrigger); > } > > std::ostream &operator<<(std::ostream &os, gl::ContextID contextId) >@@ -538,7 +539,7 @@ void WriteResourceIDPointerParamReplay(ReplayWriter &replayWriter, > { > header << ", "; > } >- header << "g" << name << "Map2[" << id.value << "]"; >+ header << "g" << name << "Map[" << id.value << "]"; > } > } > else >@@ -614,7 +615,7 @@ void WriteCppReplayForCall(const CallCapture &call, > call.entryPoint == EntryPoint::GLCreateShaderProgramv) > { > GLuint id = call.params.getReturnValue().value.GLuintVal; >- callOut << "gShaderProgramMap2[" << id << "] = "; >+ callOut << "gShaderProgramMap[" << id << "] = "; > } > > if (call.entryPoint == EntryPoint::GLFenceSync) >@@ -867,7 +868,7 @@ void WriteInitReplayCall(bool compression, > } > > std::string binaryDataFileName = GetBinaryDataFilePath(compression, captureLabel); >- out << " InitializeReplay2(\"" << binaryDataFileName << "\", " << maxClientArraySize << ", " >+ out << " InitializeReplay(\"" << binaryDataFileName << "\", " << maxClientArraySize << ", " > << readBufferSize; > > for (ResourceIDType resourceID : AllEnums<ResourceIDType>()) >@@ -1002,6 +1003,77 @@ void MaybeResetResources(ResourceIDType resourceIDType, > > break; > } >+ case ResourceIDType::Framebuffer: >+ { >+ ResourceSet &newFramebuffers = >+ resourceTracker->getTrackedResource(ResourceIDType::Framebuffer).getNewResources(); >+ >+ // If we have any new framebuffers generated and not deleted during the run, delete them >+ // now >+ if (!newFramebuffers.empty()) >+ { >+ out << " const GLuint deleteFramebuffers[] = {"; >+ ResourceSet::iterator framebufferIter = newFramebuffers.begin(); >+ for (size_t i = 0; framebufferIter != newFramebuffers.end(); ++i, ++framebufferIter) >+ { >+ if (i > 0) >+ { >+ out << ", "; >+ } >+ if ((i % 4) == 0) >+ { >+ out << "\n "; >+ } >+ out << "gFramebufferMap[" << *framebufferIter << "]"; >+ } >+ out << "};\n"; >+ out << " glDeleteFramebuffers(" << newFramebuffers.size() >+ << ", deleteFramebuffers);\n"; >+ } >+ >+ // TODO (http://anglebug.com/4599): Handle framebuffers that need regen >+ // This would only happen if a starting framebuffer was deleted during the run. >+ ASSERT(resourceTracker->getTrackedResource(ResourceIDType::Framebuffer) >+ .getResourcesToRegen() >+ .empty()); >+ break; >+ } >+ case ResourceIDType::Renderbuffer: >+ { >+ ResourceSet &newRenderbuffers = >+ resourceTracker->getTrackedResource(ResourceIDType::Renderbuffer).getNewResources(); >+ >+ // If we have any new renderbuffers generated and not deleted during the run, delete >+ // them now >+ if (!newRenderbuffers.empty()) >+ { >+ out << " const GLuint deleteRenderbuffers[] = {"; >+ ResourceSet::iterator renderbufferIter = newRenderbuffers.begin(); >+ for (size_t i = 0; renderbufferIter != newRenderbuffers.end(); >+ ++i, ++renderbufferIter) >+ { >+ if (i > 0) >+ { >+ out << ", "; >+ } >+ if ((i % 4) == 0) >+ { >+ out << "\n "; >+ } >+ out << "gRenderbufferMap[" << *renderbufferIter << "]"; >+ } >+ out << "};\n"; >+ out << " glDeleteRenderbuffers(" << newRenderbuffers.size() >+ << ", deleteRenderbuffers);\n"; >+ } >+ >+ // TODO (http://anglebug.com/4599): Handle renderbuffers that need regen >+ // This would only happen if a starting renderbuffer was deleted during the run. >+ ASSERT(resourceTracker->getTrackedResource(ResourceIDType::Renderbuffer) >+ .getResourcesToRegen() >+ .empty()); >+ break; >+ } > case ResourceIDType::ShaderProgram: > { > ResourceSet &newPrograms = >@@ -1009,9 +1081,9 @@ void MaybeResetResources(ResourceIDType resourceIDType, > .getNewResources(); > > // If we have any new programs created and not deleted during the run, delete them now >- for (const auto &newProgram : newPrograms) >+ for (const GLuint &newProgram : newPrograms) > { >- out << " glDeleteProgram(gShaderProgramMap2[" << newProgram << "]);\n"; >+ out << " glDeleteProgram(gShaderProgramMap[" << newProgram << "]);\n"; > } > > // TODO (http://anglebug.com/5968): Handle programs that need regen >@@ -1077,6 +1149,42 @@ void MaybeResetResources(ResourceIDType resourceIDType, > } > break; > } >+ case ResourceIDType::VertexArray: >+ { >+ ResourceSet &newVertextArrays = >+ resourceTracker->getTrackedResource(ResourceIDType::VertexArray).getNewResources(); >+ >+ // If we have any new vertex arrays generated and not deleted during the run, delete >+ // them now >+ if (!newVertextArrays.empty()) >+ { >+ out << " const GLuint deleteVertexArrays[] = {"; >+ ResourceSet::iterator vertexArrayIter = newVertextArrays.begin(); >+ for (size_t i = 0; vertexArrayIter != newVertextArrays.end(); >+ ++i, ++vertexArrayIter) >+ { >+ if (i > 0) >+ { >+ out << ", "; >+ } >+ if ((i % 4) == 0) >+ { >+ out << "\n "; >+ } >+ out << "gVertexArrayMap[" << *vertexArrayIter << "]"; >+ } >+ out << "};\n"; >+ out << " glDeleteVertexArrays(" << newVertextArrays.size() >+ << ", deleteVertexArrays);\n"; >+ } >+ >+ // TODO (http://anglebug.com/4599): Handle vertex arrays that need regen >+ // This would only happen if a starting vertex array was deleted during the run. >+ ASSERT(resourceTracker->getTrackedResource(ResourceIDType::VertexArray) >+ .getResourcesToRegen() >+ .empty()); >+ break; >+ } > default: > // TODO (http://anglebug.com/4599): Reset more than just buffers > break; >@@ -1331,6 +1439,7 @@ ProgramSources GetAttachedProgramSources(const gl::Program *program) > template <typename IDType> > void CaptureUpdateResourceIDs(const CallCapture &call, > const ParamCapture ¶m, >+ ResourceTracker *resourceTracker, > std::vector<CallCapture> *callsOut) > { > GLsizei n = call.params.getParamFlexName("n", "count", ParamType::TGLsizei, 0).value.GLsizeiVal; >@@ -1341,11 +1450,14 @@ void CaptureUpdateResourceIDs(const CallCapture &call, > const char *resourceName = GetResourceIDTypeName(resourceIDType); > > std::stringstream updateFuncNameStr; >- updateFuncNameStr << "Update" << resourceName << "ID2"; >+ updateFuncNameStr << "Update" << resourceName << "ID"; > std::string updateFuncName = updateFuncNameStr.str(); > > const IDType *returnedIDs = reinterpret_cast<const IDType *>(param.data[0].data()); > >+ ResourceSet &startingSet = >+ resourceTracker->getTrackedResource(resourceIDType).getStartingResources(); >+ > for (GLsizei idIndex = 0; idIndex < n; ++idIndex) > { > IDType id = returnedIDs[idIndex]; >@@ -1354,6 +1466,12 @@ void CaptureUpdateResourceIDs(const CallCapture &call, > params.addValueParam("id", ParamType::TGLuint, id.value); > params.addValueParam("readBufferOffset", ParamType::TGLsizei, readBufferOffset); > callsOut->emplace_back(updateFuncName, std::move(params)); >+ >+ // Add only if not in starting resources. >+ if (startingSet.find(id.value) == startingSet.end()) >+ { >+ resourceTracker->getTrackedResource(resourceIDType).getNewResources().insert(id.value); >+ } > } > } > >@@ -1373,7 +1491,7 @@ void CaptureUpdateUniformLocations(const gl::Program *program, std::vector<CallC > std::string name; > int count = 1; > ParamBuffer params; >- params.addValueParam("program", ParamType::TShaderProgramID, program->id()); >+ params.addValueParam("program", ParamType::TGLuint, program->id().value); > > if (locationVar.index >= uniforms.size()) > { >@@ -1411,7 +1529,7 @@ void CaptureUpdateUniformLocations(const gl::Program *program, std::vector<CallC > params.addParam(std::move(nameParam)); > params.addValueParam("location", ParamType::TGLint, location); > params.addValueParam("count", ParamType::TGLint, static_cast<GLint>(count)); >- callsOut->emplace_back("UpdateUniformLocation2", std::move(params)); >+ callsOut->emplace_back("UpdateUniformLocation", std::move(params)); > } > } > >@@ -1462,10 +1580,11 @@ void CaptureDeleteUniformLocations(gl::ShaderProgramID program, std::vector<Call > { > ParamBuffer params; > params.addValueParam("program", ParamType::TShaderProgramID, program); >- callsOut->emplace_back("DeleteUniformLocations2", std::move(params)); >+ callsOut->emplace_back("DeleteUniformLocations", std::move(params)); > } > >-void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) >+void MaybeCaptureUpdateResourceIDs(ResourceTracker *resourceTracker, >+ std::vector<CallCapture> *callsOut) > { > const CallCapture &call = callsOut->back(); > >@@ -1475,7 +1594,7 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &buffers = > call.params.getParam("buffersPacked", ParamType::TBufferIDPointer, 1); >- CaptureUpdateResourceIDs<gl::BufferID>(call, buffers, callsOut); >+ CaptureUpdateResourceIDs<gl::BufferID>(call, buffers, resourceTracker, callsOut); > break; > } > >@@ -1483,7 +1602,7 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &fences = > call.params.getParam("fencesPacked", ParamType::TFenceNVIDPointer, 1); >- CaptureUpdateResourceIDs<gl::FenceNVID>(call, fences, callsOut); >+ CaptureUpdateResourceIDs<gl::FenceNVID>(call, fences, resourceTracker, callsOut); > break; > } > >@@ -1492,7 +1611,8 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &framebuffers = > call.params.getParam("framebuffersPacked", ParamType::TFramebufferIDPointer, 1); >- CaptureUpdateResourceIDs<gl::FramebufferID>(call, framebuffers, callsOut); >+ CaptureUpdateResourceIDs<gl::FramebufferID>(call, framebuffers, resourceTracker, >+ callsOut); > break; > } > >@@ -1500,7 +1620,8 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &pipelines = > call.params.getParam("pipelinesPacked", ParamType::TProgramPipelineIDPointer, 1); >- CaptureUpdateResourceIDs<gl::ProgramPipelineID>(call, pipelines, callsOut); >+ CaptureUpdateResourceIDs<gl::ProgramPipelineID>(call, pipelines, resourceTracker, >+ callsOut); > break; > } > >@@ -1509,7 +1630,7 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &queries = > call.params.getParam("idsPacked", ParamType::TQueryIDPointer, 1); >- CaptureUpdateResourceIDs<gl::QueryID>(call, queries, callsOut); >+ CaptureUpdateResourceIDs<gl::QueryID>(call, queries, resourceTracker, callsOut); > break; > } > >@@ -1518,7 +1639,8 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &renderbuffers = > call.params.getParam("renderbuffersPacked", ParamType::TRenderbufferIDPointer, 1); >- CaptureUpdateResourceIDs<gl::RenderbufferID>(call, renderbuffers, callsOut); >+ CaptureUpdateResourceIDs<gl::RenderbufferID>(call, renderbuffers, resourceTracker, >+ callsOut); > break; > } > >@@ -1526,7 +1648,7 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &samplers = > call.params.getParam("samplersPacked", ParamType::TSamplerIDPointer, 1); >- CaptureUpdateResourceIDs<gl::SamplerID>(call, samplers, callsOut); >+ CaptureUpdateResourceIDs<gl::SamplerID>(call, samplers, resourceTracker, callsOut); > break; > } > >@@ -1534,7 +1656,7 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &semaphores = > call.params.getParam("semaphoresPacked", ParamType::TSemaphoreIDPointer, 1); >- CaptureUpdateResourceIDs<gl::SemaphoreID>(call, semaphores, callsOut); >+ CaptureUpdateResourceIDs<gl::SemaphoreID>(call, semaphores, resourceTracker, callsOut); > break; > } > >@@ -1542,7 +1664,7 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &textures = > call.params.getParam("texturesPacked", ParamType::TTextureIDPointer, 1); >- CaptureUpdateResourceIDs<gl::TextureID>(call, textures, callsOut); >+ CaptureUpdateResourceIDs<gl::TextureID>(call, textures, resourceTracker, callsOut); > break; > } > >@@ -1550,7 +1672,8 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &xfbs = > call.params.getParam("idsPacked", ParamType::TTransformFeedbackIDPointer, 1); >- CaptureUpdateResourceIDs<gl::TransformFeedbackID>(call, xfbs, callsOut); >+ CaptureUpdateResourceIDs<gl::TransformFeedbackID>(call, xfbs, resourceTracker, >+ callsOut); > break; > } > >@@ -1559,7 +1682,8 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &vertexArrays = > call.params.getParam("arraysPacked", ParamType::TVertexArrayIDPointer, 1); >- CaptureUpdateResourceIDs<gl::VertexArrayID>(call, vertexArrays, callsOut); >+ CaptureUpdateResourceIDs<gl::VertexArrayID>(call, vertexArrays, resourceTracker, >+ callsOut); > break; > } > >@@ -1567,7 +1691,8 @@ void MaybeCaptureUpdateResourceIDs(std::vector<CallCapture> *callsOut) > { > const ParamCapture &memoryObjects = > call.params.getParam("memoryObjectsPacked", ParamType::TMemoryObjectIDPointer, 1); >- CaptureUpdateResourceIDs<gl::MemoryObjectID>(call, memoryObjects, callsOut); >+ CaptureUpdateResourceIDs<gl::MemoryObjectID>(call, memoryObjects, resourceTracker, >+ callsOut); > break; > } > >@@ -1585,7 +1710,7 @@ void CaptureUpdateCurrentProgram(const CallCapture &call, > gl::ShaderProgramID programID = param.value.ShaderProgramIDVal; > > ParamBuffer paramBuffer; >- paramBuffer.addValueParam("program", ParamType::TShaderProgramID, programID); >+ paramBuffer.addValueParam("program", ParamType::TGLuint, programID.value); > > callsOut->emplace_back("UpdateCurrentProgram", std::move(paramBuffer)); > } >@@ -2435,23 +2560,40 @@ void CaptureBufferResetCalls(const gl::State &replayState, > > // Track this as a starting resource that may need to be restored. > TrackedResource &trackedBuffers = resourceTracker->getTrackedResource(ResourceIDType::Buffer); >- ResourceSet &startingBuffers = trackedBuffers.getStartingResources(); >- startingBuffers.insert(bufferID); > > // Track calls to regenerate a given buffer > ResourceCalls &bufferRegenCalls = trackedBuffers.getResourceRegenCalls(); > Capture(&bufferRegenCalls[bufferID], CaptureDeleteBuffers(replayState, true, 1, id)); > Capture(&bufferRegenCalls[bufferID], CaptureGenBuffers(replayState, true, 1, id)); >- MaybeCaptureUpdateResourceIDs(&bufferRegenCalls[bufferID]); >+ MaybeCaptureUpdateResourceIDs(resourceTracker, &bufferRegenCalls[bufferID]); >+ >+ // Call glBufferStorageEXT when regenerating immutable buffers, >+ // as we can't call glBufferData on restore. >+ if (buffer->isImmutable()) >+ { >+ Capture(&bufferRegenCalls[bufferID], >+ CaptureBindBuffer(replayState, true, gl::BufferBinding::Array, *id)); >+ Capture( >+ &bufferRegenCalls[bufferID], >+ CaptureBufferStorageEXT(replayState, true, gl::BufferBinding::Array, >+ static_cast<GLsizeiptr>(buffer->getSize()), >+ buffer->getMapPointer(), buffer->getStorageExtUsageFlags())); >+ } > > // Track calls to restore a given buffer's contents > ResourceCalls &bufferRestoreCalls = trackedBuffers.getResourceRestoreCalls(); > Capture(&bufferRestoreCalls[bufferID], > CaptureBindBuffer(replayState, true, gl::BufferBinding::Array, *id)); >- Capture(&bufferRestoreCalls[bufferID], >- CaptureBufferData(replayState, true, gl::BufferBinding::Array, >- static_cast<GLsizeiptr>(buffer->getSize()), buffer->getMapPointer(), >- buffer->getUsage())); >+ >+ // Mutable buffers will be restored here using glBufferData. >+ // Immutable buffers need to be restored below, after maping. >+ if (!buffer->isImmutable()) >+ { >+ Capture(&bufferRestoreCalls[bufferID], >+ CaptureBufferData(replayState, true, gl::BufferBinding::Array, >+ static_cast<GLsizeiptr>(buffer->getSize()), >+ buffer->getMapPointer(), buffer->getUsage())); >+ } > > if (buffer->isMapped()) > { >@@ -2470,6 +2612,21 @@ void CaptureBufferResetCalls(const gl::State &replayState, > > // Track the bufferID that was just mapped > bufferMapCalls[bufferID].back().params.setMappedBufferID(buffer->id()); >+ >+ // Restore immutable mapped buffers. Needs to happen after mapping. >+ if (buffer->isImmutable()) >+ { >+ ParamBuffer dataParamBuffer; >+ dataParamBuffer.addValueParam("dest", ParamType::TGLuint, buffer->id().value); >+ ParamCapture captureData("source", ParamType::TvoidConstPointer); >+ CaptureMemory(buffer->getMapPointer(), static_cast<GLsizeiptr>(buffer->getSize()), >+ &captureData); >+ dataParamBuffer.addParam(std::move(captureData)); >+ dataParamBuffer.addValueParam<GLsizeiptr>("size", ParamType::TGLsizeiptr, >+ static_cast<GLsizeiptr>(buffer->getSize())); >+ bufferMapCalls[bufferID].emplace_back("UpdateClientBufferData", >+ std::move(dataParamBuffer)); >+ } > } > > // Track calls unmap a buffer that started as unmapped >@@ -2489,7 +2646,7 @@ void CaptureFenceSyncResetCalls(const gl::State &replayState, > FenceSyncCalls &fenceSyncRegenCalls = resourceTracker->getFenceSyncRegenCalls(); > Capture(&fenceSyncRegenCalls[syncID], > CaptureFenceSync(replayState, true, sync->getCondition(), sync->getFlags(), syncID)); >- MaybeCaptureUpdateResourceIDs(&fenceSyncRegenCalls[syncID]); >+ MaybeCaptureUpdateResourceIDs(resourceTracker, &fenceSyncRegenCalls[syncID]); > } > > void CaptureBufferBindingResetCalls(const gl::State &replayState, >@@ -2602,7 +2759,12 @@ void CaptureShareGroupMidExecutionSetup(const gl::Context *context, > > // Generate binding. > cap(CaptureGenBuffers(replayState, true, 1, &id)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >+ >+ resourceTracker->getTrackedResource(ResourceIDType::Buffer) >+ .getStartingResources() >+ .insert(id.value); >+ >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); > > // Always use the array buffer binding point to upload data to keep things simple. > if (buffer != replayState.getArrayBuffer()) >@@ -2641,7 +2803,7 @@ void CaptureShareGroupMidExecutionSetup(const gl::Context *context, > static_cast<GLsizeiptr>(buffer->getMapOffset()), > static_cast<GLsizeiptr>(buffer->getMapLength()), > (buffer->getAccessFlags() & GL_MAP_WRITE_BIT) != 0, >- (buffer->getAccessFlags() & GL_MAP_COHERENT_BIT_EXT) != 0); >+ (buffer->getStorageExtUsageFlags() & GL_MAP_COHERENT_BIT_EXT) != 0); > } > else > { >@@ -2705,7 +2867,7 @@ void CaptureShareGroupMidExecutionSetup(const gl::Context *context, > for (std::vector<CallCapture> *calls : texGenCalls) > { > Capture(calls, CaptureGenTextures(replayState, true, 1, &id)); >- MaybeCaptureUpdateResourceIDs(calls); >+ MaybeCaptureUpdateResourceIDs(resourceTracker, calls); > } > > // For the remaining texture setup calls, track in the restore list >@@ -2956,7 +3118,12 @@ void CaptureShareGroupMidExecutionSetup(const gl::Context *context, > > // Generate renderbuffer id. > cap(framebufferFuncs.genRenderbuffers(replayState, true, 1, &id)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >+ >+ resourceTracker->getTrackedResource(ResourceIDType::Renderbuffer) >+ .getStartingResources() >+ .insert(id.value); >+ >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); > cap(framebufferFuncs.bindRenderbuffer(replayState, true, GL_RENDERBUFFER, id)); > > GLenum internalformat = renderbuffer->getFormat().info->internalFormat; >@@ -3089,7 +3256,7 @@ void CaptureShareGroupMidExecutionSetup(const gl::Context *context, > // Don't gen the sampler if we've seen it before, since they are shared across the context > // share group. > cap(CaptureGenSamplers(replayState, true, 1, &samplerID)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); > > gl::Sampler *sampler = samplerIter.second; > if (!sampler) >@@ -3198,7 +3365,12 @@ void CaptureMidExecutionSetup(const gl::Context *context, > if (vertexArrayID.value != 0) > { > cap(CaptureGenVertexArrays(replayState, true, 1, &vertexArrayID)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >+ >+ resourceTracker->getTrackedResource(ResourceIDType::VertexArray) >+ .getStartingResources() >+ .insert(vertexArrayID.value); >+ >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); > } > > if (vertexArrayIter.second) >@@ -3342,14 +3514,15 @@ void CaptureMidExecutionSetup(const gl::Context *context, > } > > cap(framebufferFuncs.genFramebuffers(replayState, true, 1, &id)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >- cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_FRAMEBUFFER, id)); >- currentDrawFramebuffer = currentReadFramebuffer = id; > > resourceTracker->getTrackedResource(ResourceIDType::Framebuffer) > .getStartingResources() > .insert(id.value); > >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); >+ cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_FRAMEBUFFER, id)); >+ currentDrawFramebuffer = currentReadFramebuffer = id; >+ > // Color Attachments. > for (const gl::FramebufferAttachment &colorAttachment : framebuffer->getColorAttachments()) > { >@@ -3395,32 +3568,36 @@ void CaptureMidExecutionSetup(const gl::Context *context, > } > > // Capture framebuffer bindings. >- gl::FramebufferID stateReadFramebuffer = apiState.getReadFramebuffer()->id(); >- gl::FramebufferID stateDrawFramebuffer = apiState.getDrawFramebuffer()->id(); >- if (stateDrawFramebuffer == stateReadFramebuffer) >+ if (apiState.getDrawFramebuffer()) > { >- if (currentDrawFramebuffer != stateDrawFramebuffer || >- currentReadFramebuffer != stateReadFramebuffer) >+ ASSERT(apiState.getReadFramebuffer()); >+ gl::FramebufferID stateReadFramebuffer = apiState.getReadFramebuffer()->id(); >+ gl::FramebufferID stateDrawFramebuffer = apiState.getDrawFramebuffer()->id(); >+ if (stateDrawFramebuffer == stateReadFramebuffer) > { >- cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_FRAMEBUFFER, >- stateDrawFramebuffer)); >- currentDrawFramebuffer = currentReadFramebuffer = stateDrawFramebuffer; >+ if (currentDrawFramebuffer != stateDrawFramebuffer || >+ currentReadFramebuffer != stateReadFramebuffer) >+ { >+ cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_FRAMEBUFFER, >+ stateDrawFramebuffer)); >+ currentDrawFramebuffer = currentReadFramebuffer = stateDrawFramebuffer; >+ } > } >- } >- else >- { >- if (currentDrawFramebuffer != stateDrawFramebuffer) >+ else > { >- cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_DRAW_FRAMEBUFFER, >- currentDrawFramebuffer)); >- currentDrawFramebuffer = stateDrawFramebuffer; >- } >+ if (currentDrawFramebuffer != stateDrawFramebuffer) >+ { >+ cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_DRAW_FRAMEBUFFER, >+ currentDrawFramebuffer)); >+ currentDrawFramebuffer = stateDrawFramebuffer; >+ } > >- if (currentReadFramebuffer != stateReadFramebuffer) >- { >- cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_READ_FRAMEBUFFER, >- replayState.getReadFramebuffer()->id())); >- currentReadFramebuffer = stateReadFramebuffer; >+ if (currentReadFramebuffer != stateReadFramebuffer) >+ { >+ cap(framebufferFuncs.bindFramebuffer(replayState, true, GL_READ_FRAMEBUFFER, >+ replayState.getReadFramebuffer()->id())); >+ currentReadFramebuffer = stateReadFramebuffer; >+ } > } > } > >@@ -3433,7 +3610,7 @@ void CaptureMidExecutionSetup(const gl::Context *context, > gl::ProgramPipeline *pipeline = ppoIterator.second; > gl::ProgramPipelineID id = {ppoIterator.first}; > cap(CaptureGenProgramPipelines(replayState, true, 1, &id)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); > > // PPOs can contain graphics and compute programs, so loop through all shader types rather > // than just the linked ones since getLinkedShaderStages() will return either only graphics >@@ -3509,7 +3686,7 @@ void CaptureMidExecutionSetup(const gl::Context *context, > gl::QueryID queryID = {queryIter->first}; > > cap(CaptureGenQueries(replayState, true, 1, &queryID)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); > > gl::Query *query = queryIter->second; > if (query) >@@ -3540,7 +3717,7 @@ void CaptureMidExecutionSetup(const gl::Context *context, > } > > cap(CaptureGenTransformFeedbacks(replayState, true, 1, &xfbID)); >- MaybeCaptureUpdateResourceIDs(setupCalls); >+ MaybeCaptureUpdateResourceIDs(resourceTracker, setupCalls); > > gl::TransformFeedback *xfb = xfbIter.second; > if (!xfb) >@@ -4774,12 +4951,42 @@ void CoherentBuffer::setDirty(size_t relativePage, bool dirty) > mDirtyPages[relativePage] = dirty; > } > >-void CoherentBuffer::removeProtection() >+void CoherentBuffer::removeProtection(PageSharingType sharingType) > { >- if (!UnprotectMemory(mProtectionRange.start, mProtectionRange.size)) >+ uintptr_t start = mProtectionRange.start; >+ size_t size = mProtectionRange.size; >+ >+ switch (sharingType) >+ { >+ case PageSharingType::FirstShared: >+ case PageSharingType::FirstAndLastShared: >+ start += mPageSize; >+ break; >+ default: >+ break; >+ } >+ >+ switch (sharingType) >+ { >+ case PageSharingType::FirstShared: >+ case PageSharingType::LastShared: >+ size -= mPageSize; >+ break; >+ case PageSharingType::FirstAndLastShared: >+ size -= (2 * mPageSize); >+ break; >+ default: >+ break; >+ } >+ >+ if (size == 0) > { >- ERR() << "Could not remove protection for buffer at " << mProtectionRange.start >- << " with size " << mProtectionRange.size; >+ return; >+ } >+ >+ if (!UnprotectMemory(start, size)) >+ { >+ ERR() << "Could not remove protection for buffer at " << start << " with size " << size; > } > } > >@@ -4877,7 +5084,7 @@ void CoherentBufferTracker::onEndFrame() > for (const auto &pair : mBuffers) > { > std::shared_ptr<CoherentBuffer> buffer = pair.second; >- buffer->removeProtection(); >+ buffer->removeProtection(PageSharingType::NoneShared); > } > > disable(); >@@ -4914,6 +5121,54 @@ void CoherentBufferTracker::addBuffer(gl::BufferID id, uintptr_t start, size_t s > mBuffers.insert(std::make_pair(id.value, std::move(buffer))); > } > >+PageSharingType CoherentBufferTracker::doesBufferSharePage(gl::BufferID id) >+{ >+ bool firstPageShared = false; >+ bool lastPageShared = false; >+ >+ std::shared_ptr<CoherentBuffer> buffer = mBuffers[id.value]; >+ >+ AddressRange range = buffer->getRange(); >+ >+ size_t firstPage = range.start / mPageSize; >+ size_t lastPage = range.end() / mPageSize; >+ >+ for (const auto &pair : mBuffers) >+ { >+ gl::BufferID otherId = {pair.first}; >+ if (otherId != id) >+ { >+ std::shared_ptr<CoherentBuffer> otherBuffer = pair.second; >+ size_t relativePage; >+ if (otherBuffer->contains(firstPage, &relativePage)) >+ { >+ firstPageShared = true; >+ } >+ else if (otherBuffer->contains(lastPage, &relativePage)) >+ { >+ lastPageShared = true; >+ } >+ } >+ } >+ >+ if (firstPageShared && !lastPageShared) >+ { >+ return PageSharingType::FirstShared; >+ } >+ else if (!firstPageShared && lastPageShared) >+ { >+ return PageSharingType::LastShared; >+ } >+ else if (firstPageShared && lastPageShared) >+ { >+ return PageSharingType::FirstAndLastShared; >+ } >+ else >+ { >+ return PageSharingType::NoneShared; >+ } >+} >+ > void CoherentBufferTracker::removeBuffer(gl::BufferID id) > { > std::lock_guard<std::mutex> lock(mMutex); >@@ -4923,9 +5178,10 @@ void CoherentBufferTracker::removeBuffer(gl::BufferID id) > return; > } > >- // Expecting that no buffer that overlapps in a page with another is removed >- // while the other is kept and still written to. These writes would be missed. >- mBuffers[id.value]->removeProtection(); >+ // If the buffer shares pages with other tracked buffers, >+ // don't unprotect the overlapping pages. >+ PageSharingType sharingType = doesBufferSharePage(id); >+ mBuffers[id.value]->removeProtection(sharingType); > mBuffers.erase(id.value); > } > >@@ -5471,13 +5727,20 @@ void FrameCaptureShared::maybeCapturePreCallUpdates( > gl::ShaderProgramID programID = {call.params.getReturnValue().value.GLuintVal}; > const ParamCapture ¶mCapture = > call.params.getParam("typePacked", ParamType::TShaderType, 0); >+ const ParamCapture &lineCount = call.params.getParam("count", ParamType::TGLsizei, 1); >+ const ParamCapture &strings = >+ call.params.getParam("strings", ParamType::TGLcharConstPointerPointer, 2); >+ >+ std::ostringstream sourceString; >+ for (int i = 0; i < lineCount.value.GLsizeiVal; ++i) >+ { >+ sourceString << strings.value.GLcharConstPointerPointerVal[i]; >+ } >+ > gl::ShaderType shaderType = paramCapture.value.ShaderTypeVal; >- gl::Program *program = context->getProgramResolveLink(programID); >- ASSERT(program); >- const gl::Shader *shader = program->getAttachedShader(shaderType); >- ASSERT(shader); >- setShaderSource(shader->getHandle(), shader->getSourceString()); >- setProgramSources(programID, GetAttachedProgramSources(program)); >+ ProgramSources source; >+ source[shaderType] = sourceString.str(); >+ setProgramSources(programID, source); > handleGennedResource(programID); > break; > } >@@ -5598,12 +5861,10 @@ void FrameCaptureShared::maybeCapturePreCallUpdates( > bool writable = > access == GL_WRITE_ONLY_OES || access == GL_WRITE_ONLY || access == GL_READ_WRITE; > >- bool coherent = access & GL_MAP_COHERENT_BIT_EXT; >- > FrameCaptureShared *frameCaptureShared = > context->getShareGroup()->getFrameCaptureShared(); > frameCaptureShared->trackBufferMapping(&call, buffer->id(), buffer, offset, length, >- writable, coherent); >+ writable, false); > break; > } > >@@ -5877,7 +6138,10 @@ void FrameCaptureShared::captureCall(const gl::Context *context, > void FrameCaptureShared::maybeCapturePostCallUpdates(const gl::Context *context) > { > // Process resource ID updates. >- MaybeCaptureUpdateResourceIDs(&mFrameCalls); >+ if (isCaptureActive()) >+ { >+ MaybeCaptureUpdateResourceIDs(&mResourceTracker, &mFrameCalls); >+ } > > CallCapture &lastCall = mFrameCalls.back(); > switch (lastCall.entryPoint) >@@ -6040,13 +6304,13 @@ void FrameCaptureShared::captureCoherentBufferSnapshot(const gl::Context *contex > dataParamBuffer.addValueParam<GLsizeiptr>("offset", ParamType::TGLsizeiptr, offset); > > // Call the helper that populates the buffer with captured data >- mFrameCalls.emplace_back("UpdateClientBufferData2WithOffset", >+ mFrameCalls.emplace_back("UpdateClientBufferDataWithOffset", > std::move(dataParamBuffer)); > } > else > { > // Call the helper that populates the buffer with captured data >- mFrameCalls.emplace_back("UpdateClientBufferData2", std::move(dataParamBuffer)); >+ mFrameCalls.emplace_back("UpdateClientBufferData", std::move(dataParamBuffer)); > } > } > } >@@ -6106,7 +6370,7 @@ void FrameCaptureShared::captureMappedBufferSnapshot(const gl::Context *context, > dataParamBuffer.addValueParam<GLsizeiptr>("size", ParamType::TGLsizeiptr, length); > > // Call the helper that populates the buffer with captured data >- mFrameCalls.emplace_back("UpdateClientBufferData2", std::move(dataParamBuffer)); >+ mFrameCalls.emplace_back("UpdateClientBufferData", std::move(dataParamBuffer)); > > // Unmap the buffer and move on > GLboolean dontCare; >@@ -6737,11 +7001,9 @@ void FrameCaptureShared::writeCppReplayIndexFiles(const gl::Context *context, > mReplayWriter.setFilenamePattern(fnamePattern); > } > >- // We write the json before the index files and header, to avoid duplicating sources with >- // automatically defined sources in angle.gni. >- writeJSON(context); >- > mReplayWriter.saveIndexFilesAndHeader(); >+ >+ writeJSON(context); > } > > void FrameCaptureShared::writeMainContextCppReplay(const gl::Context *context, >@@ -7370,7 +7632,7 @@ void WriteParamValueReplay<ParamType::TBufferID>(std::ostream &os, > const CallCapture &call, > gl::BufferID value) > { >- os << "gBufferMap2[" << value.value << "]"; >+ os << "gBufferMap[" << value.value << "]"; > } > > template <> >@@ -7378,7 +7640,7 @@ void WriteParamValueReplay<ParamType::TFenceNVID>(std::ostream &os, > const CallCapture &call, > gl::FenceNVID value) > { >- os << "gFenceNVMap2[" << value.value << "]"; >+ os << "gFenceNVMap[" << value.value << "]"; > } > > template <> >@@ -7386,7 +7648,7 @@ void WriteParamValueReplay<ParamType::TFramebufferID>(std::ostream &os, > const CallCapture &call, > gl::FramebufferID value) > { >- os << "gFramebufferMap2[" << value.value << "]"; >+ os << "gFramebufferMap[" << value.value << "]"; > } > > template <> >@@ -7394,7 +7656,7 @@ void WriteParamValueReplay<ParamType::TMemoryObjectID>(std::ostream &os, > const CallCapture &call, > gl::MemoryObjectID value) > { >- os << "gMemoryObjectMap2[" << value.value << "]"; >+ os << "gMemoryObjectMap[" << value.value << "]"; > } > > template <> >@@ -7402,7 +7664,7 @@ void WriteParamValueReplay<ParamType::TProgramPipelineID>(std::ostream &os, > const CallCapture &call, > gl::ProgramPipelineID value) > { >- os << "gProgramPipelineMap2[" << value.value << "]"; >+ os << "gProgramPipelineMap[" << value.value << "]"; > } > > template <> >@@ -7410,7 +7672,7 @@ void WriteParamValueReplay<ParamType::TQueryID>(std::ostream &os, > const CallCapture &call, > gl::QueryID value) > { >- os << "gQueryMap2[" << value.value << "]"; >+ os << "gQueryMap[" << value.value << "]"; > } > > template <> >@@ -7418,7 +7680,7 @@ void WriteParamValueReplay<ParamType::TRenderbufferID>(std::ostream &os, > const CallCapture &call, > gl::RenderbufferID value) > { >- os << "gRenderbufferMap2[" << value.value << "]"; >+ os << "gRenderbufferMap[" << value.value << "]"; > } > > template <> >@@ -7426,7 +7688,7 @@ void WriteParamValueReplay<ParamType::TSamplerID>(std::ostream &os, > const CallCapture &call, > gl::SamplerID value) > { >- os << "gSamplerMap2[" << value.value << "]"; >+ os << "gSamplerMap[" << value.value << "]"; > } > > template <> >@@ -7434,7 +7696,7 @@ void WriteParamValueReplay<ParamType::TSemaphoreID>(std::ostream &os, > const CallCapture &call, > gl::SemaphoreID value) > { >- os << "gSemaphoreMap2[" << value.value << "]"; >+ os << "gSemaphoreMap[" << value.value << "]"; > } > > template <> >@@ -7442,7 +7704,7 @@ void WriteParamValueReplay<ParamType::TShaderProgramID>(std::ostream &os, > const CallCapture &call, > gl::ShaderProgramID value) > { >- os << "gShaderProgramMap2[" << value.value << "]"; >+ os << "gShaderProgramMap[" << value.value << "]"; > } > > template <> >@@ -7458,7 +7720,7 @@ void WriteParamValueReplay<ParamType::TTextureID>(std::ostream &os, > const CallCapture &call, > gl::TextureID value) > { >- os << "gTextureMap2[" << value.value << "]"; >+ os << "gTextureMap[" << value.value << "]"; > } > > template <> >@@ -7466,7 +7728,7 @@ void WriteParamValueReplay<ParamType::TTransformFeedbackID>(std::ostream &os, > const CallCapture &call, > gl::TransformFeedbackID value) > { >- os << "gTransformFeedbackMap2[" << value.value << "]"; >+ os << "gTransformFeedbackMap[" << value.value << "]"; > } > > template <> >@@ -7474,7 +7736,7 @@ void WriteParamValueReplay<ParamType::TVertexArrayID>(std::ostream &os, > const CallCapture &call, > gl::VertexArrayID value) > { >- os << "gVertexArrayMap2[" << value.value << "]"; >+ os << "gVertexArrayMap[" << value.value << "]"; > } > > template <> >@@ -7488,14 +7750,14 @@ void WriteParamValueReplay<ParamType::TUniformLocation>(std::ostream &os, > return; > } > >- os << "gUniformLocations2["; >+ os << "gUniformLocations["; > > // Find the program from the call parameters. > std::vector<gl::ShaderProgramID> programIDs; > if (FindShaderProgramIDsInCall(call, programIDs)) > { > ASSERT(programIDs.size() == 1); >- os << "gShaderProgramMap2[" << programIDs[0].value << "]"; >+ os << "gShaderProgramMap[" << programIDs[0].value << "]"; > } > else > { >@@ -7515,7 +7777,7 @@ void WriteParamValueReplay<ParamType::TUniformBlockIndex>(std::ostream &os, > bool foundProgram = FindShaderProgramIDsInCall(call, programIDs); > ASSERT(foundProgram && programIDs.size() == 1); > >- os << "gUniformBlockIndexes[gShaderProgramMap2[" << programIDs[0].value << "]][" << value.value >+ os << "gUniformBlockIndexes[gShaderProgramMap[" << programIDs[0].value << "]][" << value.value > << "]"; > } > >@@ -7890,6 +8152,7 @@ void ReplayWriter::addWrittenFile(const std::string &filename) > std::vector<std::string> ReplayWriter::getAndResetWrittenFiles() > { > std::vector<std::string> results = std::move(mWrittenFiles); >+ std::sort(results.begin(), results.end()); > ASSERT(mWrittenFiles.empty()); > return results; > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.h b/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.h >index 56e10e0e18d9cf8703f002d3d2ae9c3fc43e35f2..9eee0207aab29a59246bcbc46f88e05df4a56598 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/capture/FrameCapture.h >@@ -468,6 +468,15 @@ struct AddressRange > size_t size; > }; > >+// Used to handle protection of buffers that overlap in pages. >+enum class PageSharingType >+{ >+ NoneShared, >+ FirstShared, >+ LastShared, >+ FirstAndLastShared >+}; >+ > class CoherentBuffer > { > public: >@@ -480,8 +489,8 @@ class CoherentBuffer > // Sets a page dirty state and sets it's protection > void setDirty(size_t relativePage, bool dirty); > >- // Removes protection completely >- void removeProtection(); >+ // Removes protection >+ void removeProtection(PageSharingType sharingType); > > bool contains(size_t page, size_t *relativePage); > bool isDirty(); >@@ -525,6 +534,9 @@ class CoherentBufferTracker final : angle::NonCopyable > void onEndFrame(); > > private: >+ // Detect overlapping pages when removing protection >+ PageSharingType doesBufferSharePage(gl::BufferID id); >+ > // Returns a map to found buffers and the corresponding pages for a given address. > // For addresses that are in a page shared by 2 buffers, 2 results are returned. > HashMap<std::shared_ptr<CoherentBuffer>, size_t> getBufferPagesForAddress(uintptr_t address); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_autogen.h b/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_autogen.h >index 7cfd72afbc9058ee609aa575821ed5c8f18db4e9..d25ecb8bee3483a5853fbd78a98e17cd203ac12c 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_autogen.h >@@ -19,6 +19,8 @@ namespace gl > > // Method Captures > >+// GL_ANDROID_extension_pack_es31a >+ > // GL_ANGLE_base_vertex_base_instance > angle::CallCapture CaptureDrawArraysInstancedBaseInstanceANGLE(const State &glState, > bool isCallValid, >@@ -1695,6 +1697,8 @@ angle::CallCapture CaptureValidateProgramPipelineEXT(const State &glState, > bool isCallValid, > ProgramPipelineID pipelinePacked); > >+// GL_EXT_shader_framebuffer_fetch >+ > // GL_EXT_shader_framebuffer_fetch_non_coherent > angle::CallCapture CaptureFramebufferFetchBarrierEXT(const State &glState, bool isCallValid); > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_params.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_params.cpp >index 93b2251e430102d64874376b74c5c5a31fcd8359..2f39136d4c512c0a0825c7f51a780c4388d720c1 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_params.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/capture/capture_gles_ext_params.cpp >@@ -223,7 +223,18 @@ void CaptureMultiDrawElementsIndirectEXT_indirect(const State &glState, > GLsizei stride, > angle::ParamCapture *paramCapture) > { >- UNIMPLEMENTED(); >+ if (glState.getTargetBuffer(gl::BufferBinding::DrawIndirect) != nullptr) >+ { >+ paramCapture->value.voidConstPointerVal = indirect; >+ } >+ else >+ { >+ if (stride == 0) >+ { >+ stride = sizeof(DrawElementsIndirectCommand); >+ } >+ CaptureMemory(indirect, stride * drawcount, paramCapture); >+ } > } > > void CaptureDrawRangeElementsBaseVertexEXT_indices(const State &glState, >@@ -386,7 +397,7 @@ void CaptureMultiDrawElementsANGLE_counts(const State &glState, > GLsizei drawcount, > ParamCapture *paramCapture) > { >- UNIMPLEMENTED(); >+ CaptureArray(counts, drawcount, paramCapture); > } > > void CaptureMultiDrawElementsANGLE_indices(const State &glState, >@@ -398,7 +409,7 @@ void CaptureMultiDrawElementsANGLE_indices(const State &glState, > GLsizei drawcount, > ParamCapture *paramCapture) > { >- UNIMPLEMENTED(); >+ CaptureArray(indices, drawcount, paramCapture); > } > > void CaptureMultiDrawElementsInstancedANGLE_counts(const State &glState, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/capture/frame_capture_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/capture/frame_capture_utils.cpp >index d6bced4844788a7fb6745b4f1b1955107f074f1c..ba4a2b73e55e97d3be0c081aa2abe07ebfff04ab 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/capture/frame_capture_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/capture/frame_capture_utils.cpp >@@ -344,6 +344,7 @@ Result SerializeFramebufferState(const gl::Context *context, > json->addScalar("DefaultFixedSampleLocation", > framebufferState.getDefaultFixedSampleLocations()); > json->addScalar("DefaultLayers", framebufferState.getDefaultLayers()); >+ json->addScalar("FlipY", framebufferState.getFlipY()); > > { > GroupScope attachmentsGroup(json, "Attachments"); >@@ -603,7 +604,24 @@ void SerializeContextState(JsonSerializer *json, const gl::State &state) > } > json->addScalar("TexturesIncompatibleWithSamplers", > state.getTexturesIncompatibleWithSamplers().to_ulong()); >- SerializeBindingPointerVector<gl::Sampler>(json, state.getSamplers()); >+ >+ { >+ GroupScope texturesCacheGroup(json, "ActiveTexturesCache"); >+ >+ const gl::ActiveTexturesCache &texturesCache = state.getActiveTexturesCache(); >+ for (GLuint textureIndex = 0; textureIndex < texturesCache.size(); ++textureIndex) >+ { >+ const gl::Texture *tex = texturesCache[textureIndex]; >+ std::stringstream strstr; >+ strstr << "Tex " << std::setfill('0') << std::setw(2) << textureIndex; >+ json->addScalar(strstr.str(), tex ? tex->id().value : 0); >+ } >+ } >+ >+ { >+ GroupScope samplersGroupScope(json, "Samplers"); >+ SerializeBindingPointerVector<gl::Sampler>(json, state.getSamplers()); >+ } > > { > GroupScope imageUnitsGroup(json, "BoundImageUnits"); >@@ -782,8 +800,18 @@ Result SerializeRenderbuffer(const gl::Context *context, > > if (renderbuffer->initState(gl::ImageIndex()) == gl::InitState::Initialized) > { >- >- if (renderbuffer->getWidth() * renderbuffer->getHeight() > 0) >+ if (renderbuffer->getSamples() > 1 && renderbuffer->getFormat().info->depthBits > 0) >+ { >+ // Vulkan can't do resolve blits for multisampled depth attachemnts and >+ // we don't implement an emulation, therefore we can't read back any useful >+ // data here. >+ json->addCString("Pixels", "multisampled depth buffer"); >+ } >+ else if (renderbuffer->getWidth() * renderbuffer->getHeight() <= 0) >+ { >+ json->addCString("Pixels", "no pixels"); >+ } >+ else > { > const gl::InternalFormat &format = *renderbuffer->getFormat().info; > >@@ -807,10 +835,6 @@ Result SerializeRenderbuffer(const gl::Context *context, > context, packState, nullptr, readFormat, readType, pixelsPtr->data())); > json->addBlob("Pixels", pixelsPtr->data(), pixelsPtr->size()); > } >- else >- { >- json->addCString("Pixels", "no pixels"); >- } > } > else > { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.cpp >index 09db50677d027390a206790334afadbe2333be27..ef75e78c8607648cc914d184daa5f40d5eb47207 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.cpp >@@ -15,14 +15,7 @@ > > namespace > { >-void UpdateResourceMap(ResourceMap *resourceMap, GLuint id, GLsizei readBufferOffset) >-{ >- GLuint returnedID; >- memcpy(&returnedID, &gReadBuffer[readBufferOffset], sizeof(GLuint)); >- (*resourceMap)[id] = returnedID; >-} >- >-void UpdateResourceMap2(GLuint *resourceMap, GLuint id, GLsizei readBufferOffset) >+void UpdateResourceMap(GLuint *resourceMap, GLuint id, GLsizei readBufferOffset) > { > GLuint returnedID; > memcpy(&returnedID, &gReadBuffer[readBufferOffset], sizeof(GLuint)); >@@ -79,26 +72,11 @@ ValidateSerializedStateCallback gValidateSerializedStateCallback; > std::unordered_map<GLuint, std::vector<GLint>> gInternalUniformLocationsMap; > } // namespace > >-LocationsMap gUniformLocations; >-GLint **gUniformLocations2; >+GLint **gUniformLocations; > BlockIndexesMap gUniformBlockIndexes; > GLuint gCurrentProgram = 0; > >-// TODO (http://anglebug.com/6234): Remove three parameter UpdateUniformLocation on next retrace >-void UpdateUniformLocation(GLuint program, const char *name, GLint location) >-{ >- gUniformLocations[program][location] = glGetUniformLocation(program, name); >-} >- > void UpdateUniformLocation(GLuint program, const char *name, GLint location, GLint count) >-{ >- for (GLint i = 0; i < count; i++) >- { >- gUniformLocations[program][location + i] = glGetUniformLocation(program, name) + i; >- } >-} >- >-void UpdateUniformLocation2(GLuint program, const char *name, GLint location, GLint count) > { > std::vector<GLint> &programLocations = gInternalUniformLocationsMap[program]; > if (static_cast<GLint>(programLocations.size()) < location + count) >@@ -107,17 +85,14 @@ void UpdateUniformLocation2(GLuint program, const char *name, GLint location, GL > } > for (GLint arrayIndex = 0; arrayIndex < count; ++arrayIndex) > { >- programLocations[location + arrayIndex] = glGetUniformLocation(program, name) + arrayIndex; >+ GLuint mappedProgramID = gShaderProgramMap[program]; >+ programLocations[location + arrayIndex] = >+ glGetUniformLocation(mappedProgramID, name) + arrayIndex; > } >- gUniformLocations2[program] = programLocations.data(); >+ gUniformLocations[program] = programLocations.data(); > } > > void DeleteUniformLocations(GLuint program) >-{ >- gUniformLocations.erase(program); >-} >- >-void DeleteUniformLocations2(GLuint program) > { > // No-op. We leave uniform locations around so deleted current programs can still use them. > } >@@ -134,35 +109,22 @@ void UpdateCurrentProgram(GLuint program) > uint8_t *gBinaryData; > uint8_t *gReadBuffer; > uint8_t *gClientArrays[kMaxClientArrays]; >-ResourceMap gBufferMap; >-ResourceMap gFenceNVMap; >-ResourceMap gFramebufferMap; >-ResourceMap gMemoryObjectMap; >-ResourceMap gProgramPipelineMap; >-ResourceMap gQueryMap; >-ResourceMap gRenderbufferMap; >-ResourceMap gSamplerMap; >-ResourceMap gSemaphoreMap; >-ResourceMap gShaderProgramMap; >-ResourceMap gTextureMap; >-ResourceMap gTransformFeedbackMap; >-ResourceMap gVertexArrayMap; > SyncResourceMap gSyncMap; > ContextMap gContextMap; > >-GLuint *gBufferMap2; >-GLuint *gFenceNVMap2; >-GLuint *gFramebufferMap2; >-GLuint *gMemoryObjectMap2; >-GLuint *gProgramPipelineMap2; >-GLuint *gQueryMap2; >-GLuint *gRenderbufferMap2; >-GLuint *gSamplerMap2; >-GLuint *gSemaphoreMap2; >-GLuint *gShaderProgramMap2; >-GLuint *gTextureMap2; >-GLuint *gTransformFeedbackMap2; >-GLuint *gVertexArrayMap2; >+GLuint *gBufferMap; >+GLuint *gFenceNVMap; >+GLuint *gFramebufferMap; >+GLuint *gMemoryObjectMap; >+GLuint *gProgramPipelineMap; >+GLuint *gQueryMap; >+GLuint *gRenderbufferMap; >+GLuint *gSamplerMap; >+GLuint *gSemaphoreMap; >+GLuint *gShaderProgramMap; >+GLuint *gTextureMap; >+GLuint *gTransformFeedbackMap; >+GLuint *gVertexArrayMap; > > void SetBinaryDataDecompressCallback(DecompressCallback callback) > { >@@ -174,9 +136,29 @@ void SetBinaryDataDir(const char *dataDir) > gBinaryDataDir = dataDir; > } > >+GLuint *AllocateZeroedUints(size_t count) >+{ >+ GLuint *mem = new GLuint[count + 1]; >+ memset(mem, 0, sizeof(GLuint) * (count + 1)); >+ return mem; >+} >+ > void InitializeReplay(const char *binaryDataFileName, > size_t maxClientArraySize, >- size_t readBufferSize) >+ size_t readBufferSize, >+ uint32_t maxBuffer, >+ uint32_t maxFenceNV, >+ uint32_t maxFramebuffer, >+ uint32_t maxMemoryObject, >+ uint32_t maxProgramPipeline, >+ uint32_t maxQuery, >+ uint32_t maxRenderbuffer, >+ uint32_t maxSampler, >+ uint32_t maxSemaphore, >+ uint32_t maxShaderProgram, >+ uint32_t maxTexture, >+ uint32_t maxTransformFeedback, >+ uint32_t maxVertexArray) > { > LoadBinaryData(binaryDataFileName); > >@@ -186,50 +168,23 @@ void InitializeReplay(const char *binaryDataFileName, > } > > gReadBuffer = new uint8_t[readBufferSize]; >-} > >-GLuint *AllocateZeroedUints(size_t count) >-{ >- GLuint *mem = new GLuint[count + 1]; >- memset(mem, 0, sizeof(GLuint) * (count + 1)); >- return mem; >-} >+ gBufferMap = AllocateZeroedUints(maxBuffer); >+ gFenceNVMap = AllocateZeroedUints(maxFenceNV); >+ gFramebufferMap = AllocateZeroedUints(maxFramebuffer); >+ gMemoryObjectMap = AllocateZeroedUints(maxMemoryObject); >+ gProgramPipelineMap = AllocateZeroedUints(maxProgramPipeline); >+ gQueryMap = AllocateZeroedUints(maxQuery); >+ gRenderbufferMap = AllocateZeroedUints(maxRenderbuffer); >+ gSamplerMap = AllocateZeroedUints(maxSampler); >+ gSemaphoreMap = AllocateZeroedUints(maxSemaphore); >+ gShaderProgramMap = AllocateZeroedUints(maxShaderProgram); >+ gTextureMap = AllocateZeroedUints(maxTexture); >+ gTransformFeedbackMap = AllocateZeroedUints(maxTransformFeedback); >+ gVertexArrayMap = AllocateZeroedUints(maxVertexArray); > >-void InitializeReplay2(const char *binaryDataFileName, >- size_t maxClientArraySize, >- size_t readBufferSize, >- uint32_t maxBuffer, >- uint32_t maxFenceNV, >- uint32_t maxFramebuffer, >- uint32_t maxMemoryObject, >- uint32_t maxProgramPipeline, >- uint32_t maxQuery, >- uint32_t maxRenderbuffer, >- uint32_t maxSampler, >- uint32_t maxSemaphore, >- uint32_t maxShaderProgram, >- uint32_t maxTexture, >- uint32_t maxTransformFeedback, >- uint32_t maxVertexArray) >-{ >- InitializeReplay(binaryDataFileName, maxClientArraySize, readBufferSize); >- >- gBufferMap2 = AllocateZeroedUints(maxBuffer); >- gFenceNVMap2 = AllocateZeroedUints(maxFenceNV); >- gFramebufferMap2 = AllocateZeroedUints(maxFramebuffer); >- gMemoryObjectMap2 = AllocateZeroedUints(maxMemoryObject); >- gProgramPipelineMap2 = AllocateZeroedUints(maxProgramPipeline); >- gQueryMap2 = AllocateZeroedUints(maxQuery); >- gRenderbufferMap2 = AllocateZeroedUints(maxRenderbuffer); >- gSamplerMap2 = AllocateZeroedUints(maxSampler); >- gSemaphoreMap2 = AllocateZeroedUints(maxSemaphore); >- gShaderProgramMap2 = AllocateZeroedUints(maxShaderProgram); >- gTextureMap2 = AllocateZeroedUints(maxTexture); >- gTransformFeedbackMap2 = AllocateZeroedUints(maxTransformFeedback); >- gVertexArrayMap2 = AllocateZeroedUints(maxVertexArray); >- >- gUniformLocations2 = new GLint *[maxShaderProgram + 1]; >- memset(gUniformLocations2, 0, sizeof(GLint *) * (maxShaderProgram + 1)); >+ gUniformLocations = new GLint *[maxShaderProgram + 1]; >+ memset(gUniformLocations, 0, sizeof(GLint *) * (maxShaderProgram + 1)); > } > > void FinishReplay() >@@ -240,19 +195,19 @@ void FinishReplay() > } > delete[] gReadBuffer; > >- delete[] gBufferMap2; >- delete[] gRenderbufferMap2; >- delete[] gTextureMap2; >- delete[] gFramebufferMap2; >- delete[] gShaderProgramMap2; >- delete[] gFenceNVMap2; >- delete[] gMemoryObjectMap2; >- delete[] gProgramPipelineMap2; >- delete[] gQueryMap2; >- delete[] gSamplerMap2; >- delete[] gSemaphoreMap2; >- delete[] gTransformFeedbackMap2; >- delete[] gVertexArrayMap2; >+ delete[] gBufferMap; >+ delete[] gRenderbufferMap; >+ delete[] gTextureMap; >+ delete[] gFramebufferMap; >+ delete[] gShaderProgramMap; >+ delete[] gFenceNVMap; >+ delete[] gMemoryObjectMap; >+ delete[] gProgramPipelineMap; >+ delete[] gQueryMap; >+ delete[] gSamplerMap; >+ delete[] gSemaphoreMap; >+ delete[] gTransformFeedbackMap; >+ delete[] gVertexArrayMap; > } > > void SetValidateSerializedStateCallback(ValidateSerializedStateCallback callback) >@@ -271,148 +226,78 @@ void UpdateClientBufferData(GLuint bufferID, const void *source, GLsizei size) > memcpy(gMappedBufferData[gBufferMap[bufferID]], source, size); > } > >-void UpdateClientBufferData2(GLuint bufferID, const void *source, GLsizei size) >+void UpdateClientBufferDataWithOffset(GLuint bufferID, >+ const void *source, >+ GLsizei size, >+ GLsizei offset) > { >- memcpy(gMappedBufferData[gBufferMap2[bufferID]], source, size); >-} >- >-void UpdateClientBufferData2WithOffset(GLuint bufferID, >- const void *source, >- GLsizei size, >- GLsizei offset) >-{ >- uintptr_t dest = reinterpret_cast<uintptr_t>(gMappedBufferData[gBufferMap2[bufferID]]) + offset; >+ uintptr_t dest = reinterpret_cast<uintptr_t>(gMappedBufferData[gBufferMap[bufferID]]) + offset; > memcpy(reinterpret_cast<void *>(dest), source, size); > } > > void UpdateBufferID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gBufferMap, id, readBufferOffset); >+ UpdateResourceMap(gBufferMap, id, readBufferOffset); > } > > void UpdateFenceNVID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gFenceNVMap, id, readBufferOffset); >+ UpdateResourceMap(gFenceNVMap, id, readBufferOffset); > } > > void UpdateFramebufferID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gFramebufferMap, id, readBufferOffset); >+ UpdateResourceMap(gFramebufferMap, id, readBufferOffset); > } > > void UpdateMemoryObjectID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gMemoryObjectMap, id, readBufferOffset); >+ UpdateResourceMap(gMemoryObjectMap, id, readBufferOffset); > } > > void UpdateProgramPipelineID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gProgramPipelineMap, id, readBufferOffset); >+ UpdateResourceMap(gProgramPipelineMap, id, readBufferOffset); > } > > void UpdateQueryID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gQueryMap, id, readBufferOffset); >+ UpdateResourceMap(gQueryMap, id, readBufferOffset); > } > > void UpdateRenderbufferID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gRenderbufferMap, id, readBufferOffset); >+ UpdateResourceMap(gRenderbufferMap, id, readBufferOffset); > } > > void UpdateSamplerID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gSamplerMap, id, readBufferOffset); >+ UpdateResourceMap(gSamplerMap, id, readBufferOffset); > } > > void UpdateSemaphoreID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gSemaphoreMap, id, readBufferOffset); >+ UpdateResourceMap(gSemaphoreMap, id, readBufferOffset); > } > > void UpdateShaderProgramID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gShaderProgramMap, id, readBufferOffset); >+ UpdateResourceMap(gShaderProgramMap, id, readBufferOffset); > } > > void UpdateTextureID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gTextureMap, id, readBufferOffset); >+ UpdateResourceMap(gTextureMap, id, readBufferOffset); > } > > void UpdateTransformFeedbackID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gTransformFeedbackMap, id, readBufferOffset); >+ UpdateResourceMap(gTransformFeedbackMap, id, readBufferOffset); > } > > void UpdateVertexArrayID(GLuint id, GLsizei readBufferOffset) > { >- UpdateResourceMap(&gVertexArrayMap, id, readBufferOffset); >-} >- >-void UpdateBufferID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gBufferMap2, id, readBufferOffset); >-} >- >-void UpdateFenceNVID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gFenceNVMap2, id, readBufferOffset); >-} >- >-void UpdateFramebufferID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gFramebufferMap2, id, readBufferOffset); >-} >- >-void UpdateMemoryObjectID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gMemoryObjectMap2, id, readBufferOffset); >-} >- >-void UpdateProgramPipelineID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gProgramPipelineMap2, id, readBufferOffset); >-} >- >-void UpdateQueryID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gQueryMap2, id, readBufferOffset); >-} >- >-void UpdateRenderbufferID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gRenderbufferMap2, id, readBufferOffset); >-} >- >-void UpdateSamplerID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gSamplerMap2, id, readBufferOffset); >-} >- >-void UpdateSemaphoreID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gSemaphoreMap2, id, readBufferOffset); >-} >- >-void UpdateShaderProgramID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gShaderProgramMap2, id, readBufferOffset); >-} >- >-void UpdateTextureID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gTextureMap2, id, readBufferOffset); >-} >- >-void UpdateTransformFeedbackID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gTransformFeedbackMap2, id, readBufferOffset); >-} >- >-void UpdateVertexArrayID2(GLuint id, GLsizei readBufferOffset) >-{ >- UpdateResourceMap2(gVertexArrayMap2, id, readBufferOffset); >+ UpdateResourceMap(gVertexArrayMap, id, readBufferOffset); > } > > void SetResourceID(GLuint *map, GLuint id) >@@ -427,7 +312,7 @@ void SetResourceID(GLuint *map, GLuint id) > > void SetFramebufferID(GLuint id) > { >- SetResourceID(gFramebufferMap2, id); >+ SetResourceID(gFramebufferMap, id); > } > > void ValidateSerializedState(const char *serializedState, const char *fileName, uint32_t line) >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.h b/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.h >index 49d0c5bbb74ba7c7cb6446c23db425e29ebb4eb5..41c18fa74766449a47ed55a0329288bbe624c584 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/capture/trace_fixture.h >@@ -52,56 +52,31 @@ ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex); > } // extern "C" > > // Maps from <captured Program ID, captured location> to run-time location. >-using LocationsMap = std::unordered_map<GLuint, std::unordered_map<GLint, GLint>>; >-extern LocationsMap gUniformLocations; >-extern GLint **gUniformLocations2; >+extern GLint **gUniformLocations; > using BlockIndexesMap = std::unordered_map<GLuint, std::unordered_map<GLuint, GLuint>>; > extern BlockIndexesMap gUniformBlockIndexes; > extern GLuint gCurrentProgram; >-void UpdateUniformLocation(GLuint program, const char *name, GLint location); > void UpdateUniformLocation(GLuint program, const char *name, GLint location, GLint count); >-void UpdateUniformLocation2(GLuint program, const char *name, GLint location, GLint count); > void DeleteUniformLocations(GLuint program); >-void DeleteUniformLocations2(GLuint program); > void UpdateUniformBlockIndex(GLuint program, const char *name, GLuint index); > void UpdateCurrentProgram(GLuint program); > >-// Maps from captured Resource ID to run-time Resource ID. >-class ResourceMap >-{ >- public: >- ResourceMap() {} >- GLuint &operator[](GLuint index) >- { >- if (mIDs.size() <= static_cast<size_t>(index)) >- mIDs.resize(index + 1, 0); >- return mIDs[index]; >- } >- >- private: >- std::vector<GLuint> mIDs; >-}; >- > void InitializeReplay(const char *binaryDataFileName, > size_t maxClientArraySize, >- size_t readBufferSize); >- >-void InitializeReplay2(const char *binaryDataFileName, >- size_t maxClientArraySize, >- size_t readBufferSize, >- uint32_t maxBuffer, >- uint32_t maxFenceNV, >- uint32_t maxFramebuffer, >- uint32_t maxMemoryObject, >- uint32_t maxProgramPipeline, >- uint32_t maxQuery, >- uint32_t maxRenderbuffer, >- uint32_t maxSampler, >- uint32_t maxSemaphore, >- uint32_t maxShaderProgram, >- uint32_t maxTexture, >- uint32_t maxTransformFeedback, >- uint32_t maxVertexArray); >+ size_t readBufferSize, >+ uint32_t maxBuffer, >+ uint32_t maxFenceNV, >+ uint32_t maxFramebuffer, >+ uint32_t maxMemoryObject, >+ uint32_t maxProgramPipeline, >+ uint32_t maxQuery, >+ uint32_t maxRenderbuffer, >+ uint32_t maxSampler, >+ uint32_t maxSemaphore, >+ uint32_t maxShaderProgram, >+ uint32_t maxTexture, >+ uint32_t maxTransformFeedback, >+ uint32_t maxVertexArray); > > // Global state > >@@ -110,33 +85,20 @@ constexpr size_t kMaxClientArrays = 16; > extern uint8_t *gBinaryData; > extern uint8_t *gReadBuffer; > extern uint8_t *gClientArrays[kMaxClientArrays]; >-extern ResourceMap gBufferMap; >-extern ResourceMap gFenceNVMap; >-extern ResourceMap gFramebufferMap; >-extern ResourceMap gMemoryObjectMap; >-extern ResourceMap gProgramPipelineMap; >-extern ResourceMap gQueryMap; >-extern ResourceMap gRenderbufferMap; >-extern ResourceMap gSamplerMap; >-extern ResourceMap gSemaphoreMap; >-extern ResourceMap gShaderProgramMap; >-extern ResourceMap gTextureMap; >-extern ResourceMap gTransformFeedbackMap; >-extern ResourceMap gVertexArrayMap; >- >-extern GLuint *gBufferMap2; >-extern GLuint *gFenceNVMap2; >-extern GLuint *gFramebufferMap2; >-extern GLuint *gMemoryObjectMap2; >-extern GLuint *gProgramPipelineMap2; >-extern GLuint *gQueryMap2; >-extern GLuint *gRenderbufferMap2; >-extern GLuint *gSamplerMap2; >-extern GLuint *gSemaphoreMap2; >-extern GLuint *gShaderProgramMap2; >-extern GLuint *gTextureMap2; >-extern GLuint *gTransformFeedbackMap2; >-extern GLuint *gVertexArrayMap2; >+ >+extern GLuint *gBufferMap; >+extern GLuint *gFenceNVMap; >+extern GLuint *gFramebufferMap; >+extern GLuint *gMemoryObjectMap; >+extern GLuint *gProgramPipelineMap; >+extern GLuint *gQueryMap; >+extern GLuint *gRenderbufferMap; >+extern GLuint *gSamplerMap; >+extern GLuint *gSemaphoreMap; >+extern GLuint *gShaderProgramMap; >+extern GLuint *gTextureMap; >+extern GLuint *gTransformFeedbackMap; >+extern GLuint *gVertexArrayMap; > > // TODO(http://www.anglebug.com/5878): avoid std::unordered_map, it's slow > using SyncResourceMap = std::unordered_map<uintptr_t, GLsync>; >@@ -148,11 +110,10 @@ void UpdateClientArrayPointer(int arrayIndex, const void *data, uint64_t size); > using BufferHandleMap = std::unordered_map<GLuint, void *>; > extern BufferHandleMap gMappedBufferData; > void UpdateClientBufferData(GLuint bufferID, const void *source, GLsizei size); >-void UpdateClientBufferData2(GLuint bufferID, const void *source, GLsizei size); >-void UpdateClientBufferData2WithOffset(GLuint bufferID, >- const void *source, >- GLsizei size, >- GLsizei offset); >+void UpdateClientBufferDataWithOffset(GLuint bufferID, >+ const void *source, >+ GLsizei size, >+ GLsizei offset); > void UpdateBufferID(GLuint id, GLsizei readBufferOffset); > void UpdateFenceNVID(GLuint id, GLsizei readBufferOffset); > void UpdateFramebufferID(GLuint id, GLsizei readBufferOffset); >@@ -167,18 +128,6 @@ void UpdateTextureID(GLuint id, GLsizei readBufferOffset); > void UpdateTransformFeedbackID(GLuint id, GLsizei readBufferOffset); > void UpdateVertexArrayID(GLuint id, GLsizei readBufferOffset); > void UpdateBufferID2(GLuint id, GLsizei readBufferOffset); >-void UpdateFenceNVID2(GLuint id, GLsizei readBufferOffset); >-void UpdateFramebufferID2(GLuint id, GLsizei readBufferOffset); >-void UpdateMemoryObjectID2(GLuint id, GLsizei readBufferOffset); >-void UpdateProgramPipelineID2(GLuint id, GLsizei readBufferOffset); >-void UpdateQueryID2(GLuint id, GLsizei readBufferOffset); >-void UpdateRenderbufferID2(GLuint id, GLsizei readBufferOffset); >-void UpdateSamplerID2(GLuint id, GLsizei readBufferOffset); >-void UpdateSemaphoreID2(GLuint id, GLsizei readBufferOffset); >-void UpdateShaderProgramID2(GLuint id, GLsizei readBufferOffset); >-void UpdateTextureID2(GLuint id, GLsizei readBufferOffset); >-void UpdateTransformFeedbackID2(GLuint id, GLsizei readBufferOffset); >-void UpdateVertexArrayID2(GLuint id, GLsizei readBufferOffset); > > void SetFramebufferID(GLuint id); > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp >index 056843a2f9b85fa8b03fca81d232dab38706e22b..939e7ce4dc7a6a74d2d9ae60553d107ead780365 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/formatutils.cpp >@@ -1084,7 +1084,7 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap() > AddRGBAFormat(&map, GL_BGR10_A2_ANGLEX, true, 10, 10, 10, 2, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported, NeverSupported, NeverSupported); > > // Special format to emulate RGB8 with RGBA8 within ANGLE. >- AddRGBAFormat(&map, GL_RGBX8_ANGLE, true, 8, 8, 8, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, AlwaysSupported, NeverSupported, AlwaysSupported, AlwaysSupported, NeverSupported); >+ AddRGBAFormat(&map, GL_RGBX8_ANGLE, true, 8, 8, 8, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, AlwaysSupported, AlwaysSupported, AlwaysSupported, AlwaysSupported, NeverSupported); > > // This format is supported on ES 2.0 with two extensions, so keep it out-of-line to not widen the table above even more. > // | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer | Blend >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/gen_extensions.py b/Source/ThirdParty/ANGLE/src/libANGLE/gen_extensions.py >index 9d9b0966c77b8c2dc673df9cbb2ea3ed6060734f..cc9a0f9ab8eb8d012ad39359031660da5e937344 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/gen_extensions.py >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/gen_extensions.py >@@ -229,31 +229,33 @@ list of supported EGL extensions in ANGLE's front-end see > Supported extension data is stored in the ANGLE repo as JSON files in > [`scripts/extension_data`](../scripts/extension_data). The JSON data is > sourced from public ANGLE test runs. Look for `angle_end2end_tests` in a bot >-run: [example link](https://ci.chromium.org/ui/p/angle/builders/ci/win-clang-x64-rel/8183/overview). >+run: [example link](https://ci.chromium.org/ui/p/angle/builders/ci/win-test/520/overview). > Search for "`angle_end2end_tests`", then click on the "cas output" and find >-`GLinfo_ES3_2_Vulkan.json`. >+`GLinfo_ES3_2_Vulkan.json` or `GLinfo_ES3_1_Vulkan_SwiftShader.json` for >+SwiftShader. > >-The Pixel 4 and GLES 3 NVIDIA and Intel data is automatically updated using >+All data except for GLES 1 is automatically updated using > the [`update_extension_data.py`](../scripts/update_extension_data.py) script. > To use it first authenticate to the `bb` and `luci-go` tools by running `bb > auth-login` and `./tools/luci-go/swarming login`. Then run the script and > re-run [code generation][CodeGen]. > >-The GLES 1 and SwiftShader data is currently manually updated. Find the relevant >+The GLES 1 data is currently manually updated. Find the relevant > file from the task output (see above) and overwrite the correspoding file. > Re-run [code generation][CodeGen] and create a CL as per our normal process. > > To add a new configuration, first retrieve the JSON data, modify > [`gen_extensions.py`](../src/libANGLE/gen_extensions.py) as necessary, then > run [`scripts/run_code_generation.py`][CodeGen] to refresh generated files. >+Also update `update_extension_data.py` as necessary. > > [CodeGen]: ../scripts/run_code_generation.py > """ > > _MD_GLES_GPU_CONFIGS = [ >- 'NVIDIA P400 Win10', >+ 'NVIDIA 1660 Win10', > 'Intel 630 Win10', >- 'NVIDIA P400 Linux', >+ 'NVIDIA 1660 Linux', > 'Intel 630 Linux', > 'SwiftShader Win10', > 'Pixel 4 Android 11', >@@ -344,9 +346,9 @@ def sort_by_ext_name(ext_infos): > def get_ext_support(ext_name, gpu_data): > > def s(ext, support): >- CHECKMARK = '✔' >- CROSS = '❌' >- return CHECKMARK if ext in support['Extensions'] else CROSS >+ SUPPORT_SYM = '✔' >+ NOSUPPORT_SYM = '' >+ return SUPPORT_SYM if ext in support['Extensions'] else NOSUPPORT_SYM > > return ' | '.join([s(ext_name, support) for support in gpu_data]) > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/gen_overlay_fonts.py b/Source/ThirdParty/ANGLE/src/libANGLE/gen_overlay_fonts.py >index ee0d9b0df2423686551ad9cfc2404cabdb14a211..d6fff7a0fb49e4946f788f0da2e6c548f5d1549c 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/gen_overlay_fonts.py >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/gen_overlay_fonts.py >@@ -3,7 +3,7 @@ > # [VPYTHON:BEGIN] > # wheel: < > # name: "infra/python/wheels/freetype-py/${vpython_platform}" >-# version: "version:2.1.0.post1" >+# version: "version:2.2.0.chromium.4" > # > > # [VPYTHON:END] > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.cpp >index 12bff9bde8ee0d178401b3e75a265b0dd041f11f..5ae29ecbace8c76fa3668f94511ebce423346840 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.cpp >@@ -87,6 +87,7 @@ const ExtensionInfoMap &GetExtensionInfoMap() > map["GL_NV_EGL_stream_consumer_external"] = enableableExtension(&Extensions::EGLStreamConsumerExternalNV); > map["GL_OES_EGL_sync"] = esOnlyExtension(&Extensions::EGLSyncOES); > map["GL_OES_element_index_uint"] = enableableExtension(&Extensions::elementIndexUintOES); >+ map["GL_ANDROID_extension_pack_es31a"] = esOnlyExtension(&Extensions::extensionPackEs31aANDROID); > map["GL_EXT_external_buffer"] = enableableExtension(&Extensions::externalBufferEXT); > map["GL_OES_fbo_render_mipmap"] = enableableExtension(&Extensions::fboRenderMipmapOES); > map["GL_NV_fence"] = esOnlyExtension(&Extensions::fenceNV); >@@ -133,6 +134,7 @@ const ExtensionInfoMap &GetExtensionInfoMap() > map["GL_EXT_semaphore"] = enableableExtension(&Extensions::semaphoreEXT); > map["GL_EXT_semaphore_fd"] = enableableExtension(&Extensions::semaphoreFdEXT); > map["GL_EXT_separate_shader_objects"] = enableableExtension(&Extensions::separateShaderObjectsEXT); >+ map["GL_EXT_shader_framebuffer_fetch"] = enableableExtension(&Extensions::shaderFramebufferFetchEXT); > map["GL_EXT_shader_framebuffer_fetch_non_coherent"] = enableableExtension(&Extensions::shaderFramebufferFetchNonCoherentEXT); > map["GL_OES_shader_image_atomic"] = enableableExtension(&Extensions::shaderImageAtomicOES); > map["GL_EXT_shader_io_blocks"] = enableableExtension(&Extensions::shaderIoBlocksEXT); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.h b/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.h >index 77d272d9146250759d5c519691f64ba6c96b3aee..1c526c7c61376654a79616b62d9fece8f4109181 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/gles_extensions_autogen.h >@@ -214,6 +214,9 @@ struct Extensions > // GL_OES_element_index_uint > bool elementIndexUintOES = false; > >+ // GL_ANDROID_extension_pack_es31a >+ bool extensionPackEs31aANDROID = false; >+ > // GL_EXT_external_buffer > bool externalBufferEXT = false; > >@@ -352,6 +355,9 @@ struct Extensions > // GL_EXT_separate_shader_objects > bool separateShaderObjectsEXT = false; > >+ // GL_EXT_shader_framebuffer_fetch >+ bool shaderFramebufferFetchEXT = false; >+ > // GL_EXT_shader_framebuffer_fetch_non_coherent > bool shaderFramebufferFetchNonCoherentEXT = false; > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/queryutils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/queryutils.cpp >index 1a6c8d77de68baa09dfacc77a50d6f08f6f12b12..82a9621e9e88cab8c518461b15c3ec70c1721711 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/queryutils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/queryutils.cpp >@@ -1119,6 +1119,21 @@ bool IsTextureEnvEnumParameter(TextureEnvParameter pname) > } > } > >+void GetShaderProgramId(ProgramPipeline *programPipeline, ShaderType shaderType, GLint *params) >+{ >+ ASSERT(params); >+ >+ *params = 0; >+ if (programPipeline) >+ { >+ const Program *program = programPipeline->getShaderProgram(shaderType); >+ if (program) >+ { >+ *params = program->id().value; >+ } >+ } >+} >+ > } // namespace > > void QueryFramebufferAttachmentParameteriv(const Context *context, >@@ -1690,6 +1705,9 @@ void QueryFramebufferParameteriv(const Framebuffer *framebuffer, GLenum pname, G > case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT: > *params = framebuffer->getDefaultLayers(); > break; >+ case GL_FRAMEBUFFER_FLIP_Y_MESA: >+ *params = ConvertToGLBoolean(framebuffer->getFlipY()); >+ break; > default: > UNREACHABLE(); > break; >@@ -1844,6 +1862,9 @@ void SetFramebufferParameteri(const Context *context, > case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT: > framebuffer->setDefaultLayers(param); > break; >+ case GL_FRAMEBUFFER_FLIP_Y_MESA: >+ framebuffer->setFlipY(ConvertToBool(param)); >+ break; > default: > UNREACHABLE(); > break; >@@ -3050,6 +3071,7 @@ bool GetQueryParameterInfo(const State &glState, > const Caps &caps = glState.getCaps(); > const Extensions &extensions = glState.getExtensions(); > GLint clientMajorVersion = glState.getClientMajorVersion(); >+ EGLenum clientType = glState.getClientType(); > > // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation > // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due >@@ -3316,11 +3338,24 @@ bool GetQueryParameterInfo(const State &glState, > return true; > } > >- if (glState.getClientType() == EGL_OPENGL_API) >+ if (clientType == EGL_OPENGL_API || >+ (clientType == EGL_OPENGL_ES_API && glState.getClientVersion() >= Version(3, 2))) > { > switch (pname) > { > case GL_CONTEXT_FLAGS: >+ { >+ *type = GL_INT; >+ *numParams = 1; >+ return true; >+ } >+ } >+ } >+ >+ if (clientType == EGL_OPENGL_API) >+ { >+ switch (pname) >+ { > case GL_CONTEXT_PROFILE_MASK: > { > *type = GL_INT; >@@ -3951,15 +3986,7 @@ void QueryProgramPipelineiv(const Context *context, > { > // the name of the current program object for the vertex shader type of the program > // pipeline object is returned in params >- *params = 0; >- if (programPipeline) >- { >- const Program *program = programPipeline->getShaderProgram(ShaderType::Vertex); >- if (program) >- { >- *params = program->id().value; >- } >- } >+ GetShaderProgramId(programPipeline, ShaderType::Vertex, params); > break; > } > >@@ -3967,15 +3994,23 @@ void QueryProgramPipelineiv(const Context *context, > { > // the name of the current program object for the fragment shader type of the program > // pipeline object is returned in params >- *params = 0; >- if (programPipeline) >- { >- const Program *program = programPipeline->getShaderProgram(ShaderType::Fragment); >- if (program) >- { >- *params = program->id().value; >- } >- } >+ GetShaderProgramId(programPipeline, ShaderType::Fragment, params); >+ break; >+ } >+ >+ case GL_TESS_CONTROL_SHADER: >+ { >+ // the name of the current program object for the tessellation control shader type of >+ // the program pipeline object is returned in params >+ GetShaderProgramId(programPipeline, ShaderType::TessControl, params); >+ break; >+ } >+ >+ case GL_TESS_EVALUATION_SHADER: >+ { >+ // the name of the current program object for the tessellation evaluation shader type of >+ // the program pipeline object is returned in params >+ GetShaderProgramId(programPipeline, ShaderType::TessEvaluation, params); > break; > } > >@@ -3983,15 +4018,15 @@ void QueryProgramPipelineiv(const Context *context, > { > // the name of the current program object for the compute shader type of the program > // pipeline object is returned in params >- *params = 0; >- if (programPipeline) >- { >- const Program *program = programPipeline->getShaderProgram(ShaderType::Compute); >- if (program) >- { >- *params = program->id().value; >- } >- } >+ GetShaderProgramId(programPipeline, ShaderType::Compute, params); >+ break; >+ } >+ >+ case GL_GEOMETRY_SHADER: >+ { >+ // the name of the current program object for the geometry shader type of the program >+ // pipeline object is returned in params >+ GetShaderProgramId(programPipeline, ShaderType::Geometry, params); > break; > } > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramPipelineImpl.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramPipelineImpl.h >index 788fa82906d6681c9cfa164eaad3dad919dc2e97..755ff7b35687e7fd03d694bf3997bbdf577c2504 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramPipelineImpl.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ProgramPipelineImpl.h >@@ -27,6 +27,8 @@ class ProgramPipelineImpl : public angle::NonCopyable > const gl::ProgramMergedVaryings &mergedVaryings, > const gl::ProgramVaryingPacking &varyingPacking); > >+ virtual void onProgramUniformUpdate(gl::ShaderType shaderType) {} >+ > const gl::ProgramPipelineState &getState() const { return mState; } > > protected: >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.cpp >index ab544c4207bd5dfb41e4d4525383d2c9e8e977db..6155511789a18fc2171edcbcff159463a47f7f7b 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderImpl.cpp >@@ -89,7 +89,7 @@ std::shared_ptr<WaitableCompileEvent> ShaderImpl::compileImpl( > compileOptions |= SH_VALIDATE_AST; > #endif > >- auto workerThreadPool = context->getWorkerThreadPool(); >+ auto workerThreadPool = context->getShaderCompileThreadPool(); > auto translateTask = > std::make_shared<TranslateTask>(compilerInstance->getHandle(), compileOptions, source); > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp >index 801e604e8a6bd2c1a9ae68da478019cda03fc158..7352f4c8047c3a242833e972cfe4f10dd15457e2 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.cpp >@@ -11,8 +11,6 @@ > namespace rx > { > >-const uint32_t ShaderInterfaceVariableInfo::kInvalid; >- > ShaderInterfaceVariableInfo::ShaderInterfaceVariableInfo() {} > > // ShaderInterfaceVariableInfoMap implementation. >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h >index 851985aa906bb3c5958060e93cc2c9205d385bb1..0040333d4e473f824180b7bd7336649163186d80 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/ShaderInterfaceVariableInfoMap.h >@@ -4,9 +4,10 @@ > // found in the LICENSE file. > // > // Header for the shared ShaderInterfaceVariableInfoMap class, used by both the >-// Metal and Direct Metal backends. >-#ifndef ShaderInterfaceVariableInfoMap_hpp >-#define ShaderInterfaceVariableInfoMap_hpp >+// Direct-to-Metal and Metal-SPIRV backends >+ >+#ifndef LIBANGLE_RENDERER_SHADERINTERFACEVARIABLEINFOMAP_H_ >+#define LIBANGLE_RENDERER_SHADERINTERFACEVARIABLEINFOMAP_H_ > > #include <functional> > >@@ -60,4 +61,4 @@ class ShaderInterfaceVariableInfoMap final : angle::NonCopyable > }; > > } // namespace rx >-#endif /* ShaderInterfaceVariableInfoMap_hpp */ >+#endif // LIBANGLE_RENDERER_SHADERINTERFACEVARIABLEINFOMAP_H_ >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.cpp >index b7ca04d3a76b0dd6082701bb404a671da452cb53..573475a4759f5520edaec0609f81dad0a7039d4a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.cpp >@@ -25,6 +25,11 @@ egl::Error SurfaceImpl::unMakeCurrent(const gl::Context *context) > return egl::NoError(); > } > >+egl::Error SurfaceImpl::prepareSwap(const gl::Context *) >+{ >+ return angle::ResultToEGL(angle::Result::Continue); >+} >+ > egl::Error SurfaceImpl::swapWithDamage(const gl::Context *context, > const EGLint *rects, > EGLint n_rects) >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h >index 0584410f0a99248a8e3dd249062365cf0e883776..8258afb8c7f1012b949d6a76273eb0b5f674aa11 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/SurfaceImpl.h >@@ -55,6 +55,7 @@ class SurfaceImpl : public FramebufferAttachmentObjectImpl > const gl::FramebufferState &state) = 0; > virtual egl::Error makeCurrent(const gl::Context *context); > virtual egl::Error unMakeCurrent(const gl::Context *context); >+ virtual egl::Error prepareSwap(const gl::Context *); > virtual egl::Error swap(const gl::Context *context) = 0; > virtual egl::Error swapWithDamage(const gl::Context *context, > const EGLint *rects, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/angle_format.py b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/angle_format.py >index b6b4170f42ae37c5c7678a6d3c5ffca77496ef4c..9a6579499f7ad6afb54ceb6fa8da1b9e678174c1 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/angle_format.py >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/angle_format.py >@@ -149,7 +149,7 @@ def gl_format_channels(internal_format): > if (internal_format.find('ALPHA') >= 0): > return 'la' > return 'l' >- if channels_string == 'SRGB': >+ if channels_string == 'SRGB' or channels_string == 'RGB': > if (internal_format.find('ALPHA') >= 0): > return 'rgba' > return 'rgb' >@@ -167,6 +167,11 @@ def get_internal_format_initializer(internal_format, format_id): > gl_format_no_alpha = gl_channels == 'rgb' or gl_channels == 'l' > component_type, bits, channels = get_format_info(format_id) > >+ # ETC2 punchthrough formats have per-pixel alpha values but a zero-filled block is parsed as opaque black. >+ # Ensure correct initialization when the formats are emulated. >+ if 'PUNCHTHROUGH_ALPHA1_ETC2' in internal_format and 'ETC2' not in format_id: >+ return 'Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>' >+ > if not gl_format_no_alpha or channels != 'rgba': > return 'nullptr' > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp >index 126afc128705dc9341e766aa0a31aadb0f31805c..cbeb0360c216f66de3f4a5e5060e6c62ce704268 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp >@@ -699,10 +699,16 @@ HRESULT Renderer11::callD3D11CreateDevice(PFN_D3D11_CREATE_DEVICE createDevice, > angle::ComPtr<IDXGIAdapter> adapter; > > const egl::AttributeMap &attributes = mDisplay->getAttributeMap(); >+ // Check EGL_ANGLE_platform_angle_d3d_luid > long high = static_cast<long>(attributes.get(EGL_PLATFORM_ANGLE_D3D_LUID_HIGH_ANGLE, 0)); > unsigned long low = > static_cast<unsigned long>(attributes.get(EGL_PLATFORM_ANGLE_D3D_LUID_LOW_ANGLE, 0)); >- >+ // Check EGL_ANGLE_platform_angle_device_id >+ if (high == 0 && low == 0) >+ { >+ high = static_cast<long>(attributes.get(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE, 0)); >+ low = static_cast<unsigned long>(attributes.get(EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE, 0)); >+ } > if (high != 0 || low != 0) > { > angle::ComPtr<IDXGIFactory1> factory; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp >index a7e6907691babef6d800f013061338fb8ed601a1..fd848f083071eb3380db3efc02c4bbed5864f64d 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp >@@ -1671,6 +1671,9 @@ void GenerateCaps(ID3D11Device *device, > // GL_EXT_clip_control > extensions->clipControlEXT = (renderer11DeviceCaps.featureLevel >= D3D_FEATURE_LEVEL_9_3); > >+ // GL_KHR_parallel_shader_compile >+ extensions->parallelShaderCompileKHR = true; >+ > // D3D11 Feature Level 10_0+ uses SV_IsFrontFace in HLSL to emulate gl_FrontFacing. > // D3D11 Feature Level 9_3 doesn't support SV_IsFrontFace, and has no equivalent, so can't > // support gl_FrontFacing. >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp >index f7343b1f699b9fcb706f1bcc0854712621de5df5..badbb8f871630b0ea3f52b50f788a7e71f749db6 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp >@@ -1285,7 +1285,7 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev > DXGI_FORMAT_UNKNOWN, > DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, > GL_SRGB8_ALPHA8, >- nullptr); >+ Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>); > return info; > } > case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE: >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp >index 49f8675a7dbe512d36c6da8e41f6f5dd2734abe9..f399ad3f7c8b768fba77347f6c8150522e483a04 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp >@@ -682,6 +682,9 @@ void GenerateCaps(IDirect3D9 *d3d9, > // textureRgEXT is emulated and not performant. > extensions->textureRgEXT = false; > >+ // GL_KHR_parallel_shader_compile >+ extensions->parallelShaderCompileKHR = true; >+ > D3DADAPTER_IDENTIFIER9 adapterId = {}; > if (SUCCEEDED(d3d9->GetAdapterIdentifier(adapter, 0, &adapterId))) > { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.cpp >index bd9753a1381278344e29f2987f9bc391d3e284b4..6e5097653d36cfba64307132e43589f50c41f8d3 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.cpp >@@ -146,8 +146,6 @@ const char *GetVendorString(uint32_t vendorId) > return "ARM"; > case VENDOR_ID_APPLE: > return "Apple"; >- case VENDOR_ID_MICROSOFT: >- return "Microsoft"; > case VENDOR_ID_BROADCOM: > return "Broadcom"; > case VENDOR_ID_GOOGLE: >@@ -156,6 +154,8 @@ const char *GetVendorString(uint32_t vendorId) > return "Intel"; > case VENDOR_ID_MESA: > return "Mesa"; >+ case VENDOR_ID_MICROSOFT: >+ return "Microsoft"; > case VENDOR_ID_NVIDIA: > return "NVIDIA"; > case VENDOR_ID_POWERVR: >@@ -163,7 +163,7 @@ const char *GetVendorString(uint32_t vendorId) > case VENDOR_ID_QUALCOMM: > return "Qualcomm"; > case VENDOR_ID_SAMSUNG: >- return "Samsung"; >+ return "Samsung Electronics Co., Ltd."; > case VENDOR_ID_VMWARE: > return "VMware"; > case VENDOR_ID_VIVANTE: >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.h >index 40629e5d347175413240994b3cd35d55efcbc9ab..8bc114ca16ecef980b646440a4208fac5e4bd1a1 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/driver_utils.h >@@ -23,12 +23,13 @@ enum VendorID : uint32_t > VENDOR_ID_ARM = 0x13B5, > VENDOR_ID_MICROSOFT = 0x1414, > // Broadcom devices won't use PCI, but this is their Vulkan vendor id. >- VENDOR_ID_BROADCOM = 0x14E4, >- VENDOR_ID_GOOGLE = 0x1AE0, >- VENDOR_ID_INTEL = 0x8086, >- VENDOR_ID_MESA = 0x10005, >- VENDOR_ID_NVIDIA = 0x10DE, >- VENDOR_ID_POWERVR = 0x1010, >+ VENDOR_ID_BROADCOM = 0x14E4, >+ VENDOR_ID_GOOGLE = 0x1AE0, >+ VENDOR_ID_INTEL = 0x8086, >+ VENDOR_ID_MESA = 0x10005, >+ VENDOR_ID_MICROSOFT = 0x1414, >+ VENDOR_ID_NVIDIA = 0x10DE, >+ VENDOR_ID_POWERVR = 0x1010, > // This is Qualcomm PCI Vendor ID. > // Android doesn't have a PCI bus, but all we need is a unique id. > VENDOR_ID_QUALCOMM = 0x5143, >@@ -77,6 +78,11 @@ inline bool IsGoogle(uint32_t vendorId) > return vendorId == VENDOR_ID_GOOGLE; > } > >+inline bool IsMicrosoft(uint32_t vendorId) >+{ >+ return vendorId == VENDOR_ID_MICROSOFT; >+} >+ > inline bool IsNvidia(uint32_t vendorId) > { > return vendorId == VENDOR_ID_NVIDIA; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp >index 3cd8853d130149b1bb8c105bd5d435077149af27..eecb2b0901aa8e9c8d9fcb5bb1ae44e7fc42f74d 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/FramebufferGL.cpp >@@ -1315,6 +1315,10 @@ angle::Result FramebufferGL::syncState(const gl::Context *context, > functions->framebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT, > mState.getDefaultLayers()); > break; >+ case Framebuffer::DIRTY_BIT_FLIP_Y: >+ functions->framebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, >+ gl::ConvertToGLBoolean(mState.getFlipY())); >+ break; > default: > { > static_assert(Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 == 0, "FB dirty bits"); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp >index 9c60c4717525b248ffc48c6e319328f7062da1e9..3caf1ec9b3c577b83b15d5a312507fea72dfa94b 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ProgramGL.cpp >@@ -407,7 +407,7 @@ std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context, > } > } > } >- auto workerPool = context->getWorkerThreadPool(); >+ auto workerPool = context->getShaderCompileThreadPool(); > auto linkTask = std::make_shared<LinkTask>([this](std::string &infoLog) { > std::string workerInfoLog; > ScopedWorkerContextGL worker(mRenderer.get(), &workerInfoLog); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp >index 7dcee38c88d73ee92606af2408764dbb2c55e2a5..041922d8a62975164699c6cc5ac8934b62f236e9 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/ShaderGL.cpp >@@ -372,7 +372,7 @@ std::shared_ptr<WaitableCompileEvent> ShaderGL::compile(const gl::Context *conte > > options |= additionalOptions; > >- auto workerThreadPool = context->getWorkerThreadPool(); >+ auto workerThreadPool = context->getShaderCompileThreadPool(); > > const std::string &source = mState.getSource(); > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp >index ecf26e00b12089c1af73b49c0a6f75aabe4a04eb..2fe4700c292121c5b3b2bada9ac9be5536bd23c9 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.cpp >@@ -195,13 +195,22 @@ egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay) > ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->swapIntervalPtr, eglSwapInterval); > > mEGLDisplay = mFnPtrs->getDisplayPtr(nativeDisplay); >- if (mEGLDisplay == EGL_NO_DISPLAY) >+ if (mEGLDisplay != EGL_NO_DISPLAY) > { >- return egl::EglNotInitialized() << "Failed to get system egl display"; >+ if (mFnPtrs->initializePtr(mEGLDisplay, &majorVersion, &minorVersion) != EGL_TRUE) >+ { >+ return egl::Error(mFnPtrs->getErrorPtr(), "Failed to initialize system egl"); >+ } > } >- if (mFnPtrs->initializePtr(mEGLDisplay, &majorVersion, &minorVersion) != EGL_TRUE) >+ else > { >- return egl::Error(mFnPtrs->getErrorPtr(), "Failed to initialize system egl"); >+ // If no display was available, try to fallback to the first available >+ // native device object's display. >+ mEGLDisplay = getNativeDisplay(&majorVersion, &minorVersion); >+ if (mEGLDisplay == EGL_NO_DISPLAY) >+ { >+ return egl::EglNotInitialized() << "Failed to get system egl display"; >+ } > } > if (majorVersion < 1 || (majorVersion == 1 && minorVersion < 4)) > { >@@ -217,7 +226,7 @@ egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay) > const char *extensions = queryString(EGL_EXTENSIONS); > if (!extensions) > { >- return egl::Error(mFnPtrs->getErrorPtr(), "Faild to query extensions in system egl"); >+ return egl::Error(mFnPtrs->getErrorPtr(), "Failed to query extensions in system egl"); > } > angle::SplitStringAlongWhitespace(extensions, &mExtensions); > >@@ -297,6 +306,64 @@ egl::Error FunctionsEGL::terminate() > return egl::Error(mFnPtrs->getErrorPtr()); > } > >+EGLDisplay FunctionsEGL::getNativeDisplay(int *major, int *minor) >+{ >+ // We haven't queried extensions yet since some platforms require a display >+ // to do so. We'll query them now since we need some for this fallback, and >+ // then re-query them again later once we have the display. >+ const char *extensions = queryString(EGL_EXTENSIONS); >+ if (!extensions) >+ { >+ return EGL_NO_DISPLAY; >+ } >+ angle::SplitStringAlongWhitespace(extensions, &mExtensions); >+ >+ // This fallback mechanism makes use of: >+ // - EGL_EXT_device_enumeration or EGL_EXT_device_base for eglQueryDevicesEXT >+ // - EGL_EXT_platform_base for eglGetPlatformDisplayEXT >+ // - EGL_EXT_platform_device for EGL_PLATFORM_DEVICE_EXT >+ PFNEGLQUERYDEVICESEXTPROC queryDevices; >+ PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay; >+ bool hasQueryDevicesEXT = >+ hasExtension("EGL_EXT_device_enumeration") || hasExtension("EGL_EXT_device_base"); >+ bool hasPlatformBaseEXT = hasExtension("EGL_EXT_platform_base"); >+ bool hasPlatformDeviceEXT = hasExtension("EGL_EXT_platform_device"); >+ if (!hasQueryDevicesEXT || !hasPlatformBaseEXT || !hasPlatformDeviceEXT) >+ { >+ return EGL_NO_DISPLAY; >+ } >+ if (!SetPtr(&queryDevices, getProcAddress("eglQueryDevicesEXT")) || >+ !SetPtr(&getPlatformDisplay, getProcAddress("eglGetPlatformDisplayEXT"))) >+ { >+ return EGL_NO_DISPLAY; >+ } >+ >+ // Get a list of native device objects. >+ const EGLint kMaxDevices = 32; >+ EGLDeviceEXT eglDevices[kMaxDevices]; >+ EGLint numDevices = 0; >+ if (!queryDevices(kMaxDevices, eglDevices, &numDevices)) >+ { >+ return EGL_NO_DISPLAY; >+ } >+ >+ // Look for the first native device that gives us a valid display. >+ for (EGLint i = 0; i < numDevices; i++) >+ { >+ EGLDisplay display = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT, eglDevices[i], nullptr); >+ if (mFnPtrs->getErrorPtr() != EGL_SUCCESS) >+ { >+ continue; >+ } >+ if (mFnPtrs->initializePtr(display, major, minor) == EGL_TRUE) >+ { >+ return display; >+ } >+ } >+ >+ return EGL_NO_DISPLAY; >+} >+ > class FunctionsGLEGL : public FunctionsGL > { > public: >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.h >index b9cef19ba7c024965f80d01bca3c1b25465f3573..740cda8bfb392ed5afa27198375577b551c7ee52 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/egl/FunctionsEGL.h >@@ -111,6 +111,9 @@ class FunctionsEGL > FunctionsEGL(const FunctionsEGL &) = delete; > void operator=(const FunctionsEGL &) = delete; > >+ // Fallback mechanism for creating a display from a native device object. >+ EGLDisplay getNativeDisplay(int *major, int *minor); >+ > struct EGLDispatchTable; > EGLDispatchTable *mFnPtrs; > EGLDisplay mEGLDisplay; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp >index 2cbb5067f1f4656ccce68387a1cd175e8b059b22..e6e6b3cd68e388cd801d78bb2985969e04c13641 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/renderergl_utils.cpp >@@ -1800,6 +1800,13 @@ void GenerateCaps(const FunctionsGL *functions, > > extensions->YUVTargetEXT = functions->hasGLESExtension("GL_EXT_YUV_target"); > >+ // GL_MESA_framebuffer_flip_y >+ extensions->framebufferFlipYMESA = functions->hasGLESExtension("GL_MESA_framebuffer_flip_y") || >+ functions->hasGLExtension("GL_MESA_framebuffer_flip_y"); >+ >+ // GL_KHR_parallel_shader_compile >+ extensions->parallelShaderCompileKHR = true; >+ > // PVRTC1 textures must be squares on Apple platforms. > if (IsApple()) > { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp >index 9c85370b5e165fc163ce43a07953552ca77c4b93..d6f11c2199e631c3b46bf61b7e9b556f0efbf0d5 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp >@@ -140,24 +140,25 @@ egl::Error DisplayWGL::initializeImpl(egl::Display *display) > // available. > > // Work around compile error from not defining "UNICODE" while Chromium does >- const LPSTR idcArrow = MAKEINTRESOURCEA(32512); >+ const LPWSTR idcArrow = MAKEINTRESOURCEW(32512); > >- std::ostringstream stream; >- stream << "ANGLE DisplayWGL " << gl::FmtHex(display) << " Intermediate Window Class"; >- std::string className = stream.str(); >+ std::wostringstream stream; >+ stream << L"ANGLE DisplayWGL " << gl::FmtHex<egl::Display *, wchar_t>(display) >+ << L" Intermediate Window Class"; >+ std::wstring className = stream.str(); > >- WNDCLASSA intermediateClassDesc = {}; >+ WNDCLASSW intermediateClassDesc = {}; > intermediateClassDesc.style = CS_OWNDC; >- intermediateClassDesc.lpfnWndProc = DefWindowProcA; >+ intermediateClassDesc.lpfnWndProc = DefWindowProcW; > intermediateClassDesc.cbClsExtra = 0; > intermediateClassDesc.cbWndExtra = 0; > intermediateClassDesc.hInstance = GetModuleHandle(nullptr); > intermediateClassDesc.hIcon = nullptr; >- intermediateClassDesc.hCursor = LoadCursorA(nullptr, idcArrow); >- intermediateClassDesc.hbrBackground = 0; >+ intermediateClassDesc.hCursor = LoadCursorW(nullptr, idcArrow); >+ intermediateClassDesc.hbrBackground = nullptr; > intermediateClassDesc.lpszMenuName = nullptr; > intermediateClassDesc.lpszClassName = className.c_str(); >- mWindowClass = RegisterClassA(&intermediateClassDesc); >+ mWindowClass = RegisterClassW(&intermediateClassDesc); > if (!mWindowClass) > { > return egl::EglNotInitialized() >@@ -166,7 +167,7 @@ egl::Error DisplayWGL::initializeImpl(egl::Display *display) > } > > HWND placeholderWindow = >- CreateWindowExA(0, reinterpret_cast<const char *>(mWindowClass), "ANGLE Placeholder Window", >+ CreateWindowExW(0, reinterpret_cast<LPCWSTR>(mWindowClass), L"ANGLE Placeholder Window", > WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, > CW_USEDEFAULT, nullptr, nullptr, nullptr, nullptr); > if (!placeholderWindow) >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.cpp >index 91d8dc673520abbf3f8a785cb5f60224f69c3823..e8e1dc97ec6bcaac66d9761ce3962847e524b653 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.cpp >@@ -18,6 +18,7 @@ > #include "common/utilities.h" > #include "libANGLE/Caps.h" > #include "libANGLE/ProgramLinkedResources.h" >+#include "libANGLE/renderer/ShaderInterfaceVariableInfoMap.h" > #include "libANGLE/trace.h" > > namespace spirv = angle::spirv; >@@ -1115,11 +1116,14 @@ class SpirvIDDiscoverer final : angle::NonCopyable > > // gl_PerVertex is unique in that it's the only builtin of struct type. This struct is pruned > // by removing trailing inactive members. We therefore need to keep track of what's its type id >- // as well as which is the last active member. Note that intermediate stages, i.e. geometry and >- // tessellation have two gl_PerVertex declarations, one for input and one for output. >+ // as well as which is the last active member. In the case of gl_PerVertex being used in an >+ // array, we also need to keep track of the array's id. Note that intermediate stages, i.e. >+ // geometry and tessellation have two gl_PerVertex declarations, one for input and one for >+ // output. > struct PerVertexData > { > spirv::IdRef typeId; >+ spirv::IdRef arrayId; > uint32_t maxActiveMember; > }; > PerVertexData mOutputPerVertex; >@@ -1246,6 +1250,16 @@ void SpirvIDDiscoverer::visitTypeArray(spirv::IdResult id, > spirv::IdRef length) > { > visitTypeHelper(id, elementType); >+ // In the case of a gl_PerVertex block being used in an array (gl_in/gl_out), save the id of the >+ // array >+ if (elementType == mOutputPerVertex.typeId) >+ { >+ mOutputPerVertex.arrayId = id; >+ } >+ else if (elementType == mInputPerVertex.typeId) >+ { >+ mInputPerVertex.arrayId = id; >+ } > } > > void SpirvIDDiscoverer::visitTypeFloat(spirv::IdResult id, spirv::LiteralInteger width) >@@ -1286,19 +1300,25 @@ void SpirvIDDiscoverer::visitTypePointer(spirv::IdResult id, > { > visitTypeHelper(id, typeId); > >+ // Check if the type is a gl_PerVertex block or an array of gl_PerVertex blocks >+ bool isOutputPerVertex = >+ (typeId == mOutputPerVertex.typeId || typeId == mOutputPerVertex.arrayId); >+ bool isInputPerVertex = (typeId == mInputPerVertex.typeId || typeId == mInputPerVertex.arrayId); >+ > // Verify that the ids associated with input and output gl_PerVertex are correct. >- if (typeId == mOutputPerVertex.typeId || typeId == mInputPerVertex.typeId) >+ if (isOutputPerVertex || isInputPerVertex) > { > // If assumption about the first gl_PerVertex encountered being Output is wrong, swap the > // two ids. >- if ((typeId == mOutputPerVertex.typeId && storageClass == spv::StorageClassInput) || >- (typeId == mInputPerVertex.typeId && storageClass == spv::StorageClassOutput)) >+ if ((isOutputPerVertex && storageClass == spv::StorageClassInput) || >+ (isInputPerVertex && storageClass == spv::StorageClassOutput)) > { > std::swap(mOutputPerVertex.typeId, mInputPerVertex.typeId); >+ std::swap(mOutputPerVertex.arrayId, mInputPerVertex.arrayId); > } > >- // Remember type pointer of output gl_PerVertex for gl_Position transformations. >- if (storageClass == spv::StorageClassOutput) >+ // Remember type pointer of output gl_PerVertex for gl_Position transformations >+ if (typeId == mOutputPerVertex.typeId) > { > mOutputPerVertexTypePointerId = id; > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.h >index 3f9cdc666355dca4d28694febf659a4073d9c28d..d27715d9492e3bfa7eefea5bfc2059642999afb9 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/glslang_wrapper_utils.h >@@ -10,12 +10,13 @@ > #define LIBANGLE_RENDERER_GLSLANG_WRAPPER_UTILS_H_ > > #include <functional> >+ >+#include "common/spirv/spirv_types.h" > #include "libANGLE/renderer/ProgramImpl.h" > #include "libANGLE/renderer/renderer_utils.h" > > namespace rx > { >- > class ShaderInterfaceVariableInfoMap; > constexpr gl::ShaderMap<const char *> kDefaultUniformNames = { > {gl::ShaderType::Vertex, sh::vk::kDefaultUniformsNameVS}, >@@ -157,7 +158,7 @@ void GlslangAssignTransformFeedbackLocations(gl::ShaderType shaderType, > bool isTransformFeedbackStage, > GlslangProgramInterfaceInfo *programInterfaceInfo, > ShaderInterfaceVariableInfoMap *variableInfoMapOut); >-#if ANGLE_ENABLE_METAL_SPIRV >+ > // Retrieves the compiled SPIR-V code for each shader stage, and calls |GlslangAssignLocations|. > void GlslangGetShaderSpirvCode(const GlslangSourceOptions &options, > const gl::ProgramState &programState, >@@ -170,7 +171,6 @@ angle::Result GlslangTransformSpirvCode(const GlslangSpirvOptions &options, > const ShaderInterfaceVariableInfoMap &variableInfoMap, > const angle::spirv::Blob &initialSpirvBlob, > angle::spirv::Blob *spirvBlobOut); >-#endif > > } // namespace rx > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h >index b00cf36aec437ac8977ef2d9d004fddc8a1b6c04..05e50f6b571b7135a2d35cc048e03eb64fcc2fcb 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.h >@@ -432,6 +432,12 @@ class ContextMtl : public ContextImpl, public mtl::Context > const void *indices, > GLsizei instances); > >+ angle::Result drawArraysProvokingVertexImpl(const gl::Context *context, >+ gl::PrimitiveMode mode, >+ GLsizei first, >+ GLsizei count, >+ GLsizei instances); >+ > angle::Result drawArraysImpl(const gl::Context *context, > gl::PrimitiveMode mode, > GLint first, >@@ -444,7 +450,7 @@ class ContextMtl : public ContextImpl, public mtl::Context > gl::DrawElementsType type, > const void *indices, > GLsizei instanceCount); >- >+ void flushCommandBufferIfNeeded(); > void updateExtendedState(const gl::State &glState); > > void updateViewport(FramebufferMtl *framebufferMtl, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm >index 1628b354fcf7e3b1e5609479b033a380ab33c7bc..863394b0f4bdf00c132d5e5abe319cb48188dc29 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ContextMtl.mm >@@ -46,23 +46,29 @@ constexpr uint32_t kMaxTriFanLineLoopBuffersPerFrame = 0; > constexpr uint32_t kMaxTriFanLineLoopBuffersPerFrame = 10; > #endif > >-#define ANGLE_MTL_XFB_DRAW(DRAW_PROC) \ >- if (!mState.isTransformFeedbackActiveUnpaused()) \ >- { \ >- /* Normal draw call */ \ >- DRAW_PROC(false); \ >- } \ >- else \ >- { \ >- /* First pass: write to XFB buffers in vertex shader, fragment shader inactive */ \ >- DRAW_PROC(true); \ >- if (!mState.isRasterizerDiscardEnabled()) \ >- { \ >- /* Second pass: full rasterization: vertex shader + fragment shader are active. \ >- Vertex shader writes to stage output but won't write to XFB buffers */ \ >- invalidateRenderPipeline(); \ >- DRAW_PROC(false); \ >- } \ >+#define ANGLE_MTL_XFB_DRAW(DRAW_PROC) \ >+ if (!mState.isTransformFeedbackActiveUnpaused()) \ >+ { \ >+ /* Normal draw call */ \ >+ DRAW_PROC(false); \ >+ } \ >+ else \ >+ { \ >+ /* First pass: write to XFB buffers in vertex shader, fragment shader inactive */ \ >+ bool rasterizationNotDisabled = \ >+ mRenderPipelineDesc.rasterizationType != mtl::RenderPipelineRasterization::Disabled; \ >+ if (rasterizationNotDisabled) \ >+ { \ >+ invalidateRenderPipeline(); \ >+ } \ >+ DRAW_PROC(true); \ >+ if (rasterizationNotDisabled) \ >+ { \ >+ /* Second pass: full rasterization: vertex shader + fragment shader are active. \ >+ Vertex shader writes to stage output but won't write to XFB buffers */ \ >+ invalidateRenderPipeline(); \ >+ DRAW_PROC(false); \ >+ } \ > } > > angle::Result AllocateTriangleFanBufferFromPool(ContextMtl *context, >@@ -425,7 +431,10 @@ angle::Result ContextMtl::drawArraysImpl(const gl::Context *context, > { > return angle::Result::Continue; > } >- >+ if (requiresIndexRewrite(context->getState(), mode)) >+ { >+ return drawArraysProvokingVertexImpl(context, mode, first, count, instances); >+ } > if (mode == gl::PrimitiveMode::TriangleFan) > { > return drawTriFanArrays(context, first, count, instanceCount); >@@ -579,6 +588,68 @@ angle::Result ContextMtl::drawLineLoopElements(const gl::Context *context, > instances); > } > >+angle::Result ContextMtl::drawArraysProvokingVertexImpl(const gl::Context *context, >+ gl::PrimitiveMode mode, >+ GLsizei first, >+ GLsizei count, >+ GLsizei instances) >+{ >+ >+ size_t outIndexCount = 0; >+ size_t outIndexOffset = 0; >+ gl::DrawElementsType convertedType = gl::DrawElementsType::UnsignedInt; >+ gl::PrimitiveMode outIndexMode = gl::PrimitiveMode::InvalidEnum; >+ >+ mtl::BufferRef drawIdxBuffer = mProvokingVertexHelper.generateIndexBuffer( >+ mtl::GetImpl(context), first, count, mode, convertedType, outIndexCount, outIndexOffset, >+ outIndexMode); >+ GLsizei outIndexCounti32 = static_cast<GLsizei>(outIndexCount); >+ const uint8_t *mappedIndices = drawIdxBuffer->mapReadOnly(this); >+ if (!drawIdxBuffer || !mappedIndices) >+ { >+ return angle::Result::Stop; >+ } >+ >+#define DRAW_PROVOKING_VERTEX_ARRAY(xfbPass) \ >+ if (xfbPass) \ >+ { \ >+ ANGLE_TRY(setupDraw(context, mode, first, count, instances, \ >+ gl::DrawElementsType::InvalidEnum, nullptr, xfbPass)); \ >+ MTLPrimitiveType mtlType = mtl::GetPrimitiveType(mode); \ >+ if (instances == 0) \ >+ { \ >+ /* This method is called from normal drawArrays() */ \ >+ mRenderEncoder.draw(mtlType, first, count); \ >+ } \ >+ else \ >+ { \ >+ mRenderEncoder.drawInstanced(mtlType, first, count, instances); \ >+ } \ >+ } \ >+ else \ >+ { \ >+ ANGLE_TRY(setupDraw(context, outIndexMode, 0, outIndexCounti32, instances, convertedType, \ >+ mappedIndices + outIndexOffset, xfbPass)); \ >+ \ >+ MTLPrimitiveType mtlType = mtl::GetPrimitiveType(outIndexMode); \ >+ MTLIndexType mtlIdxType = mtl::GetIndexType(convertedType); \ >+ if (instances == 0) \ >+ { \ >+ mRenderEncoder.drawIndexed(mtlType, outIndexCounti32, mtlIdxType, drawIdxBuffer, \ >+ outIndexOffset); \ >+ } \ >+ else \ >+ { \ >+ mRenderEncoder.drawIndexedInstanced(mtlType, outIndexCounti32, mtlIdxType, \ >+ drawIdxBuffer, outIndexOffset, instances); \ >+ } \ >+ } >+ >+ ANGLE_MTL_XFB_DRAW(DRAW_PROVOKING_VERTEX_ARRAY) >+ drawIdxBuffer->unmapNoFlush(this); >+ return angle::Result::Continue; >+} >+ > angle::Result ContextMtl::drawElementsImpl(const gl::Context *context, > gl::PrimitiveMode mode, > GLsizei count, >@@ -617,13 +688,16 @@ angle::Result ContextMtl::drawElementsImpl(const gl::Context *context, > > uint32_t convertedCounti32 = (uint32_t)count; > >+ size_t provokingVertexAdditionalOffset = 0; >+ > if (requiresIndexRewrite(context->getState(), mode)) > { > size_t outIndexCount = 0; > gl::PrimitiveMode newMode = gl::PrimitiveMode::InvalidEnum; > drawIdxBuffer = mProvokingVertexHelper.preconditionIndexBuffer( > mtl::GetImpl(context), idxBuffer, count, convertedOffset, >- mState.isPrimitiveRestartEnabled(), mode, convertedType, outIndexCount, newMode); >+ mState.isPrimitiveRestartEnabled(), mode, convertedType, outIndexCount, >+ provokingVertexAdditionalOffset, newMode); > if (!drawIdxBuffer) > { > return angle::Result::Stop; >@@ -656,7 +730,7 @@ angle::Result ContextMtl::drawElementsImpl(const gl::Context *context, > for (auto &command : drawCommands) > { > mRenderEncoder.drawIndexed(mtlType, command.count, mtlIdxType, drawIdxBuffer, >- command.offset); >+ command.offset + provokingVertexAdditionalOffset); > } > } > else >@@ -665,10 +739,10 @@ angle::Result ContextMtl::drawElementsImpl(const gl::Context *context, > for (auto &command : drawCommands) > { > mRenderEncoder.drawIndexedInstanced(mtlType, command.count, mtlIdxType, drawIdxBuffer, >- command.offset, instanceCount); >+ command.offset + provokingVertexAdditionalOffset, >+ instanceCount); > } > } >- > return angle::Result::Continue; > } > >@@ -1517,6 +1591,14 @@ void ContextMtl::flushCommandBuffer(mtl::CommandBufferFinishOperation operation) > mCmdBuffer.commit(operation); > } > >+void ContextMtl::flushCommandBufferIfNeeded() >+{ >+ if (mCmdBuffer.needsFlushForDrawCallLimits()) >+ { >+ flushCommandBuffer(mtl::NoWait); >+ } >+} >+ > void ContextMtl::present(const gl::Context *context, id<CAMetalDrawable> presentationDrawable) > { > ensureCommandBufferReady(); >@@ -1668,7 +1750,6 @@ mtl::ComputeCommandEncoder *ContextMtl::getComputeCommandEncoder() > } > > endEncoding(true); >- > ensureCommandBufferReady(); > > return &mComputeEncoder.restart(); >@@ -1681,6 +1762,7 @@ mtl::ComputeCommandEncoder *ContextMtl::getIndexPreprocessingCommandEncoder() > > void ContextMtl::ensureCommandBufferReady() > { >+ flushCommandBufferIfNeeded(); > mProvokingVertexHelper.ensureCommandBufferReady(); > if (!mCmdBuffer.ready()) > { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.h >index 710bb9e0aa490e0e734d35a79ea05bc3b213f9f7..7cbce54c7c8a8ea3995dedf3a778cafeb4901945 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.h >@@ -130,6 +130,7 @@ class DisplayMtl : public DisplayImpl > bool isAMD() const; > bool isIntel() const; > bool isNVIDIA() const; >+ bool isSimulator() const; > > id<MTLDevice> getMetalDevice() const { return mMetalDevice; } > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.mm >index f343c499dc16078510ea250e74fff104b733b861..4f3e55ed0b8b85f1bf82d3cc85fe7d172666a049 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/DisplayMtl.mm >@@ -238,6 +238,22 @@ mtl::AutoObjCPtr<id<MTLDevice>> DisplayMtl::getMetalDeviceMatchingAttribute( > #if defined(ANGLE_PLATFORM_MACOS) || defined(ANGLE_PLATFORM_MACCATALYST) > auto deviceList = mtl::adoptObjCObj(MTLCopyAllDevices()); > >+ EGLAttrib high = attribs.get(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE, 0); >+ EGLAttrib low = attribs.get(EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE, 0); >+ uint64_t deviceId = >+ angle::GetSystemDeviceIdFromParts(static_cast<uint32_t>(high), static_cast<uint32_t>(low)); >+ // Check EGL_ANGLE_platform_angle_device_id to see if a device was specified. >+ if (deviceId != 0) >+ { >+ for (id<MTLDevice> device in deviceList.get()) >+ { >+ if ([device registryID] == deviceId) >+ { >+ return device; >+ } >+ } >+ } >+ > auto externalGPUs = mtl::adoptObjCObj<NSMutableArray<id<MTLDevice>>>([[NSMutableArray alloc] init]); > auto integratedGPUs = mtl::adoptObjCObj<NSMutableArray<id<MTLDevice>>>([[NSMutableArray alloc] init]); > auto discreteGPUs = mtl::adoptObjCObj<NSMutableArray<id<MTLDevice>>>([[NSMutableArray alloc] init]); >@@ -941,6 +957,8 @@ void DisplayMtl::initializeExtensions() const > > mNativeExtensions.texture3DOES = true; > >+ mNativeExtensions.shaderTextureLodEXT = true; >+ > mNativeExtensions.standardDerivativesOES = true; > > mNativeExtensions.elementIndexUintOES = true; >@@ -967,6 +985,9 @@ void DisplayMtl::initializeExtensions() const > // GL_ARB_sync > mNativeExtensions.syncARB = true; > } >+ >+ // GL_KHR_parallel_shader_compile >+ mNativeExtensions.parallelShaderCompileKHR = true; > } > > void DisplayMtl::initializeTextureCaps() const >@@ -1007,7 +1028,6 @@ void DisplayMtl::initializeTextureCaps() const > mNativeExtensions.readDepthNV = false; > mNativeExtensions.readStencilNV = false; > mNativeExtensions.depthBufferFloat2NV = false; >- mNativeExtensions.textureCompressionAstcLdrKHR &= supportsAppleGPUFamily(2); > } > > void DisplayMtl::initializeLimitations() >@@ -1229,6 +1249,11 @@ bool DisplayMtl::isNVIDIA() const > return angle::IsNVIDIA(mMetalDeviceVendorId); > } > >+bool DisplayMtl::isSimulator() const >+{ >+ return TARGET_OS_SIMULATOR; >+} >+ > #if ANGLE_MTL_EVENT_AVAILABLE > mtl::AutoObjCObj<MTLSharedEventListener> DisplayMtl::getOrCreateSharedEventListener() > { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.mm >index 159c59b89c5e6276acf809fad9aa03d1381cd951..ab7283ae1c987aa80983f86914b6fc9fcf1d0fe3 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/IOSurfaceSurfaceMtl.mm >@@ -153,6 +153,15 @@ angle::Result IOSurfaceSurfaceMtl::ensureColorTextureCreated(const gl::Context * > mColorTexture = > mtl::Texture::MakeFromMetal(contextMtl->getMetalDevice().newTextureWithDescriptor( > texDesc, mIOSurface, mIOSurfacePlane)); >+ >+ if (mColorTexture) >+ { >+ size_t resourceSize = EstimateTextureSizeInBytes( >+ mColorFormat, mColorTexture->widthAt0(), mColorTexture->heightAt0(), >+ mColorTexture->depthAt0(), mColorTexture->samples(), mColorTexture->mipmapLevels()); >+ >+ mColorTexture->setEstimatedByteSize(resourceSize); >+ } > } > > mColorRenderTarget.set(mColorTexture, mtl::kZeroNativeMipLevel, 0, mColorFormat); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ImageMtl.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ImageMtl.mm >index 2090ac7355f4db8ace1ff8d783fbb5c861c1c0a0..9254007fae5a165937661801c47af3dcf628e3f4 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ImageMtl.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ImageMtl.mm >@@ -72,6 +72,14 @@ angle::Result TextureImageSiblingMtl::initImpl(DisplayMtl *displayMtl) > mtl::Format::MetalToAngleFormatID(mNativeTexture->pixelFormat()); > mFormat = displayMtl->getPixelFormat(angleFormatId); > >+ if (mNativeTexture) >+ { >+ size_t resourceSize = EstimateTextureSizeInBytes( >+ mFormat, mNativeTexture->widthAt0(), mNativeTexture->heightAt0(), >+ mNativeTexture->depthAt0(), mNativeTexture->samples(), mNativeTexture->mipmapLevels()); >+ mNativeTexture->setEstimatedByteSize(resourceSize); >+ } >+ > mGLFormat = gl::Format(mFormat.intendedAngleFormat().glInternalFormat); > > mRenderable = mFormat.getCaps().depthRenderable || mFormat.getCaps().colorRenderable; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.mm >index 13502d2eeaf25dc63170e05e677d61841065c77e..0b138c1d714fc54840db1dfb11f7650142d4fbc3 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProgramMtl.mm >@@ -674,11 +674,20 @@ angle::Result ProgramMtl::getSpecializedShader(ContextMtl *context, > coverageMaskEnabledStr = > [NSString stringWithUTF8String:sh::mtl::kCoverageMaskEnabledConstName]; > } >+ NSString *depthWriteEnabledStr = >+ [NSString stringWithUTF8String:sh::mtl::kDepthWriteEnabledConstName]; > > funcConstants = mtl::adoptObjCObj([[MTLFunctionConstantValues alloc] init]); > [funcConstants setConstantValue:&emulateCoverageMask > type:MTLDataTypeBool > withName:coverageMaskEnabledStr]; >+ >+ MTLPixelFormat depthPixelFormat = >+ (MTLPixelFormat)renderPipelineDesc.outputDescriptor.depthAttachmentPixelFormat; >+ BOOL fragDepthWriteEnabled = depthPixelFormat != MTLPixelFormatInvalid; >+ [funcConstants setConstantValue:&fragDepthWriteEnabled >+ type:MTLDataTypeBool >+ withName:depthWriteEnabledStr]; > } > > } // gl::ShaderType::Fragment >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.h >index 2ee371b33a2ecdf6c379eb16b2dcd3bd2496620c..c894cd724f1437514f8f87047a7f824554ba1a41 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.h >@@ -35,8 +35,19 @@ class ProvokingVertexHelper : public mtl::ProvokingVertexCacheSpecializeShaderFa > bool primitiveRestartEnabled, > gl::PrimitiveMode primitiveMode, > gl::DrawElementsType elementsType, >- size_t &outIndexcount, >+ size_t &outIndexCount, >+ size_t &outIndexOffset, > gl::PrimitiveMode &outPrimitiveMode); >+ >+ mtl::BufferRef generateIndexBuffer(ContextMtl *context, >+ size_t first, >+ size_t indexCount, >+ gl::PrimitiveMode primitiveMode, >+ gl::DrawElementsType elementsType, >+ size_t &outIndexCount, >+ size_t &outIndexOffset, >+ gl::PrimitiveMode &outPrimitiveMode); >+ > void commitPreconditionCommandBuffer(ContextMtl *context); > void ensureCommandBufferReady(); > void onDestroy(ContextMtl *context); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.mm >index 834a6a8441b761b0762835c8787e47b3a388a687..db9fe00700492a048c9135644970542744b78d39 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/ProvokingVertexHelper.mm >@@ -34,10 +34,14 @@ static inline uint primCountForIndexCount(const uint fixIndexBufferKey, const ui > return indexCount / 2; > case MtlFixIndexBufferKeyLineStrip: > return (uint)MAX(0, (int)indexCount - 1); >+ case MtlFixIndexBufferKeyLineLoop: >+ return (uint)MAX(0, (int)indexCount); > case MtlFixIndexBufferKeyTriangles: > return indexCount / 3; > case MtlFixIndexBufferKeyTriangleStrip: > return (uint)MAX(0, (int)indexCount - 2); >+ case MtlFixIndexBufferKeyTriangleFan: >+ return (uint)MAX(0, (int)indexCount - 2); > default: > ASSERT(false); > return 0; >@@ -56,10 +60,14 @@ static inline uint indexCountForPrimCount(const uint fixIndexBufferKey, const ui > return primCount * 2; > case MtlFixIndexBufferKeyLineStrip: > return primCount * 2; >+ case MtlFixIndexBufferKeyLineLoop: >+ return primCount * 2; > case MtlFixIndexBufferKeyTriangles: > return primCount * 3; > case MtlFixIndexBufferKeyTriangleStrip: > return primCount * 3; >+ case MtlFixIndexBufferKeyTriangleFan: >+ return primCount * 3; > default: > ASSERT(false); > return 0; >@@ -78,10 +86,14 @@ static inline gl::PrimitiveMode getNewPrimitiveMode(const uint fixIndexBufferKey > return gl::PrimitiveMode::Lines; > case MtlFixIndexBufferKeyLineStrip: > return gl::PrimitiveMode::Lines; >+ case MtlFixIndexBufferKeyLineLoop: >+ return gl::PrimitiveMode::Lines; > case MtlFixIndexBufferKeyTriangles: > return gl::PrimitiveMode::Triangles; > case MtlFixIndexBufferKeyTriangleStrip: > return gl::PrimitiveMode::Triangles; >+ case MtlFixIndexBufferKeyTriangleFan: >+ return gl::PrimitiveMode::Triangles; > default: > ASSERT(false); > return gl::PrimitiveMode::InvalidEnum; >@@ -164,6 +176,13 @@ static uint buildIndexBufferKey(const mtl::ProvokingVertexComputePipelineDesc &p > return indexBufferKey; > } > >+bool ProvokingVertexHelper::hasSpecializedShader( >+ gl::ShaderType shaderType, >+ const mtl::ProvokingVertexComputePipelineDesc &renderPipelineDesc) >+{ >+ return true; >+} >+ > angle::Result ProvokingVertexHelper::getSpecializedShader( > rx::mtl::Context *context, > gl::ShaderType shaderType, >@@ -173,16 +192,16 @@ angle::Result ProvokingVertexHelper::getSpecializedShader( > uint indexBufferKey = buildIndexBufferKey(pipelineDesc); > auto fcValues = mtl::adoptObjCObj([[MTLFunctionConstantValues alloc] init]); > [fcValues setConstantValue:&indexBufferKey type:MTLDataTypeUInt withName:@"fixIndexBufferKey"]; >- >- return CreateMslShader(context, mProvokingVertexLibrary, @"fixIndexBuffer", fcValues.get(), >- shaderOut); >-} >-// Private command buffer >-bool ProvokingVertexHelper::hasSpecializedShader( >- gl::ShaderType shaderType, >- const mtl::ProvokingVertexComputePipelineDesc &renderPipelineDesc) >-{ >- return true; >+ if (pipelineDesc.generateIndices) >+ { >+ return CreateMslShader(context, mProvokingVertexLibrary, @"genIndexBuffer", fcValues.get(), >+ shaderOut); >+ } >+ else >+ { >+ return CreateMslShader(context, mProvokingVertexLibrary, @"fixIndexBuffer", fcValues.get(), >+ shaderOut); >+ } > } > > void ProvokingVertexHelper::prepareCommandEncoderForDescriptor( >@@ -202,7 +221,8 @@ mtl::BufferRef ProvokingVertexHelper::preconditionIndexBuffer(ContextMtl *contex > bool primitiveRestartEnabled, > gl::PrimitiveMode primitiveMode, > gl::DrawElementsType elementsType, >- size_t &outIndexcount, >+ size_t &outIndexCount, >+ size_t &outIndexOffset, > gl::PrimitiveMode &outPrimitiveMode) > { > // Get specialized program >@@ -213,13 +233,15 @@ mtl::BufferRef ProvokingVertexHelper::preconditionIndexBuffer(ContextMtl *contex > pipelineDesc.elementType = (uint8_t)elementsType; > pipelineDesc.primitiveMode = primitiveMode; > pipelineDesc.primitiveRestartEnabled = primitiveRestartEnabled; >+ pipelineDesc.generateIndices = false; > uint indexBufferKey = buildIndexBufferKey(pipelineDesc); > uint primCount = primCountForIndexCount(indexBufferKey, (uint32_t)indexCount); > uint newIndexCount = indexCountForPrimCount(indexBufferKey, primCount); > size_t indexSize = gl::GetDrawElementsTypeSize(elementsType); >+ size_t newOffset = 0; > mtl::BufferRef newBuffer; > if (mIndexBuffers.allocate(context, newIndexCount * indexSize + indexOffset, nullptr, >- &newBuffer) == angle::Result::Stop) >+ &newBuffer, &newOffset) == angle::Result::Stop) > { > return nullptr; > } >@@ -228,16 +250,69 @@ mtl::BufferRef ProvokingVertexHelper::preconditionIndexBuffer(ContextMtl *contex > > mtl::ComputeCommandEncoder *encoder = getComputeCommandEncoder(); > prepareCommandEncoderForDescriptor(context, encoder, pipelineDesc); >- encoder->setBuffer(indexBuffer, (uint32_t)indexOffset, 0); >- encoder->setBufferForWrite(newBuffer, (uint32_t)indexOffset, 1); >+ encoder->setBuffer(indexBuffer, static_cast<uint32_t>(indexOffset), 0); >+ encoder->setBufferForWrite( >+ newBuffer, static_cast<uint32_t>(indexOffset) + static_cast<uint32_t>(newOffset), 1); > encoder->setData(&indexCountEncoded, 2); > encoder->setData(&primCount, 3); > encoder->dispatch( > MTLSizeMake((primCount + threadsPerThreadgroup.width - 1) / threadsPerThreadgroup.width, 1, > 1), > threadsPerThreadgroup); >- outIndexcount = newIndexCount; >+ outIndexCount = newIndexCount; >+ outIndexOffset = newOffset; > outPrimitiveMode = getNewPrimitiveMode(indexBufferKey); > return newBuffer; > } >+ >+mtl::BufferRef ProvokingVertexHelper::generateIndexBuffer(ContextMtl *context, >+ size_t first, >+ size_t indexCount, >+ gl::PrimitiveMode primitiveMode, >+ gl::DrawElementsType elementsType, >+ size_t &outIndexCount, >+ size_t &outIndexOffset, >+ gl::PrimitiveMode &outPrimitiveMode) >+{ >+ // Get specialized program >+ // Upload index buffer >+ // dispatch per-primitive? >+ ensureCommandBufferReady(); >+ mtl::ProvokingVertexComputePipelineDesc pipelineDesc; >+ pipelineDesc.elementType = (uint8_t)elementsType; >+ pipelineDesc.primitiveMode = primitiveMode; >+ pipelineDesc.primitiveRestartEnabled = false; >+ pipelineDesc.generateIndices = true; >+ uint indexBufferKey = buildIndexBufferKey(pipelineDesc); >+ uint primCount = primCountForIndexCount(indexBufferKey, (uint32_t)indexCount); >+ uint newIndexCount = indexCountForPrimCount(indexBufferKey, primCount); >+ size_t indexSize = gl::GetDrawElementsTypeSize(elementsType); >+ size_t newIndexOffset = 0; >+ mtl::BufferRef newBuffer; >+ if (mIndexBuffers.allocate(context, newIndexCount * indexSize, nullptr, &newBuffer, >+ &newIndexOffset) == angle::Result::Stop) >+ { >+ return nullptr; >+ } >+ uint indexCountEncoded = static_cast<uint>(indexCount); >+ uint firstVertexEncoded = static_cast<uint>(first); >+ uint indexOffsetEncoded = static_cast<uint>(newIndexOffset); >+ auto threadsPerThreadgroup = MTLSizeMake(MIN(primCount, 64u), 1, 1); >+ >+ mtl::ComputeCommandEncoder *encoder = getComputeCommandEncoder(); >+ prepareCommandEncoderForDescriptor(context, encoder, pipelineDesc); >+ encoder->setBufferForWrite(newBuffer, indexOffsetEncoded, 1); >+ encoder->setData(indexCountEncoded, 2); >+ encoder->setData(primCount, 3); >+ encoder->setData(firstVertexEncoded, 4); >+ encoder->dispatch( >+ MTLSizeMake((primCount + threadsPerThreadgroup.width - 1) / threadsPerThreadgroup.width, 1, >+ 1), >+ threadsPerThreadgroup); >+ outIndexCount = newIndexCount; >+ outIndexOffset = newIndexOffset; >+ outPrimitiveMode = getNewPrimitiveMode(indexBufferKey); >+ return newBuffer; >+} >+ > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/SurfaceMtl.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/SurfaceMtl.mm >index 95006fe387d8c94b678c49af7de593d457ab5719..daa0e59cf439a71a48818e1426930bd6ac1fac2b 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/SurfaceMtl.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/SurfaceMtl.mm >@@ -51,6 +51,11 @@ angle::Result CreateOrResizeTexture(const gl::Context *context, > if (*textureOut) > { > ANGLE_TRY((*textureOut)->resize(contextMtl, width, height)); >+ size_t resourceSize = EstimateTextureSizeInBytes(format, width, height, 1, samples, 1); >+ if (*textureOut) >+ { >+ (*textureOut)->setEstimatedByteSize(resourceSize); >+ } > } > else if (samples > 1) > { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h >index 86e6a28363e1f0afa05810e072b05104655bb4b4..f57ae66407822a84eac22c7e80a70600c340f615 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.h >@@ -151,7 +151,7 @@ class VertexArrayMtl : public VertexArrayImpl > mtl::BufferPool mDynamicIndexData; > > std::vector<uint32_t> mEmulatedInstanceAttribs; >- >+ bool mElementArrayDirty = true; > bool mVertexArrayDirty = true; > }; > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm >index ba0c505618dab13fe989bb8524a20dc5c54d6369..682b7118e5e2513dbe74140a3b49f91b61fa1d36 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/VertexArrayMtl.mm >@@ -273,6 +273,7 @@ angle::Result VertexArrayMtl::syncState(const gl::Context *context, > case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER: > case gl::VertexArray::DIRTY_BIT_ELEMENT_ARRAY_BUFFER_DATA: > { >+ mElementArrayDirty = true; > break; > } > >@@ -475,23 +476,38 @@ angle::Result VertexArrayMtl::setupDraw(const gl::Context *glContext, > } > > desc.layouts[bufferIdx].stride = mCurrentArrayBufferStrides[v]; >- >- if (mCurrentArrayBuffers[v]) >- { >- cmdEncoder->setVertexBuffer(mCurrentArrayBuffers[v]->getCurrentBuffer(), >- bufferOffset, bufferIdx); >- } >- else >- { >- // No buffer specified, use the client memory directly as inline constant data >- ASSERT(mCurrentArrayInlineDataSizes[v] <= mInlineDataMaxSize); >- cmdEncoder->setVertexBytes(mCurrentArrayInlineDataPointers[v], >- mCurrentArrayInlineDataSizes[v], bufferIdx); >- } > } > } // for (v) > } > >+ if(dirty || mElementArrayDirty) >+ { >+ mElementArrayDirty = false; >+ const gl::ProgramExecutable *executable = glContext->getState().getProgramExecutable(); >+ const gl::AttributesMask &programActiveAttribsMask = >+ executable->getActiveAttribLocationsMask(); >+ >+ for (uint32_t v = 0; v < mtl::kMaxVertexAttribs; ++v) >+ { >+ uint32_t bufferIdx = mtl::kVboBindingIndexStart + v; >+ uint32_t bufferOffset = static_cast<uint32_t>(mCurrentArrayBufferOffsets[v]); >+ if (mCurrentArrayBuffers[v]) >+ { >+ cmdEncoder->setVertexBuffer(mCurrentArrayBuffers[v]->getCurrentBuffer(), >+ bufferOffset, bufferIdx); >+ } >+ else >+ { >+ // No buffer specified, use the client memory directly as inline constant data >+ ASSERT(mCurrentArrayInlineDataSizes[v] <= mInlineDataMaxSize); >+ cmdEncoder->setVertexBytes(mCurrentArrayInlineDataPointers[v], >+ mCurrentArrayInlineDataSizes[v], bufferIdx); >+ } >+ >+ } >+ } >+ >+ > *vertexDescChanged = dirty; > > return angle::Result::Continue; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/gen_mtl_format_table.py b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/gen_mtl_format_table.py >index a7d49fb1503f2b3c549d985109fcad2e5d2223b4..8db364b5193e7a312d146d18a2085cff9a88b762 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/gen_mtl_format_table.py >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/gen_mtl_format_table.py >@@ -8,6 +8,12 @@ > # NOTE: don't run this script directly. Run scripts/run_code_generation.py. > # > >+# Information on Simulator formats: >+# According to https://developer.apple.com/documentation/metal/developing_metal_apps_that_run_in_simulator?language=objc, >+# Metal sim does not support several formats. The format table explicitly avoids enabling format support >+# for MTLPixelFormatR8Unorm_sRGB, MTLPixelFormatR8G8Unorm_sRGB, >+# and packed 16 bit formats when building for a Simulator target. >+ > import json > import math > import pprint >@@ -100,24 +106,20 @@ void FormatTable::initNativeFormatCapsAutogen(const DisplayMtl *display) > > image_format_assign_template1 = """ > this->metalFormat = {mtl_format}; >- this->actualFormatId = angle::FormatID::{actual_angle_format}; >- this->initFunction = {init_function}; >-""" >+ this->actualFormatId = angle::FormatID::{actual_angle_format};{init_function}""" > > image_format_assign_template2 = """ > if ({fallback_condition}) > {{ > this->metalFormat = {mtl_format}; >- this->actualFormatId = angle::FormatID::{actual_angle_format}; >- this->initFunction = {init_function}; >+ this->actualFormatId = angle::FormatID::{actual_angle_format};{init_function} > }} > else > {{ > this->metalFormat = {mtl_format_fallback}; >- this->actualFormatId = angle::FormatID::{actual_angle_format_fallback}; >- this->initFunction = {init_function_fallback}; >- }} >-""" >+ this->actualFormatId = angle::FormatID::{actual_angle_format_fallback};{init_function_fallback} >+ }}""" >+ > #D16 is fully supported on Apple3+. However, on > #previous versions of Apple hardware, some operations can cause > #undefined behavior. >@@ -125,20 +127,16 @@ image_format_assign_template3 = """ > if (mtl::SupportsIOSGPUFamily(metalDevice, 3)) > {{ > this->metalFormat = {mtl_format}; >- this->actualFormatId = angle::FormatID::{actual_angle_format}; >- this->initFunction = {init_function}; >+ this->actualFormatId = angle::FormatID::{actual_angle_format};{init_function} > }} > else > {{ > this->metalFormat = {mtl_format_fallback}; >- this->actualFormatId = angle::FormatID::{actual_angle_format_fallback}; >- this->initFunction = {init_function_fallback}; >- }} >-""" >+ this->actualFormatId = angle::FormatID::{actual_angle_format_fallback};{init_function_fallback} >+ }}""" > > case_image_format_template1 = """ case angle::FormatID::{angle_format}: > {image_format_assign} >- this->swizzled = false; > break; > > """ >@@ -155,7 +153,6 @@ case_image_format_template2 = """ case angle::FormatID::{angle_format}: > #endif // #if defined(__IPHONE_13_0) || defined(__MAC_10_15) > {{ > {image_format_assign_default} >- this->swizzled = false; > }} > break; > >@@ -169,8 +166,7 @@ case_vertex_format_template1 = """ case angle::FormatID::{angle_format}: > this->metalFormat = {mtl_format}; > this->actualFormatId = angle::FormatID::{actual_angle_format}; > this->vertexLoadFunction = {vertex_copy_function}; >- this->defaultAlpha = {default_alpha}; >- this->actualSameGLType = {same_gl_type}; >+ this->defaultAlpha = {default_alpha};{same_gl_type} > break; > > """ >@@ -181,22 +177,28 @@ case_vertex_format_template2 = """ case angle::FormatID::{angle_format}: > this->metalFormat = {mtl_format_packed}; > this->actualFormatId = angle::FormatID::{actual_angle_format_packed}; > this->vertexLoadFunction = {vertex_copy_function_packed}; >- this->defaultAlpha = {default_alpha_packed}; >- this->actualSameGLType = {same_gl_type_packed}; >+ this->defaultAlpha = {default_alpha_packed};{same_gl_type_packed} > }} > else > {{ > this->metalFormat = {mtl_format}; > this->actualFormatId = angle::FormatID::{actual_angle_format}; > this->vertexLoadFunction = {vertex_copy_function}; >- this->defaultAlpha = {default_alpha}; >- this->actualSameGLType = {same_gl_type}; >+ this->defaultAlpha = {default_alpha};{same_gl_type} > }} > break; > > """ > > >+def wrap_init_function(str): >+ return '' if str == 'nullptr' else f'this->initFunction = {str};' >+ >+ >+def wrap_actual_same_gl_type(str): >+ return '' if str == 'true' else f'this->actualSameGLType = {str};' >+ >+ > # NOTE(hqle): This is a modified version of the get_vertex_copy_function() function in > # src/libANGLE/renderer/angle_format.py > # - Return value is a tuple {copy_function, default_alpha_value, have_same_gl_type}. >@@ -297,8 +299,9 @@ def gen_image_map_switch_simple_case(angle_format, actual_angle_format_info, ang > return image_format_assign_template1.format( > actual_angle_format=actual_angle_format, > mtl_format=angle_to_mtl_map[actual_angle_format], >- init_function=angle_format_utils.get_internal_format_initializer( >- angle_to_gl[angle_format], actual_angle_format)) >+ init_function=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer(angle_to_gl[angle_format], >+ actual_angle_format))) > > return gen_image_map_switch_case(angle_format, actual_angle_format_info, angle_to_mtl_map, > gen_format_assign_code) >@@ -322,20 +325,23 @@ def gen_image_map_switch_mac_case(angle_format, actual_angle_format_info, angle_ > return image_format_assign_template2.format( > actual_angle_format=actual_angle_format, > mtl_format=angle_to_mtl_map[actual_angle_format], >- init_function=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format), >+ init_function=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer( >+ gl_format, actual_angle_format)), > actual_angle_format_fallback=actual_angle_format_fallback, > mtl_format_fallback=angle_to_mtl_map[actual_angle_format_fallback], >- init_function_fallback=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format_fallback), >+ init_function_fallback=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer( >+ gl_format, actual_angle_format_fallback)), > fallback_condition=fallback_condition) > else: > # return ordinary block: > return image_format_assign_template1.format( > actual_angle_format=actual_angle_format, > mtl_format=angle_to_mtl_map[actual_angle_format], >- init_function=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format)) >+ init_function=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer( >+ gl_format, actual_angle_format))) > > return gen_image_map_switch_case(angle_format, actual_angle_format_info, angle_to_mtl_map, > gen_format_assign_code) >@@ -351,12 +357,14 @@ def gen_image_map_switch_es3_case(angle_format, actual_angle_format_info, angle_ > return image_format_assign_template2.format( > actual_angle_format=actual_angle_format, > mtl_format=angle_to_mtl_map[actual_angle_format], >- init_function=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format), >+ init_function=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer(gl_format, >+ actual_angle_format)), > actual_angle_format_fallback=actual_angle_format_fallback, > mtl_format_fallback=angle_to_mtl_map[actual_angle_format_fallback], >- init_function_fallback=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format_fallback), >+ init_function_fallback=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer(gl_format, >+ actual_angle_format_fallback)), > fallback_condition="display->supportsAppleGPUFamily(1)") > > return gen_image_map_switch_case(angle_format, actual_angle_format_info, angle_to_mtl_map, >@@ -371,12 +379,14 @@ def gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, angle_to_mt > return image_format_assign_template2.format( > actual_angle_format=actual_angle_format, > mtl_format=angle_to_mtl_map[actual_angle_format] + "HDR", >- init_function=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format), >+ init_function=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer(gl_format, >+ actual_angle_format)), > actual_angle_format_fallback=actual_angle_format, > mtl_format_fallback=angle_to_mtl_map[actual_angle_format] + "LDR", >- init_function_fallback=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format), >+ init_function_fallback=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer(gl_format, >+ actual_angle_format)), > fallback_condition="display->supportsAppleGPUFamily(6)") > > return gen_image_map_switch_case(angle_format, angle_format, angle_to_mtl_map, >@@ -390,8 +400,9 @@ def gen_image_map_switch_astc_case_tv_watchos(angle_format, angle_to_gl, angle_t > return image_format_assign_template1.format( > actual_angle_format=actual_angle_format, > mtl_format=angle_to_mtl_map[actual_angle_format] + "LDR", >- init_function=angle_format_utils.get_internal_format_initializer( >- gl_format, actual_angle_format)) >+ init_function=wrap_init_function( >+ angle_format_utils.get_internal_format_initializer(gl_format, >+ actual_angle_format))) > > return gen_image_map_switch_case(angle_format, angle_format, angle_to_mtl_map, > gen_format_assign_code) >@@ -466,12 +477,12 @@ def gen_image_map_switch_string(image_table, angle_to_gl): > for angle_format in sorted(astc_tpl_map.keys()): > switch_data += gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, > astc_tpl_map) >- switch_data += "#elif TARGET_OS_WATCH || TARGET_OS_TV\n" >+ switch_data += "#elif TARGET_OS_TV ||TARGET_OS_WATCH\n" > > for angle_format in sorted(astc_tpl_map.keys()): > switch_data += gen_image_map_switch_astc_case_tv_watchos(angle_format, angle_to_gl, > astc_tpl_map) >- switch_data += "#endif // TARGET_OS_IOS \n " >+ switch_data += "#endif // TARGET_OS_IOS\n " > # iOS specific > switch_data += "#elif TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST\n" > for angle_format in sorted(ios_specific_map.keys()): >@@ -480,17 +491,17 @@ def gen_image_map_switch_string(image_table, angle_to_gl): > for angle_format in sorted(ios_override.keys()): > switch_data += gen_image_map_switch_simple_case(angle_format, ios_override[angle_format], > angle_to_gl, ios_angle_to_mtl) >- switch_data += "#if TARGET_OS_IOS \n" >+ switch_data += "#if TARGET_OS_IOS\n" > for angle_format in sorted(astc_tpl_map.keys()): > switch_data += gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, > astc_tpl_map) > >- switch_data += "#elif TARGET_OS_WATCH || TARGET_OS_TV\n" >+ switch_data += "#elif TARGET_OS_TV ||TARGET_OS_WATCH\n" > > for angle_format in sorted(astc_tpl_map.keys()): > switch_data += gen_image_map_switch_astc_case_tv_watchos(angle_format, angle_to_gl, > astc_tpl_map) >- switch_data += "#endif // TARGET_OS_IOS \n" >+ switch_data += "#endif // TARGET_OS_IOS || TARGET_OS_TV\n" > switch_data += "#endif // TARGET_OS_IPHONE\n" > > # Try to support all iOS formats on newer macOS with Apple GPU. >@@ -508,7 +519,7 @@ def gen_image_map_switch_string(image_table, angle_to_gl): > for angle_format in sorted(astc_tpl_map.keys()): > switch_data += gen_image_map_switch_astc_case_iosmac(angle_format, angle_to_gl, > astc_tpl_map) >- switch_data += "#endif // TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600)) \n" >+ switch_data += "#endif // TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000)) \n" > > switch_data += " default:\n" > switch_data += " this->metalFormat = MTLPixelFormatInvalid;\n" >@@ -537,7 +548,7 @@ def gen_image_mtl_to_angle_switch_string(image_table): > switch_data += "#endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST\n" > > # iOS + macOS 11.0+ specific >- switch_data += "#if TARGET_OS_IPHONE || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600))\n" >+ switch_data += "#if TARGET_OS_IPHONE || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000))\n" > for angle_format in sorted(ios_specific_map.keys()): > # ETC1_R8G8B8_UNORM_BLOCK is a duplicated of ETC2_R8G8B8_UNORM_BLOCK > if angle_format == 'ETC1_R8G8B8_UNORM_BLOCK': >@@ -578,12 +589,12 @@ def gen_vertex_map_switch_case(angle_fmt, actual_angle_fmt, angle_to_mtl_map, ov > actual_angle_format_packed=angle_fmt_packed, > vertex_copy_function_packed=copy_function_packed, > default_alpha_packed=default_alpha_packed, >- same_gl_type_packed=same_gl_type_packed, >+ same_gl_type_packed=wrap_actual_same_gl_type(same_gl_type_packed), > mtl_format=mtl_format, > actual_angle_format=actual_angle_fmt, > vertex_copy_function=copy_function, > default_alpha=default_alpha, >- same_gl_type=same_gl_type) >+ same_gl_type=wrap_actual_same_gl_type(same_gl_type)) > else: > # This format has no packed buffer's override, return ordinary block. > return case_vertex_format_template1.format( >@@ -592,7 +603,7 @@ def gen_vertex_map_switch_case(angle_fmt, actual_angle_fmt, angle_to_mtl_map, ov > actual_angle_format=actual_angle_fmt, > vertex_copy_function=copy_function, > default_alpha=default_alpha, >- same_gl_type=same_gl_type) >+ same_gl_type=wrap_actual_same_gl_type(same_gl_type)) > > > def gen_vertex_map_switch_string(vertex_table): >@@ -622,7 +633,7 @@ def gen_mtl_format_caps_init_string(map_image): > caps = map_image['caps'] > mac_caps = map_image['caps_mac'] > ios_platform_caps = map_image['caps_ios_platform'] >- ios_specific_caps = map_image['caps_ios_spcific'] >+ ios_specific_caps = map_image['caps_ios_specific'] > caps_init_str = '' > > def cap_to_param(caps, key): >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.h >index 063aef3de906f2648210e303288f175249092d35..98ea22a6c5183cbee0ccda496aff4bbbe6dec167 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.h >@@ -131,6 +131,8 @@ class CommandBuffer final : public WrappedObject<id<MTLCommandBuffer>>, angle::N > void setActiveCommandEncoder(CommandEncoder *encoder); > void invalidateActiveCommandEncoder(CommandEncoder *encoder); > >+ bool needsFlushForDrawCallLimits() const; >+ > private: > void set(id<MTLCommandBuffer> metalBuffer); > void cleanup(); >@@ -146,6 +148,9 @@ class CommandBuffer final : public WrappedObject<id<MTLCommandBuffer>>, angle::N > void pushDebugGroupImpl(const std::string &marker); > void popDebugGroupImpl(); > >+ void setResourceUsedByCommandBuffer(const ResourceRef &resource); >+ void clearResourceListAndSize(); >+ > using ParentClass = WrappedObject<id<MTLCommandBuffer>>; > > CommandQueue &mCmdQueue; >@@ -158,10 +163,11 @@ class CommandBuffer final : public WrappedObject<id<MTLCommandBuffer>>, angle::N > > std::vector<std::string> mPendingDebugSigns; > std::vector<std::pair<mtl::SharedEventRef, uint64_t>> mPendingSignalEvents; >- > std::vector<std::string> mDebugGroups; > >- bool mCommitted = false; >+ std::unordered_set<id> mResourceList; >+ size_t mWorkingResourceSize = 0; >+ bool mCommitted = false; > }; > > class CommandEncoder : public WrappedObject<id<MTLCommandEncoder>>, angle::NonCopyable >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.mm >index e5758648d9af5c5709dc7f07fde23d16b2f19f22..0442224ff961afdd618d9c266ead58c30d9e533d 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_command_buffer.mm >@@ -603,6 +603,36 @@ void CommandBuffer::present(id<CAMetalDrawable> presentationDrawable) > [get() presentDrawable:presentationDrawable]; > } > >+void CommandBuffer::setResourceUsedByCommandBuffer(const ResourceRef &resource) >+{ >+ if (resource) >+ { >+ auto result = mResourceList.insert(resource->getID()); >+ // If we were able to add a unique Metal resource ID to the list, count it. >+ // >+ // Note that we store Metal IDs here, properly retained in non-ARC environments, rather than >+ // the ResourceRefs. There are some assumptions in TextureMtl in particular about weak refs >+ // to temporary textures being cleared out eagerly. Holding on to additional references here >+ // implies that that texture is still being used, and would require additional code to clear >+ // out temporary render targets upon texture redefinition. >+ if (result.second) >+ { >+ [resource->getID() ANGLE_MTL_RETAIN]; >+ mWorkingResourceSize += resource->estimatedByteSize(); >+ } >+ } >+} >+ >+void CommandBuffer::clearResourceListAndSize() >+{ >+ for (const id &metalID : mResourceList) >+ { >+ [metalID ANGLE_MTL_RELEASE]; >+ } >+ mResourceList.clear(); >+ mWorkingResourceSize = 0; >+} >+ > void CommandBuffer::setWriteDependency(const ResourceRef &resource) > { > if (!resource) >@@ -618,11 +648,13 @@ void CommandBuffer::setWriteDependency(const ResourceRef &resource) > } > > resource->setUsedByCommandBufferWithQueueSerial(mQueueSerial, true); >+ setResourceUsedByCommandBuffer(resource); > } > > void CommandBuffer::setReadDependency(const ResourceRef &resource) > { > setReadDependency(resource.get()); >+ setResourceUsedByCommandBuffer(resource); > } > > void CommandBuffer::setReadDependency(Resource *resource) >@@ -642,6 +674,11 @@ void CommandBuffer::setReadDependency(Resource *resource) > resource->setUsedByCommandBufferWithQueueSerial(mQueueSerial, false); > } > >+bool CommandBuffer::needsFlushForDrawCallLimits() const >+{ >+ return mWorkingResourceSize > kMaximumResidentMemorySizeInBytes; >+} >+ > void CommandBuffer::restart() > { > uint64_t serial = 0; >@@ -657,7 +694,7 @@ void CommandBuffer::restart() > { > pushDebugGroupImpl(marker); > } >- >+ clearResourceListAndSize(); > ASSERT(metalCmdBuffer); > } > >@@ -797,6 +834,8 @@ bool CommandBuffer::commitImpl() > > // Do the actual commit > [get() commit]; >+ // Reset the working resource set. >+ clearResourceListAndSize(); > mCommitted = true; > return true; > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_common.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_common.h >index 9eb25a2bc73c8627497e06e4c5c4e9515d51a15e..be3249e992fa3863ca61654b12523c94f7a41d3b 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_common.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_common.h >@@ -142,6 +142,11 @@ constexpr size_t kInlineConstDataMaxSize = 4 * 1024; > constexpr size_t kDefaultUniformsMaxSize = 4 * 1024; > constexpr uint32_t kMaxViewports = 1; > >+// Restrict in-flight resource usage to 400 MB. >+// A render pass can use more than 400MB, but the command buffer >+// will be flushed next time >+constexpr const size_t kMaximumResidentMemorySizeInBytes = 400 * 1024 * 1024; >+ > constexpr uint32_t kVertexAttribBufferStrideAlignment = 4; > // Alignment requirement for offset passed to setVertex|FragmentBuffer > #if TARGET_OS_OSX || TARGET_OS_MACCATALYST >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_map.json b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_map.json >index 6d801914b4bb1ab1a1769f921b5a3b07127c787a..c4520cdf3b8f4d89fb46b5efc965826e03556bc8 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_map.json >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_map.json >@@ -74,6 +74,7 @@ > "D32_FLOAT": "MTLPixelFormatDepth32Float", > "S8_UINT": "MTLPixelFormatStencil8", > "D32_FLOAT_S8X24_UINT": "MTLPixelFormatDepth32Float_Stencil8", >+ "B10G10R10A2_UNORM": "MTLPixelFormatBGR10A2Unorm", > "R10G10B10A2_UINT": "MTLPixelFormatRGB10A2Uint", > "R10G10B10A2_UNORM": "MTLPixelFormatRGB10A2Unorm", > "R11G11B10_FLOAT": "MTLPixelFormatRG11B10Float", >@@ -104,22 +105,30 @@ > "EAC_R11_SNORM_BLOCK": "MTLPixelFormatEAC_R11Snorm", > "EAC_R11G11_UNORM_BLOCK": "MTLPixelFormatEAC_RG11Unorm", > "EAC_R11G11_SNORM_BLOCK": "MTLPixelFormatEAC_RG11Snorm", >- "ASTC_4x4_SRGB_BLOCK" : "MTLPixelFormatASTC_4x4_sRGB", >- "ASTC_5x4_SRGB_BLOCK" : "MTLPixelFormatASTC_5x4_sRGB", >- "ASTC_5x5_SRGB_BLOCK" : "MTLPixelFormatASTC_5x5_sRGB", >- "ASTC_6x5_SRGB_BLOCK" : "MTLPixelFormatASTC_6x5_sRGB", >- "ASTC_6x6_SRGB_BLOCK" : "MTLPixelFormatASTC_6x6_sRGB", >- "ASTC_8x5_SRGB_BLOCK" : "MTLPixelFormatASTC_8x5_sRGB", >- "ASTC_8x6_SRGB_BLOCK" : "MTLPixelFormatASTC_8x6_sRGB", >- "ASTC_8x8_SRGB_BLOCK" : "MTLPixelFormatASTC_8x8_sRGB", >- "ASTC_10x5_SRGB_BLOCK" : "MTLPixelFormatASTC_10x5_sRGB", >- "ASTC_10x6_SRGB_BLOCK" : "MTLPixelFormatASTC_10x6_sRGB", >- "ASTC_10x8_SRGB_BLOCK" : "MTLPixelFormatASTC_10x8_sRGB", >- "ASTC_10x10_SRGB_BLOCK" : "MTLPixelFormatASTC_10x10_sRGB", >- "ASTC_12x10_SRGB_BLOCK" : "MTLPixelFormatASTC_12x10_sRGB", >- "ASTC_12x12_SRGB_BLOCK" : "MTLPixelFormatASTC_12x12_sRGB" >+ "ASTC_4x4_SRGB_BLOCK": "MTLPixelFormatASTC_4x4_sRGB", >+ "ASTC_5x4_SRGB_BLOCK": "MTLPixelFormatASTC_5x4_sRGB", >+ "ASTC_5x5_SRGB_BLOCK": "MTLPixelFormatASTC_5x5_sRGB", >+ "ASTC_6x5_SRGB_BLOCK": "MTLPixelFormatASTC_6x5_sRGB", >+ "ASTC_6x6_SRGB_BLOCK": "MTLPixelFormatASTC_6x6_sRGB", >+ "ASTC_8x5_SRGB_BLOCK": "MTLPixelFormatASTC_8x5_sRGB", >+ "ASTC_8x6_SRGB_BLOCK": "MTLPixelFormatASTC_8x6_sRGB", >+ "ASTC_8x8_SRGB_BLOCK": "MTLPixelFormatASTC_8x8_sRGB", >+ "ASTC_10x5_SRGB_BLOCK": "MTLPixelFormatASTC_10x5_sRGB", >+ "ASTC_10x6_SRGB_BLOCK": "MTLPixelFormatASTC_10x6_sRGB", >+ "ASTC_10x8_SRGB_BLOCK": "MTLPixelFormatASTC_10x8_sRGB", >+ "ASTC_10x10_SRGB_BLOCK": "MTLPixelFormatASTC_10x10_sRGB", >+ "ASTC_12x10_SRGB_BLOCK": "MTLPixelFormatASTC_12x10_sRGB", >+ "ASTC_12x12_SRGB_BLOCK": "MTLPixelFormatASTC_12x12_sRGB" > }, > "map_sim": { >+ "PVRTC1_RGB_4BPP_UNORM_BLOCK": "MTLPixelFormatPVRTC_RGB_4BPP", >+ "PVRTC1_RGB_2BPP_UNORM_BLOCK": "MTLPixelFormatPVRTC_RGB_2BPP", >+ "PVRTC1_RGBA_4BPP_UNORM_BLOCK": "MTLPixelFormatPVRTC_RGBA_4BPP", >+ "PVRTC1_RGBA_2BPP_UNORM_BLOCK": "MTLPixelFormatPVRTC_RGBA_2BPP", >+ "PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK": "MTLPixelFormatPVRTC_RGB_2BPP_sRGB", >+ "PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK": "MTLPixelFormatPVRTC_RGB_4BPP_sRGB", >+ "PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK": "MTLPixelFormatPVRTC_RGBA_2BPP_sRGB", >+ "PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK": "MTLPixelFormatPVRTC_RGBA_4BPP_sRGB", > "ETC1_R8G8B8_UNORM_BLOCK": "MTLPixelFormatETC2_RGB8", > "ETC2_R8G8B8_UNORM_BLOCK": "MTLPixelFormatETC2_RGB8", > "ETC2_R8G8B8_SRGB_BLOCK": "MTLPixelFormatETC2_RGB8_sRGB", >@@ -247,8 +256,6 @@ > "d24s8_fallbacks_mac": { > "D24_UNORM_S8_UINT": "D32_FLOAT_S8X24_UINT" > }, >- "fallbacks_ios": { >- }, > "caps": { > "MTLPixelFormatA8Unorm":{ > "filterable": "true", >@@ -356,7 +363,7 @@ > }, > "MTLPixelFormatRGBA8Unorm_sRGB":{ > "filterable": "true", >- "writable": "display->supportsAppleGPUFamily(2)", >+ "writable": "display->supportsAppleGPUFamily(2) && !display->isSimulator()", > "blendable": "true", > "multisample": "true", > "resolve": "true", >@@ -380,7 +387,7 @@ > }, > "MTLPixelFormatBGRA8Unorm_sRGB":{ > "filterable": "true", >- "writable": "display->supportsAppleGPUFamily(2)", >+ "writable": "display->supportsAppleGPUFamily(2) && !display->isSimulator()", > "blendable": "true", > "multisample": "true", > "resolve": "true", >@@ -888,7 +895,7 @@ > "filterable": "display->supportsAppleGPUFamily(2)" > } > }, >- "caps_ios_spcific" : >+ "caps_ios_specific" : > { > "MTLPixelFormatASTC_4x4_HDR":{ > "filterable": "display->supportsAppleGPUFamily(6)" >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm >index 1c1414b7c658bb736d4a30f3ab0ea6cda042a5f0..c6b74bc4c2bba54ef224054b9868a32e163e1272 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_format_table_autogen.mm >@@ -33,6 +33,8 @@ angle::FormatID Format::MetalToAngleFormatID(MTLPixelFormat formatMtl) > { > case MTLPixelFormatA8Unorm: > return angle::FormatID::A8_UNORM; >+ case MTLPixelFormatBGR10A2Unorm: >+ return angle::FormatID::B10G10R10A2_UNORM; > case MTLPixelFormatBGRA8Unorm: > return angle::FormatID::B8G8R8A8_UNORM; > case MTLPixelFormatBGRA8Unorm_sRGB: >@@ -159,7 +161,7 @@ angle::FormatID Format::MetalToAngleFormatID(MTLPixelFormat formatMtl) > case MTLPixelFormatDepth24Unorm_Stencil8: > return angle::FormatID::D24_UNORM_S8_UINT; > #endif // TARGET_OS_OSX || TARGET_OS_MACCATALYST >-#if TARGET_OS_IPHONE || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600)) >+#if TARGET_OS_IPHONE || (TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000)) > case MTLPixelFormatASTC_10x10_sRGB: > return angle::FormatID::ASTC_10x10_SRGB_BLOCK; > case MTLPixelFormatASTC_10x5_sRGB: >@@ -312,477 +314,324 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatA8Unorm; > this->actualFormatId = angle::FormatID::A8_UNORM; >- this->initFunction = nullptr; >+ break; >+ >+ case angle::FormatID::B10G10R10A2_UNORM: > >- this->swizzled = false; >+ this->metalFormat = MTLPixelFormatBGR10A2Unorm; >+ this->actualFormatId = angle::FormatID::B10G10R10A2_UNORM; > break; > > case angle::FormatID::B8G8R8A8_UNORM: > > this->metalFormat = MTLPixelFormatBGRA8Unorm; > this->actualFormatId = angle::FormatID::B8G8R8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::B8G8R8A8_UNORM_SRGB: > > this->metalFormat = MTLPixelFormatBGRA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::B8G8R8A8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D32_FLOAT: > > this->metalFormat = MTLPixelFormatDepth32Float; > this->actualFormatId = angle::FormatID::D32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D32_FLOAT_S8X24_UINT: > > this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; > this->actualFormatId = angle::FormatID::D32_FLOAT_S8X24_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::NONE: > > this->metalFormat = MTLPixelFormatInvalid; > this->actualFormatId = angle::FormatID::NONE; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R10G10B10A2_UINT: > > this->metalFormat = MTLPixelFormatRGB10A2Uint; > this->actualFormatId = angle::FormatID::R10G10B10A2_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R10G10B10A2_UNORM: > > this->metalFormat = MTLPixelFormatRGB10A2Unorm; > this->actualFormatId = angle::FormatID::R10G10B10A2_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R11G11B10_FLOAT: > > this->metalFormat = MTLPixelFormatRG11B10Float; > this->actualFormatId = angle::FormatID::R11G11B10_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16A16_FLOAT: > > this->metalFormat = MTLPixelFormatRGBA16Float; > this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16A16_SINT: > > this->metalFormat = MTLPixelFormatRGBA16Sint; > this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16A16_SNORM: > > this->metalFormat = MTLPixelFormatRGBA16Snorm; > this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16A16_UINT: > > this->metalFormat = MTLPixelFormatRGBA16Uint; > this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16A16_UNORM: > > this->metalFormat = MTLPixelFormatRGBA16Unorm; > this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16_FLOAT: > > this->metalFormat = MTLPixelFormatRG16Float; > this->actualFormatId = angle::FormatID::R16G16_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16_SINT: > > this->metalFormat = MTLPixelFormatRG16Sint; > this->actualFormatId = angle::FormatID::R16G16_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16_SNORM: > > this->metalFormat = MTLPixelFormatRG16Snorm; > this->actualFormatId = angle::FormatID::R16G16_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16_UINT: > > this->metalFormat = MTLPixelFormatRG16Uint; > this->actualFormatId = angle::FormatID::R16G16_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16_UNORM: > > this->metalFormat = MTLPixelFormatRG16Unorm; > this->actualFormatId = angle::FormatID::R16G16_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16_FLOAT: > > this->metalFormat = MTLPixelFormatR16Float; > this->actualFormatId = angle::FormatID::R16_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16_SINT: > > this->metalFormat = MTLPixelFormatR16Sint; > this->actualFormatId = angle::FormatID::R16_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16_SNORM: > > this->metalFormat = MTLPixelFormatR16Snorm; > this->actualFormatId = angle::FormatID::R16_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16_UINT: > > this->metalFormat = MTLPixelFormatR16Uint; > this->actualFormatId = angle::FormatID::R16_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16_UNORM: > > this->metalFormat = MTLPixelFormatR16Unorm; > this->actualFormatId = angle::FormatID::R16_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32B32A32_FLOAT: > > this->metalFormat = MTLPixelFormatRGBA32Float; > this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32B32A32_SINT: > > this->metalFormat = MTLPixelFormatRGBA32Sint; > this->actualFormatId = angle::FormatID::R32G32B32A32_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32B32A32_UINT: > > this->metalFormat = MTLPixelFormatRGBA32Uint; > this->actualFormatId = angle::FormatID::R32G32B32A32_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32_FLOAT: > > this->metalFormat = MTLPixelFormatRG32Float; > this->actualFormatId = angle::FormatID::R32G32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32_SINT: > > this->metalFormat = MTLPixelFormatRG32Sint; > this->actualFormatId = angle::FormatID::R32G32_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32_UINT: > > this->metalFormat = MTLPixelFormatRG32Uint; > this->actualFormatId = angle::FormatID::R32G32_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32_FLOAT: > > this->metalFormat = MTLPixelFormatR32Float; > this->actualFormatId = angle::FormatID::R32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32_SINT: > > this->metalFormat = MTLPixelFormatR32Sint; > this->actualFormatId = angle::FormatID::R32_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32_UINT: > > this->metalFormat = MTLPixelFormatR32Uint; > this->actualFormatId = angle::FormatID::R32_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8A8_SINT: > > this->metalFormat = MTLPixelFormatRGBA8Sint; > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8A8_SNORM: > > this->metalFormat = MTLPixelFormatRGBA8Snorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8A8_UINT: > > this->metalFormat = MTLPixelFormatRGBA8Uint; > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8A8_UNORM: > > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8A8_UNORM_SRGB: > > this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8_SINT: > > this->metalFormat = MTLPixelFormatRG8Sint; > this->actualFormatId = angle::FormatID::R8G8_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8_SNORM: > > this->metalFormat = MTLPixelFormatRG8Snorm; > this->actualFormatId = angle::FormatID::R8G8_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8_UINT: > > this->metalFormat = MTLPixelFormatRG8Uint; > this->actualFormatId = angle::FormatID::R8G8_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8_UNORM: > > this->metalFormat = MTLPixelFormatRG8Unorm; > this->actualFormatId = angle::FormatID::R8G8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8_SINT: > > this->metalFormat = MTLPixelFormatR8Sint; > this->actualFormatId = angle::FormatID::R8_SINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8_SNORM: > > this->metalFormat = MTLPixelFormatR8Snorm; > this->actualFormatId = angle::FormatID::R8_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8_UINT: > > this->metalFormat = MTLPixelFormatR8Uint; > this->actualFormatId = angle::FormatID::R8_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8_UNORM: > > this->metalFormat = MTLPixelFormatR8Unorm; > this->actualFormatId = angle::FormatID::R8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R9G9B9E5_SHAREDEXP: > > this->metalFormat = MTLPixelFormatRGB9E5Float; > this->actualFormatId = angle::FormatID::R9G9B9E5_SHAREDEXP; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::S8_UINT: > > this->metalFormat = MTLPixelFormatStencil8; > this->actualFormatId = angle::FormatID::S8_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::A16_FLOAT: > > this->metalFormat = MTLPixelFormatRGBA16Float; > this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::A32_FLOAT: > > this->metalFormat = MTLPixelFormatRGBA32Float; > this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D24_UNORM_X8_UINT: > > this->metalFormat = MTLPixelFormatDepth32Float; > this->actualFormatId = angle::FormatID::D32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D32_UNORM: > > this->metalFormat = MTLPixelFormatDepth32Float; > this->actualFormatId = angle::FormatID::D32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::L16A16_FLOAT: > > this->metalFormat = MTLPixelFormatRGBA16Float; > this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::L16_FLOAT: >@@ -791,17 +640,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; > this->initFunction = > Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>; >- >- this->swizzled = false; > break; > > case angle::FormatID::L32A32_FLOAT: > > this->metalFormat = MTLPixelFormatRGBA32Float; > this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::L32_FLOAT: >@@ -810,17 +654,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; > this->initFunction = Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, > 0x00000000, gl::Float32One>; >- >- this->swizzled = false; > break; > > case angle::FormatID::L8A8_UNORM: > > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::L8_UNORM: >@@ -828,8 +667,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16_FLOAT: >@@ -838,8 +675,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; > this->initFunction = > Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16_SINT: >@@ -847,8 +682,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA16Sint; > this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; > this->initFunction = Initialize4ComponentData<GLshort, 0x0000, 0x0000, 0x0000, 0x0001>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16_SNORM: >@@ -856,8 +689,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA16Snorm; > this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; > this->initFunction = Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x7FFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16_UINT: >@@ -865,8 +696,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA16Uint; > this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; > this->initFunction = Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x0001>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R16G16B16_UNORM: >@@ -874,8 +703,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA16Unorm; > this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x0000, 0x0000, 0x0000, 0xFFFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32B32_FLOAT: >@@ -884,8 +711,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; > this->initFunction = Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, > 0x00000000, gl::Float32One>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32B32_SINT: >@@ -894,8 +719,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R32G32B32A32_SINT; > this->initFunction = > Initialize4ComponentData<GLint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R32G32B32_UINT: >@@ -904,8 +727,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R32G32B32A32_UINT; > this->initFunction = > Initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000, 0x00000001>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8_SINT: >@@ -913,8 +734,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Sint; > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->initFunction = Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x01>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8_SNORM: >@@ -922,8 +741,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Snorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; > this->initFunction = Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x7F>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8_UINT: >@@ -931,8 +748,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Uint; > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0x01>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8_UNORM: >@@ -940,8 +755,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8B8_UNORM_SRGB: >@@ -949,8 +762,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > #if TARGET_OS_OSX || TARGET_OS_MACCATALYST >@@ -958,126 +769,84 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatBC1_RGBA; > this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatBC1_RGBA_sRGB; > this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC2_RGBA_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatBC2_RGBA; > this->actualFormatId = angle::FormatID::BC2_RGBA_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatBC2_RGBA_sRGB; > this->actualFormatId = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC3_RGBA_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatBC3_RGBA; > this->actualFormatId = angle::FormatID::BC3_RGBA_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatBC3_RGBA_sRGB; > this->actualFormatId = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC4_RED_SNORM_BLOCK: > > this->metalFormat = MTLPixelFormatBC4_RSnorm; > this->actualFormatId = angle::FormatID::BC4_RED_SNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC4_RED_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatBC4_RUnorm; > this->actualFormatId = angle::FormatID::BC4_RED_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC5_RG_SNORM_BLOCK: > > this->metalFormat = MTLPixelFormatBC5_RGSnorm; > this->actualFormatId = angle::FormatID::BC5_RG_SNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC5_RG_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatBC5_RGUnorm; > this->actualFormatId = angle::FormatID::BC5_RG_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC6H_RGB_SFLOAT_BLOCK: > > this->metalFormat = MTLPixelFormatBC6H_RGBFloat; > this->actualFormatId = angle::FormatID::BC6H_RGB_SFLOAT_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC6H_RGB_UFLOAT_BLOCK: > > this->metalFormat = MTLPixelFormatBC6H_RGBUfloat; > this->actualFormatId = angle::FormatID::BC6H_RGB_UFLOAT_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC7_RGBA_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatBC7_RGBAUnorm; > this->actualFormatId = angle::FormatID::BC7_RGBA_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC7_RGBA_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatBC7_RGBAUnorm_sRGB; > this->actualFormatId = angle::FormatID::BC7_RGBA_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D24_UNORM_S8_UINT: >@@ -1087,25 +856,18 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatDepth24Unorm_Stencil8; > this->actualFormatId = angle::FormatID::D24_UNORM_S8_UINT; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; > this->actualFormatId = angle::FormatID::D32_FLOAT_S8X24_UINT; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::D16_UNORM: > > this->metalFormat = MTLPixelFormatDepth32Float; > this->actualFormatId = angle::FormatID::D32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::BC1_RGB_UNORM_BLOCK: >@@ -1115,10 +877,8 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatBC1_RGBA; > this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = true; >- this->swizzle = {GL_RED, GL_GREEN, GL_BLUE, GL_ONE}; >+ this->swizzled = true; >+ this->swizzle = {GL_RED, GL_GREEN, GL_BLUE, GL_ONE}; > } > else > # endif // #if defined(__IPHONE_13_0) || defined(__MAC_10_15) >@@ -1126,9 +886,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatBC1_RGBA; > this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > } > break; > >@@ -1139,10 +896,8 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatBC1_RGBA_sRGB; > this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = true; >- this->swizzle = {GL_RED, GL_GREEN, GL_BLUE, GL_ONE}; >+ this->swizzled = true; >+ this->swizzle = {GL_RED, GL_GREEN, GL_BLUE, GL_ONE}; > } > else > # endif // #if defined(__IPHONE_13_0) || defined(__MAC_10_15) >@@ -1150,9 +905,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatBC1_RGBA_sRGB; > this->actualFormatId = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > } > break; > >@@ -1162,36 +914,24 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatRG16Snorm; > this->actualFormatId = angle::FormatID::R16G16_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11G11_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatRG16Unorm; > this->actualFormatId = angle::FormatID::R16G16_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_SNORM_BLOCK: > > this->metalFormat = MTLPixelFormatR16Snorm; > this->actualFormatId = angle::FormatID::R16_SNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatR16Unorm; > this->actualFormatId = angle::FormatID::R16_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK: >@@ -1199,17 +939,13 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; >+ this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > break; > > case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK: >@@ -1217,26 +953,18 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK: >@@ -1244,8 +972,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK: >@@ -1253,26 +979,18 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::R4G4B4A4_UNORM: > > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G5B5A1_UNORM: > > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G6B5_UNORM: >@@ -1280,8 +998,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > #endif >@@ -1290,261 +1006,222 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatASTC_10x10_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x10_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x8_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x10_sRGB; > this->actualFormatId = angle::FormatID::ASTC_12x10_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x12_sRGB; > this->actualFormatId = angle::FormatID::ASTC_12x12_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_4x4_sRGB; > this->actualFormatId = angle::FormatID::ASTC_4x4_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x4_sRGB; > this->actualFormatId = angle::FormatID::ASTC_5x4_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_5x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_6x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_6x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x8_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11G11_SNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RG11Snorm; > this->actualFormatId = angle::FormatID::EAC_R11G11_SNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11G11_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RG11Unorm; > this->actualFormatId = angle::FormatID::EAC_R11G11_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_SNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_R11Snorm; > this->actualFormatId = angle::FormatID::EAC_R11_SNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_R11Unorm; > this->actualFormatId = angle::FormatID::EAC_R11_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8; > this->actualFormatId = angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8A1_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8A1; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK; >- this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RGBA8_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RGBA8; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK; >- this->initFunction = nullptr; >+ break; >+ >+ case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK; >+ break; >+ >+ case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP_sRGB; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK; >+ break; >+ >+ case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK; >+ break; >+ >+ case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP_sRGB; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK; >+ break; >+ >+ case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK; >+ break; >+ >+ case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP_sRGB; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK; >+ break; >+ >+ case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK; >+ break; > >- this->swizzled = false; >+ case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK: >+ >+ this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP_sRGB; >+ this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK; > break; > > case angle::FormatID::D16_UNORM: > > this->metalFormat = MTLPixelFormatDepth32Float; > this->actualFormatId = angle::FormatID::D32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D24_UNORM_S8_UINT: > > this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; > this->actualFormatId = angle::FormatID::D32_FLOAT_S8X24_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R4G4B4A4_UNORM: > > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G5B5A1_UNORM: > > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G6B5_UNORM: >@@ -1552,8 +1229,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > # if TARGET_OS_IOS >@@ -1563,16 +1238,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x10_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_UNORM_BLOCK: >@@ -1581,16 +1252,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_UNORM_BLOCK: >@@ -1599,16 +1266,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_UNORM_BLOCK: >@@ -1617,16 +1280,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x8_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_UNORM_BLOCK: >@@ -1635,16 +1294,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_12x10_HDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_12x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_UNORM_BLOCK: >@@ -1653,16 +1308,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_12x12_HDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_12x12_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_UNORM_BLOCK: >@@ -1671,16 +1322,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_4x4_HDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_4x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_UNORM_BLOCK: >@@ -1689,16 +1336,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_5x4_HDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_5x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_UNORM_BLOCK: >@@ -1707,16 +1350,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_5x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_5x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_UNORM_BLOCK: >@@ -1725,16 +1364,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_6x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_6x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_UNORM_BLOCK: >@@ -1743,16 +1378,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_6x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_6x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_UNORM_BLOCK: >@@ -1761,16 +1392,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_UNORM_BLOCK: >@@ -1779,16 +1406,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_UNORM_BLOCK: >@@ -1797,143 +1420,97 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x8_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > >-# elif TARGET_OS_WATCH || TARGET_OS_TV >+# elif TARGET_OS_TV || TARGET_OS_WATCH > case angle::FormatID::ASTC_10x10_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x12_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_4x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > # endif // TARGET_OS_IOS >@@ -1942,360 +1519,240 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatASTC_10x10_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x10_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x8_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x10_sRGB; > this->actualFormatId = angle::FormatID::ASTC_12x10_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x12_sRGB; > this->actualFormatId = angle::FormatID::ASTC_12x12_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_4x4_sRGB; > this->actualFormatId = angle::FormatID::ASTC_4x4_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x4_sRGB; > this->actualFormatId = angle::FormatID::ASTC_5x4_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_5x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_6x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_6x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x8_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11G11_SNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RG11Snorm; > this->actualFormatId = angle::FormatID::EAC_R11G11_SNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11G11_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RG11Unorm; > this->actualFormatId = angle::FormatID::EAC_R11G11_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_SNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_R11Snorm; > this->actualFormatId = angle::FormatID::EAC_R11_SNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_R11Unorm; > this->actualFormatId = angle::FormatID::EAC_R11_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8; > this->actualFormatId = angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8A1_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8A1; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK; >- this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RGBA8_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatEAC_RGBA8; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatETC2_RGB8; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R4G4B4A4_UNORM: > > this->metalFormat = MTLPixelFormatABGR4Unorm; > this->actualFormatId = angle::FormatID::R4G4B4A4_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G5B5A1_UNORM: > > this->metalFormat = MTLPixelFormatA1BGR5Unorm; > this->actualFormatId = angle::FormatID::R5G5B5A1_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G6B5_UNORM: > > this->metalFormat = MTLPixelFormatB5G6R5Unorm; > this->actualFormatId = angle::FormatID::R5G6B5_UNORM; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8_UNORM_SRGB: > > this->metalFormat = MTLPixelFormatRG8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8_UNORM_SRGB: > > this->metalFormat = MTLPixelFormatR8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D16_UNORM: > > this->metalFormat = MTLPixelFormatDepth32Float; > this->actualFormatId = angle::FormatID::D32_FLOAT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::D24_UNORM_S8_UINT: > > this->metalFormat = MTLPixelFormatDepth32Float_Stencil8; > this->actualFormatId = angle::FormatID::D32_FLOAT_S8X24_UINT; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > # if TARGET_OS_IOS >@@ -2305,16 +1762,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x10_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_UNORM_BLOCK: >@@ -2323,16 +1776,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_UNORM_BLOCK: >@@ -2341,16 +1790,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_UNORM_BLOCK: >@@ -2359,16 +1804,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x8_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_UNORM_BLOCK: >@@ -2377,16 +1818,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_12x10_HDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_12x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_UNORM_BLOCK: >@@ -2395,16 +1832,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_12x12_HDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_12x12_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_UNORM_BLOCK: >@@ -2413,16 +1846,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_4x4_HDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_4x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_UNORM_BLOCK: >@@ -2431,16 +1860,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_5x4_HDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_5x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_UNORM_BLOCK: >@@ -2449,16 +1874,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_5x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_5x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_UNORM_BLOCK: >@@ -2467,16 +1888,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_6x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_6x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_UNORM_BLOCK: >@@ -2485,16 +1902,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_6x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_6x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_UNORM_BLOCK: >@@ -2503,16 +1916,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_UNORM_BLOCK: >@@ -2521,16 +1930,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_UNORM_BLOCK: >@@ -2539,16 +1944,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x8_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > # elif TARGET_OS_WATCH || TARGET_OS_TV >@@ -2556,126 +1957,84 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatASTC_10x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x12_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_4x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > # endif // TARGET_OS_IOS >@@ -2685,126 +2044,84 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > > this->metalFormat = MTLPixelFormatASTC_10x10_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x10_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_10x8_sRGB; > this->actualFormatId = angle::FormatID::ASTC_10x8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x10_sRGB; > this->actualFormatId = angle::FormatID::ASTC_12x10_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_12x12_sRGB; > this->actualFormatId = angle::FormatID::ASTC_12x12_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_4x4_sRGB; > this->actualFormatId = angle::FormatID::ASTC_4x4_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x4_sRGB; > this->actualFormatId = angle::FormatID::ASTC_5x4_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_5x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_5x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_6x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_6x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_6x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x5_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x5_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x6_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x6_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatASTC_8x8_sRGB; > this->actualFormatId = angle::FormatID::ASTC_8x8_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11G11_SNORM_BLOCK: >@@ -2813,16 +2130,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatEAC_RG11Snorm; > this->actualFormatId = angle::FormatID::EAC_R11G11_SNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatRG16Snorm; > this->actualFormatId = angle::FormatID::R16G16_SNORM; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11G11_UNORM_BLOCK: >@@ -2831,16 +2144,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatEAC_RG11Unorm; > this->actualFormatId = angle::FormatID::EAC_R11G11_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatRG16Unorm; > this->actualFormatId = angle::FormatID::R16G16_UNORM; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_SNORM_BLOCK: >@@ -2849,16 +2158,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatEAC_R11Snorm; > this->actualFormatId = angle::FormatID::EAC_R11_SNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatR16Snorm; > this->actualFormatId = angle::FormatID::R16_SNORM; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::EAC_R11_UNORM_BLOCK: >@@ -2867,16 +2172,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatEAC_R11Unorm; > this->actualFormatId = angle::FormatID::EAC_R11_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatR16Unorm; > this->actualFormatId = angle::FormatID::R16_UNORM; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK: >@@ -2885,7 +2186,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatETC2_RGB8; > this->actualFormatId = angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { >@@ -2893,8 +2193,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK: >@@ -2903,16 +2201,13 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatETC2_RGB8A1_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; >- this->initFunction = nullptr; >+ this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK: >@@ -2921,7 +2216,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatETC2_RGB8A1; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK; >- this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > } > else > { >@@ -2929,8 +2223,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK: >@@ -2939,16 +2231,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatEAC_RGBA8_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatRGBA8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK: >@@ -2957,16 +2245,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatEAC_RGBA8; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK: >@@ -2975,7 +2259,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatETC2_RGB8_sRGB; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK; >- this->initFunction = nullptr; > } > else > { >@@ -2983,8 +2266,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM_SRGB; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK: >@@ -2993,7 +2274,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatETC2_RGB8; > this->actualFormatId = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { >@@ -3001,80 +2281,54 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_2BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGBA_4BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_2BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK: > > this->metalFormat = MTLPixelFormatPVRTC_RGB_4BPP_sRGB; > this->actualFormatId = angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R4G4B4A4_UNORM: >@@ -3083,16 +2337,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatABGR4Unorm; > this->actualFormatId = angle::FormatID::R4G4B4A4_UNORM; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G5B5A1_UNORM: >@@ -3101,16 +2351,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatA1BGR5Unorm; > this->actualFormatId = angle::FormatID::R5G5B5A1_UNORM; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatRGBA8Unorm; > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::R5G6B5_UNORM: >@@ -3119,7 +2365,6 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatB5G6R5Unorm; > this->actualFormatId = angle::FormatID::R5G6B5_UNORM; >- this->initFunction = nullptr; > } > else > { >@@ -3127,26 +2372,18 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->initFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::R8G8_UNORM_SRGB: > > this->metalFormat = MTLPixelFormatRG8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8G8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::R8_UNORM_SRGB: > > this->metalFormat = MTLPixelFormatR8Unorm_sRGB; > this->actualFormatId = angle::FormatID::R8_UNORM_SRGB; >- this->initFunction = nullptr; >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x10_UNORM_BLOCK: >@@ -3155,16 +2392,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x10_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x5_UNORM_BLOCK: >@@ -3173,16 +2406,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x6_UNORM_BLOCK: >@@ -3191,16 +2420,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_10x8_UNORM_BLOCK: >@@ -3209,16 +2434,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_10x8_HDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_10x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_10x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x10_UNORM_BLOCK: >@@ -3227,16 +2448,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_12x10_HDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_12x10_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x10_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_12x12_UNORM_BLOCK: >@@ -3245,16 +2462,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_12x12_HDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_12x12_LDR; > this->actualFormatId = angle::FormatID::ASTC_12x12_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_4x4_UNORM_BLOCK: >@@ -3263,16 +2476,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_4x4_HDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_4x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_4x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x4_UNORM_BLOCK: >@@ -3281,16 +2490,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_5x4_HDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_5x4_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x4_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_5x5_UNORM_BLOCK: >@@ -3299,16 +2504,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_5x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_5x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_5x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x5_UNORM_BLOCK: >@@ -3317,16 +2518,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_6x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_6x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_6x6_UNORM_BLOCK: >@@ -3335,16 +2532,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_6x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_6x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_6x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x5_UNORM_BLOCK: >@@ -3353,16 +2546,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x5_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x5_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x5_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x6_UNORM_BLOCK: >@@ -3371,16 +2560,12 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x6_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x6_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x6_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > > case angle::FormatID::ASTC_8x8_UNORM_BLOCK: >@@ -3389,19 +2574,15 @@ void Format::init(const DisplayMtl *display, angle::FormatID intendedFormatId_) > { > this->metalFormat = MTLPixelFormatASTC_8x8_HDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } > else > { > this->metalFormat = MTLPixelFormatASTC_8x8_LDR; > this->actualFormatId = angle::FormatID::ASTC_8x8_UNORM_BLOCK; >- this->initFunction = nullptr; > } >- >- this->swizzled = false; > break; > >-#endif // TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101600)) >+#endif // TARGET_OS_OSX && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 110000)) > default: > this->metalFormat = MTLPixelFormatInvalid; > this->actualFormatId = angle::FormatID::NONE; >@@ -3428,7 +2609,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R10G10B10A2_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R10G10B10A2_UNORM: >@@ -3436,7 +2616,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R10G10B10A2_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16A16_FLOAT: >@@ -3444,7 +2623,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16A16_SINT: >@@ -3452,7 +2630,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16A16_SNORM: >@@ -3460,7 +2637,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16A16_SSCALED: >@@ -3468,7 +2644,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16A16_UINT: >@@ -3476,7 +2651,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16A16_UNORM: >@@ -3484,7 +2658,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16A16_USCALED: >@@ -3492,7 +2665,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16B16_FLOAT: >@@ -3502,7 +2674,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 3, 4, gl::Float16One>; > this->defaultAlpha = gl::Float16One; >- this->actualSameGLType = true; > } > else > { >@@ -3510,7 +2681,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3521,7 +2691,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -3529,7 +2698,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3540,8 +2708,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_SNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLshort, 3, 4, std::numeric_limits<GLshort>::max()>; >- this->defaultAlpha = std::numeric_limits<GLshort>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLshort>::max(); > } > else > { >@@ -3549,7 +2716,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3560,7 +2726,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -3568,7 +2733,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3579,7 +2743,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -3587,7 +2750,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3598,8 +2760,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_UNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLushort, 3, 4, std::numeric_limits<GLushort>::max()>; >- this->defaultAlpha = std::numeric_limits<GLushort>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLushort>::max(); > } > else > { >@@ -3607,7 +2768,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3618,7 +2778,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16A16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -3626,7 +2785,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16B16_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3635,7 +2793,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16_SINT: >@@ -3643,7 +2800,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16_SNORM: >@@ -3651,7 +2807,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16_SSCALED: >@@ -3659,7 +2814,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16_UINT: >@@ -3667,7 +2821,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16_UNORM: >@@ -3675,7 +2828,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16G16_USCALED: >@@ -3683,7 +2835,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R16_FLOAT: >@@ -3693,7 +2844,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 1, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > else > { >@@ -3701,7 +2851,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLhalf, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3712,7 +2861,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > else > { >@@ -3720,7 +2868,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3731,7 +2878,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > else > { >@@ -3739,7 +2885,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3750,7 +2895,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > else > { >@@ -3758,7 +2902,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLshort, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3769,7 +2912,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > else > { >@@ -3777,7 +2919,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3788,7 +2929,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > else > { >@@ -3796,7 +2936,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3807,7 +2946,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16G16_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > else > { >@@ -3815,7 +2953,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R16_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLushort, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3824,7 +2961,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32B32A32_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32B32A32_SINT: >@@ -3832,7 +2968,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32B32A32_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLint, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32B32A32_UINT: >@@ -3840,7 +2975,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32B32A32_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLuint, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32B32_FLOAT: >@@ -3848,7 +2982,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32B32_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32B32_SINT: >@@ -3856,7 +2989,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32B32_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLint, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32B32_UINT: >@@ -3864,7 +2996,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32B32_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLuint, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32_FLOAT: >@@ -3872,7 +3003,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32_SINT: >@@ -3880,7 +3010,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLint, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32G32_UINT: >@@ -3888,7 +3017,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32G32_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLuint, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32_FLOAT: >@@ -3896,7 +3024,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32_FLOAT; > this->vertexLoadFunction = CopyNativeVertexData<GLfloat, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32_SINT: >@@ -3904,7 +3031,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLint, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R32_UINT: >@@ -3912,7 +3038,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R32_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R8G8B8A8_SINT: >@@ -3920,7 +3045,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R8G8B8A8_SNORM: >@@ -3928,7 +3052,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R8G8B8A8_SSCALED: >@@ -3936,7 +3059,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R8G8B8A8_UINT: >@@ -3944,7 +3066,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R8G8B8A8_UNORM: >@@ -3952,7 +3073,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R8G8B8A8_USCALED: >@@ -3960,7 +3080,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > break; > > case angle::FormatID::R8G8B8_SINT: >@@ -3970,7 +3089,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -3978,7 +3096,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -3989,8 +3106,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLbyte, 3, 4, std::numeric_limits<GLbyte>::max()>; >- this->defaultAlpha = std::numeric_limits<GLbyte>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLbyte>::max(); > } > else > { >@@ -3998,7 +3114,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4009,7 +3124,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4017,7 +3131,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4028,7 +3141,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4036,7 +3148,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4047,8 +3158,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLubyte, 3, 4, std::numeric_limits<GLubyte>::max()>; >- this->defaultAlpha = std::numeric_limits<GLubyte>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLubyte>::max(); > } > else > { >@@ -4056,7 +3166,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4067,7 +3176,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4075,7 +3183,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4086,7 +3193,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4094,7 +3200,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4105,8 +3210,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLbyte, 2, 4, std::numeric_limits<GLbyte>::max()>; >- this->defaultAlpha = std::numeric_limits<GLbyte>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLbyte>::max(); > } > else > { >@@ -4114,7 +3218,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4125,7 +3228,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4133,7 +3235,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4144,7 +3245,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4152,7 +3252,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4163,8 +3262,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLubyte, 2, 4, std::numeric_limits<GLubyte>::max()>; >- this->defaultAlpha = std::numeric_limits<GLubyte>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLubyte>::max(); > } > else > { >@@ -4172,7 +3270,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4183,7 +3280,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4191,7 +3287,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 2, 2, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4202,7 +3297,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4210,7 +3304,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4221,8 +3314,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLbyte, 1, 4, std::numeric_limits<GLbyte>::max()>; >- this->defaultAlpha = std::numeric_limits<GLbyte>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLbyte>::max(); > } > else > { >@@ -4230,7 +3322,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8_SNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4241,7 +3332,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_SINT; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4249,7 +3339,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8_SSCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLbyte, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4260,7 +3349,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4268,7 +3356,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4279,8 +3366,7 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UNORM; > this->vertexLoadFunction = > CopyNativeVertexData<GLubyte, 1, 4, std::numeric_limits<GLubyte>::max()>; >- this->defaultAlpha = std::numeric_limits<GLubyte>::max(); >- this->actualSameGLType = true; >+ this->defaultAlpha = std::numeric_limits<GLubyte>::max(); > } > else > { >@@ -4288,7 +3374,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8_UNORM; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4299,7 +3384,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8G8B8A8_UINT; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 4, 1>; > this->defaultAlpha = 1; >- this->actualSameGLType = true; > } > else > { >@@ -4307,7 +3391,6 @@ void VertexFormat::init(angle::FormatID angleFormatId, bool tightlyPacked) > this->actualFormatId = angle::FormatID::R8_USCALED; > this->vertexLoadFunction = CopyNativeVertexData<GLubyte, 1, 1, 0>; > this->defaultAlpha = 0; >- this->actualSameGLType = true; > } > break; > >@@ -4538,9 +3621,9 @@ void FormatTable::initNativeFormatCapsAutogen(const DisplayMtl *display) > /** colorRenderable*/ true, /** depthRenderable*/ false); > > setFormatCaps(MTLPixelFormatBGRA8Unorm_sRGB, /** filterable*/ true, >- /** writable*/ display->supportsAppleGPUFamily(2), /** blendable*/ true, >- /** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true, >- /** depthRenderable*/ false); >+ /** writable*/ display->supportsAppleGPUFamily(2) && !display->isSimulator(), >+ /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, >+ /** colorRenderable*/ true, /** depthRenderable*/ false); > > setFormatCaps(MTLPixelFormatDepth32Float, > /** filterable*/ display->supports32BitFloatFiltering(), /** writable*/ false, >@@ -4737,9 +3820,9 @@ void FormatTable::initNativeFormatCapsAutogen(const DisplayMtl *display) > /** colorRenderable*/ true, /** depthRenderable*/ false); > > setFormatCaps(MTLPixelFormatRGBA8Unorm_sRGB, /** filterable*/ true, >- /** writable*/ display->supportsAppleGPUFamily(2), /** blendable*/ true, >- /** multisample*/ true, /** resolve*/ true, /** colorRenderable*/ true, >- /** depthRenderable*/ false); >+ /** writable*/ display->supportsAppleGPUFamily(2) && !display->isSimulator(), >+ /** blendable*/ true, /** multisample*/ true, /** resolve*/ true, >+ /** colorRenderable*/ true, /** depthRenderable*/ false); > > setFormatCaps(MTLPixelFormatStencil8, /** filterable*/ false, /** writable*/ false, > /** blendable*/ false, /** multisample*/ true, /** resolve*/ false, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_utils.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_utils.mm >index a11ce9b15a2b74d5b813bd77077088789da3c983..e2ecc0359897c7eea2cc2c54228bd531252ea33a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_utils.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_glslang_utils.mm >@@ -13,6 +13,7 @@ > #include <spirv_msl.hpp> > > #include "common/apple_platform_utils.h" >+#include "libANGLE/renderer/ShaderInterfaceVariableInfoMap.h" > #include "libANGLE/renderer/glslang_wrapper_utils.h" > #include "libANGLE/renderer/metal/DisplayMtl.h" > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.h >index b51378a00cd52675cad63554d800c8dc311a413c..19a97408796c78694e60daf86c018d3b434a4216 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.h >@@ -71,6 +71,9 @@ class Resource : angle::NonCopyable > bool isCPUReadMemDirty() const { return mUsageRef->cpuReadMemDirty; } > void resetCPUReadMemDirty() { mUsageRef->cpuReadMemDirty = false; } > >+ virtual size_t estimatedByteSize() const = 0; >+ virtual id getID() const = 0; >+ > protected: > Resource(); > // Share the GPU usage ref with other resource >@@ -269,6 +272,9 @@ class Texture final : public Resource, > > // Explicitly sync content between CPU and GPU > void syncContent(ContextMtl *context, mtl::BlitCommandEncoder *encoder); >+ void setEstimatedByteSize(size_t bytes) { mEstimatedByteSize = bytes; } >+ size_t estimatedByteSize() const override { return mEstimatedByteSize; } >+ id getID() const override { return get(); } > > private: > using ParentClass = WrappedObject<id<MTLTexture>>; >@@ -335,6 +341,8 @@ class Texture final : public Resource, > TextureRef mStencilView; > // Readable copy of texture > TextureRef mReadCopy; >+ >+ size_t mEstimatedByteSize = 0; > }; > > class Buffer final : public Resource, >@@ -385,6 +393,9 @@ class Buffer final : public Resource, > // Explicitly sync content between CPU and GPU > void syncContent(ContextMtl *context, mtl::BlitCommandEncoder *encoder); > >+ size_t estimatedByteSize() const override { return size(); } >+ id getID() const override { return get(); } >+ > private: > Buffer(ContextMtl *context, bool forceUseSharedMem, size_t size, const uint8_t *data); > Buffer(ContextMtl *context, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.mm >index 06a5cd0847a32f69b773c6651b8b68ca3d7edafd..0f9b53b6d2e086e0689b6bf62228e14d8e7f6a35 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_resources.mm >@@ -291,7 +291,6 @@ angle::Result Texture::MakeTexture(ContextMtl *context, > return angle::Result::Stop; > } > refOut->reset(new Texture(context, desc, mips, renderTargetOnly, allowFormatView, memoryLess)); >- > if (!refOut || !refOut->get()) > { > ANGLE_MTL_CHECK(context, false, GL_OUT_OF_MEMORY); >@@ -301,6 +300,13 @@ angle::Result Texture::MakeTexture(ContextMtl *context, > refOut->get()->setColorWritableMask(GetEmulatedColorWriteMask(mtlFormat)); > } > >+ size_t estimatedBytes = EstimateTextureSizeInBytes( >+ mtlFormat, desc.width, desc.height, desc.depth, desc.sampleCount, desc.mipmapLevelCount); >+ if (refOut) >+ { >+ refOut->get()->setEstimatedByteSize(memoryLess ? 0 : estimatedBytes); >+ } >+ > return angle::Result::Continue; > } > >@@ -312,6 +318,7 @@ angle::Result Texture::MakeTexture(ContextMtl *context, > bool renderTargetOnly, > TextureRef *refOut) > { >+ > refOut->reset(new Texture(context, desc, surfaceRef, slice, renderTargetOnly)); > > if (!(*refOut) || !(*refOut)->get()) >@@ -323,6 +330,10 @@ angle::Result Texture::MakeTexture(ContextMtl *context, > refOut->get()->setColorWritableMask(GetEmulatedColorWriteMask(mtlFormat)); > } > >+ size_t estimatedBytes = EstimateTextureSizeInBytes( >+ mtlFormat, desc.width, desc.height, desc.depth, desc.sampleCount, desc.mipmapLevelCount); >+ refOut->get()->setEstimatedByteSize(estimatedBytes); >+ > return angle::Result::Continue; > } > >@@ -456,6 +467,8 @@ Texture::Texture(Texture *original, MTLPixelFormat format) > auto view = [original->get() newTextureViewWithPixelFormat:format]; > > set([view ANGLE_MTL_AUTORELEASE]); >+ // Texture views consume no additional memory >+ mEstimatedByteSize = 0; > } > } > >@@ -471,6 +484,8 @@ Texture::Texture(Texture *original, MTLTextureType type, NSRange mipmapLevelRang > slices:slices]; > > set([view ANGLE_MTL_AUTORELEASE]); >+ // Texture views consume no additional memory >+ mEstimatedByteSize = 0; > } > } > >@@ -489,6 +504,8 @@ Texture::Texture(Texture *original, const TextureSwizzleChannels &swizzle) > swizzle:swizzle]; > > set([view ANGLE_MTL_AUTORELEASE]); >+ // Texture views consume no additional memory >+ mEstimatedByteSize = 0; > } > #else > UNREACHABLE(); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_state_cache.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_state_cache.h >index c1666c927ea8f2e160592ff9af082a226d6cdb59..2ad4551b1499a96b1ca5685bd742a1b22321e521 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_state_cache.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_state_cache.h >@@ -308,6 +308,7 @@ struct alignas(4) ProvokingVertexComputePipelineDesc > gl::PrimitiveMode primitiveMode; > uint8_t elementType; > bool primitiveRestartEnabled; >+ bool generateIndices; > }; > > struct RenderPassAttachmentDesc >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.h >index a77588c9073919e95c916afe35619cd8131eb7e7..b236d92655d0307bb0b61ce51bf6406e9e934e96 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.h >@@ -156,6 +156,12 @@ MTLColorWriteMask GetEmulatedColorWriteMask(const mtl::Format &mtlFormat, > bool *emulatedChannelsOut); > MTLColorWriteMask GetEmulatedColorWriteMask(const mtl::Format &mtlFormat); > bool IsFormatEmulated(const mtl::Format &mtlFormat); >+size_t EstimateTextureSizeInBytes(const mtl::Format &mtlFormat, >+ size_t width, >+ size_t height, >+ size_t depth, >+ size_t sampleCount, >+ size_t numMips); > > NSUInteger GetMaxRenderTargetSizeForDeviceInBytes(const mtl::ContextDevice &device); > NSUInteger GetMaxNumberOfRenderTargetsForDevice(const mtl::ContextDevice &device); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm >index 8f91f431dd7ddda21443feb4fa47dbb0714e5c34..ced5a7bd5d75be570979806f851782bdf9879077 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/mtl_utils.mm >@@ -375,7 +375,10 @@ angle::Result InitializeTextureContents(const gl::Context *context, > GLint layer, startDepth; > GetSliceAndDepth(index, &layer, &startDepth); > >- if (intendedInternalFormat.compressed) >+ // Use compressed texture initialization only when both the intended and the actual ANGLE >+ // formats are compressed. Emulated opaque ETC2 formats use uncompressed fallbacks and require >+ // custom initialization. >+ if (intendedInternalFormat.compressed && textureObjFormat.actualAngleFormat().isBlock) > { > return InitializeCompressedTextureContents(context, texture, textureObjFormat, index, layer, > startDepth); >@@ -1182,6 +1185,36 @@ bool IsFormatEmulated(const mtl::Format &mtlFormat) > return isFormatEmulated; > } > >+size_t EstimateTextureSizeInBytes(const mtl::Format &mtlFormat, >+ size_t width, >+ size_t height, >+ size_t depth, >+ size_t sampleCount, >+ size_t numMips) >+{ >+ size_t textureSizeInBytes; >+ if (mtlFormat.getCaps().compressed) >+ { >+ GLuint textureSize; >+ gl::Extents size((int)width, (int)height, (int)depth); >+ if (!mtlFormat.intendedInternalFormat().computeCompressedImageSize(size, &textureSize)) >+ { >+ return 0; >+ } >+ textureSizeInBytes = textureSize; >+ } >+ else >+ { >+ textureSizeInBytes = mtlFormat.getCaps().pixelBytes * width * height * depth * sampleCount; >+ } >+ if (numMips > 1) >+ { >+ // Estimate mipmap size. >+ textureSizeInBytes = textureSizeInBytes * 4 / 3; >+ } >+ return textureSizeInBytes; >+} >+ > MTLClearColor EmulatedAlphaClearColor(MTLClearColor color, MTLColorWriteMask colorMask) > { > MTLClearColor re = color; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/gen_indices.metal b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/gen_indices.metal >index eed61ea83bd6399c153d02f7e64bc99ee8f04fb2..ecea885af32065ad1cb92f6588caab5c2e8dd847 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/gen_indices.metal >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/gen_indices.metal >@@ -135,9 +135,11 @@ kernel void genTriFanIndicesFromArray(uint idx [[thread_position_in_grid]], > > uint vertexIdx = options.firstVertex + 2 + idx; > >- output[3 * idx] = options.firstVertex; >- output[3 * idx + 1] = vertexIdx - 1; >- output[3 * idx + 2] = vertexIdx; >+ // Triangle fan provoking vertex by default is i+1, not pivot >+ // vertex. >+ output[3 * idx ] = vertexIdx - 1; >+ output[3 * idx + 1] = vertexIdx; >+ output[3 * idx + 2] = options.firstVertex; > } > > inline uint getIndexU32(uint offset, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc >index 373b212434bff456c5a9b01b9f4f9e4c731b6372..14e4772b4d03b1cb56a335b97bba2f192bb8c728 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc >@@ -14,7 +14,7 @@ static char gDefaultMetallibSrc[] = R"( > # 1 "temp_master_source.metal" > # 1 "<built-in>" 1 > # 1 "<built-in>" 3 >-# 396 "<built-in>" 3 >+# 433 "<built-in>" 3 > # 1 "<command line>" 1 > # 1 "<built-in>" 2 > # 1 "temp_master_source.metal" 2 >@@ -837,9 +837,11 @@ kernel void genTriFanIndicesFromArray(uint idx [[thread_position_in_grid]], > > uint vertexIdx = options.firstVertex + 2 + idx; > >- output[3 * idx] = options.firstVertex; >- output[3 * idx + 1] = vertexIdx - 1; >- output[3 * idx + 2] = vertexIdx; >+ >+ >+ output[3 * idx ] = vertexIdx - 1; >+ output[3 * idx + 1] = vertexIdx; >+ output[3 * idx + 2] = options.firstVertex; > } > > inline uint getIndexU32(uint offset, >@@ -3374,25 +3376,221 @@ kernel void fixIndexBuffer( > onOutIndex = prim; > break; > case 0x01U: >- onIndex = prim * 2 + 0; >- onOutIndex = prim * 2 + 0; >+ onIndex = prim * 2; >+ onOutIndex = prim * 2; > break; > case 0x03U: > onIndex = prim; >- onOutIndex = prim * 2 + 0; >+ onOutIndex = prim * 2; > break; > case 0x04U: >- onIndex = prim * 3 + 0; >- onOutIndex = prim * 3 + 0; >+ onIndex = prim * 3; >+ onOutIndex = prim * 3; > break; > case 0x05U: > onIndex = prim; >- onOutIndex = prim * 3 + 0; >+ onOutIndex = prim * 3; > break; > } > outputPrimitive(indexBufferUint16, indexBufferUint32, outIndexBufferUint16, outIndexBufferUint32, restartIndex, indexCount, baseIndex, onIndex, onOutIndex); > } > } >+ >+ >+ >+static inline void generatePrimitive( >+ device ushort *outIndexBufferUint16, >+ device uint *outIndexBufferUint32, >+ const uint firstVertex, >+ const uint indexCount, >+ thread uint &baseIndex, >+ uint onIndex, >+ uint primCount, >+ thread uint &onOutIndex >+ ) >+{ >+ if(baseIndex > onIndex) return; >+# 284 "./rewrite_indices.metal" >+ switch(fixIndexBufferMode) >+ { >+ case 0x00U: >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = onIndex + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = onIndex + firstVertex; } onOutIndex++; }); >+ } >+ break; >+ case 0x01U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x02U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = (onIndex + 1) % primCount; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x03U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x04U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ auto tmpIndex2 = onIndex + 2; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x05U: >+ { >+ uint isOdd = ((onIndex - baseIndex) & 1); >+ auto tmpIndex0 = onIndex + 0 + isOdd; >+ auto tmpIndex1 = onIndex + 1 - isOdd; >+ auto tmpIndex2 = onIndex + 2; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ if(isOdd) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ >+ assert(onOutIndex <= (onIndex + 1) * 3); >+ assert(onOutIndex <= (indexCount - 2) * 3); >+ break; >+ } >+ case 0x06U: >+ { >+ auto tmpIndex0 = 0; >+ auto tmpIndex1 = onIndex + 1; >+ auto tmpIndex2 = onIndex + 2; >+ >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ >+ } >+ >+} >+ >+ >+ >+kernel void genIndexBuffer( >+ device ushort *outIndexBufferUint16 [[ buffer(1), function_constant(outIndexBufferIsUint16) ]], >+ device uint *outIndexBufferUint32 [[ buffer(1), function_constant(outIndexBufferIsUint32) ]], >+ constant uint &indexCount [[ buffer(2) ]], >+ constant uint &primCount [[ buffer(3) ]], >+ constant uint &firstVertex [[ buffer(4) ]], >+ uint prim [[thread_position_in_grid]]) >+{ >+ uint baseIndex = 0; >+ uint onIndex = onIndex; >+ uint onOutIndex = onOutIndex; >+ if(prim < primCount) >+ { >+ switch(fixIndexBufferMode) >+ { >+ case 0x00U: >+ onIndex = prim; >+ onOutIndex = prim; >+ break; >+ case 0x01U: >+ onIndex = prim * 2; >+ onOutIndex = prim * 2; >+ break; >+ case 0x03U: >+ onIndex = prim; >+ onOutIndex = prim * 2; >+ break; >+ case 0x02U: >+ onIndex = prim; >+ onOutIndex = prim * 2; >+ break; >+ case 0x04U: >+ onIndex = prim * 3; >+ onOutIndex = prim * 3; >+ break; >+ case 0x05U: >+ onIndex = prim; >+ onOutIndex = prim * 3; >+ break; >+ case 0x06U: >+ onIndex = prim; >+ onOutIndex = prim * 3; >+ break; >+ } >+ generatePrimitive(outIndexBufferUint16, outIndexBufferUint32, firstVertex, indexCount, baseIndex, onIndex, primCount, onOutIndex); >+ } >+} > # 8 "temp_master_source.metal" 2 > > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.metal b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.metal >index dfde096c0a9c7905b57a46d621f86c4f4b21974e..1300f377cc02b0abdb7d0d83db1be04cdae5617a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.metal >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.metal >@@ -11,7 +11,7 @@ > # 1 "temp_master_source.metal" > # 1 "<built-in>" 1 > # 1 "<built-in>" 3 >-# 396 "<built-in>" 3 >+# 433 "<built-in>" 3 > # 1 "<command line>" 1 > # 1 "<built-in>" 2 > # 1 "temp_master_source.metal" 2 >@@ -834,9 +834,11 @@ kernel void genTriFanIndicesFromArray(uint idx [[thread_position_in_grid]], > > uint vertexIdx = options.firstVertex + 2 + idx; > >- output[3 * idx] = options.firstVertex; >- output[3 * idx + 1] = vertexIdx - 1; >- output[3 * idx + 2] = vertexIdx; >+ >+ >+ output[3 * idx ] = vertexIdx - 1; >+ output[3 * idx + 1] = vertexIdx; >+ output[3 * idx + 2] = options.firstVertex; > } > > inline uint getIndexU32(uint offset, >@@ -3371,24 +3373,220 @@ kernel void fixIndexBuffer( > onOutIndex = prim; > break; > case 0x01U: >- onIndex = prim * 2 + 0; >- onOutIndex = prim * 2 + 0; >+ onIndex = prim * 2; >+ onOutIndex = prim * 2; > break; > case 0x03U: > onIndex = prim; >- onOutIndex = prim * 2 + 0; >+ onOutIndex = prim * 2; > break; > case 0x04U: >- onIndex = prim * 3 + 0; >- onOutIndex = prim * 3 + 0; >+ onIndex = prim * 3; >+ onOutIndex = prim * 3; > break; > case 0x05U: > onIndex = prim; >- onOutIndex = prim * 3 + 0; >+ onOutIndex = prim * 3; > break; > } > outputPrimitive(indexBufferUint16, indexBufferUint32, outIndexBufferUint16, outIndexBufferUint32, restartIndex, indexCount, baseIndex, onIndex, onOutIndex); > } > } >+ >+ >+ >+static inline void generatePrimitive( >+ device ushort *outIndexBufferUint16, >+ device uint *outIndexBufferUint32, >+ const uint firstVertex, >+ const uint indexCount, >+ thread uint &baseIndex, >+ uint onIndex, >+ uint primCount, >+ thread uint &onOutIndex >+ ) >+{ >+ if(baseIndex > onIndex) return; >+# 284 "./rewrite_indices.metal" >+ switch(fixIndexBufferMode) >+ { >+ case 0x00U: >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = onIndex + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = onIndex + firstVertex; } onOutIndex++; }); >+ } >+ break; >+ case 0x01U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x02U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = (onIndex + 1) % primCount; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x03U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x04U: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ auto tmpIndex2 = onIndex + 2; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ case 0x05U: >+ { >+ uint isOdd = ((onIndex - baseIndex) & 1); >+ auto tmpIndex0 = onIndex + 0 + isOdd; >+ auto tmpIndex1 = onIndex + 1 - isOdd; >+ auto tmpIndex2 = onIndex + 2; >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ if(isOdd) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ >+ assert(onOutIndex <= (onIndex + 1) * 3); >+ assert(onOutIndex <= (indexCount - 2) * 3); >+ break; >+ } >+ case 0x06U: >+ { >+ auto tmpIndex0 = 0; >+ auto tmpIndex1 = onIndex + 1; >+ auto tmpIndex2 = onIndex + 2; >+ >+ if(fixIndexBufferKey & 0x00200U) >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ } >+ else >+ { >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex1 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex1 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex2 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex2 + firstVertex; } onOutIndex++; }); >+ ({ if(outIndexBufferIsUint16) { outIndexBufferUint16[(onOutIndex)] = tmpIndex0 + firstVertex; } if(outIndexBufferIsUint32) { outIndexBufferUint32[(onOutIndex)] = tmpIndex0 + firstVertex; } onOutIndex++; }); >+ } >+ } >+ break; >+ >+ } >+ >+} >+ >+ >+ >+kernel void genIndexBuffer( >+ device ushort *outIndexBufferUint16 [[ buffer(1), function_constant(outIndexBufferIsUint16) ]], >+ device uint *outIndexBufferUint32 [[ buffer(1), function_constant(outIndexBufferIsUint32) ]], >+ constant uint &indexCount [[ buffer(2) ]], >+ constant uint &primCount [[ buffer(3) ]], >+ constant uint &firstVertex [[ buffer(4) ]], >+ uint prim [[thread_position_in_grid]]) >+{ >+ uint baseIndex = 0; >+ uint onIndex = onIndex; >+ uint onOutIndex = onOutIndex; >+ if(prim < primCount) >+ { >+ switch(fixIndexBufferMode) >+ { >+ case 0x00U: >+ onIndex = prim; >+ onOutIndex = prim; >+ break; >+ case 0x01U: >+ onIndex = prim * 2; >+ onOutIndex = prim * 2; >+ break; >+ case 0x03U: >+ onIndex = prim; >+ onOutIndex = prim * 2; >+ break; >+ case 0x02U: >+ onIndex = prim; >+ onOutIndex = prim * 2; >+ break; >+ case 0x04U: >+ onIndex = prim * 3; >+ onOutIndex = prim * 3; >+ break; >+ case 0x05U: >+ onIndex = prim; >+ onOutIndex = prim * 3; >+ break; >+ case 0x06U: >+ onIndex = prim; >+ onOutIndex = prim * 3; >+ break; >+ } >+ generatePrimitive(outIndexBufferUint16, outIndexBufferUint32, firstVertex, indexCount, baseIndex, onIndex, primCount, onOutIndex); >+ } >+} > # 8 "temp_master_source.metal" 2 > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices.metal b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices.metal >index 965e54bedd593a09f1b5e6f33737c7083356e9f9..10f940566c1f049218486f2a60e785c34900f080 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices.metal >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices.metal >@@ -235,22 +235,229 @@ kernel void fixIndexBuffer( > onOutIndex = prim; > break; > case MtlFixIndexBufferKeyLines: >- onIndex = prim * 2 + 0; >- onOutIndex = prim * 2 + 0; >+ onIndex = prim * 2; >+ onOutIndex = prim * 2; > break; > case MtlFixIndexBufferKeyLineStrip: > onIndex = prim; >- onOutIndex = prim * 2 + 0; >+ onOutIndex = prim * 2; > break; > case MtlFixIndexBufferKeyTriangles: >- onIndex = prim * 3 + 0; >- onOutIndex = prim * 3 + 0; >+ onIndex = prim * 3; >+ onOutIndex = prim * 3; > break; > case MtlFixIndexBufferKeyTriangleStrip: > onIndex = prim; >- onOutIndex = prim * 3 + 0; >+ onOutIndex = prim * 3; > break; > } > outputPrimitive(indexBufferUint16, indexBufferUint32, outIndexBufferUint16, outIndexBufferUint32, restartIndex, indexCount, baseIndex, onIndex, onOutIndex); > } > } >+ >+ >+ >+static inline void generatePrimitive( >+ device ushort *outIndexBufferUint16, >+ device uint *outIndexBufferUint32, >+ const uint firstVertex, >+ const uint indexCount, >+ thread uint &baseIndex, >+ uint onIndex, >+ uint primCount, >+ thread uint &onOutIndex >+ ) >+{ >+ if(baseIndex > onIndex) return; // skipped indices while processing >+#define WRITE_IDX(_idx, _val) \ >+({ \ >+ if(outIndexBufferIsUint16) \ >+ { \ >+ outIndexBufferUint16[(_idx)] = _val + firstVertex; \ >+ } \ >+ if(outIndexBufferIsUint32) \ >+ { \ >+ outIndexBufferUint32[(_idx)] = _val + firstVertex; \ >+ } \ >+ _idx++; \ >+}) >+ switch(fixIndexBufferMode) >+ { >+ case MtlFixIndexBufferKeyPoints: >+ { >+ WRITE_IDX(onOutIndex, onIndex); >+ } >+ break; >+ case MtlFixIndexBufferKeyLines: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ if(fixIndexBufferKey & MtlFixIndexBufferKeyProvokingVertexLast) >+ { >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ } >+ else >+ { >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ } >+ } >+ break; >+ case MtlFixIndexBufferKeyLineLoop: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = (onIndex + 1) % primCount; >+ if(fixIndexBufferKey & MtlFixIndexBufferKeyProvokingVertexLast) >+ { >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ } >+ else >+ { >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ } >+ } >+ break; >+ case MtlFixIndexBufferKeyLineStrip: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ if(fixIndexBufferKey & MtlFixIndexBufferKeyProvokingVertexLast) >+ { >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ } >+ else >+ { >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ } >+ } >+ break; >+ case MtlFixIndexBufferKeyTriangles: >+ { >+ auto tmpIndex0 = onIndex + 0; >+ auto tmpIndex1 = onIndex + 1; >+ auto tmpIndex2 = onIndex + 2; >+ if(fixIndexBufferKey & MtlFixIndexBufferKeyProvokingVertexLast) >+ { >+ WRITE_IDX(onOutIndex, tmpIndex2); >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ } >+ else >+ { >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ WRITE_IDX(onOutIndex, tmpIndex2); >+ } >+ } >+ break; >+ case MtlFixIndexBufferKeyTriangleStrip: >+ { >+ uint isOdd = ((onIndex - baseIndex) & 1); // fixes winding. provoking fixed later. >+ auto tmpIndex0 = onIndex + 0 + isOdd; >+ auto tmpIndex1 = onIndex + 1 - isOdd; >+ auto tmpIndex2 = onIndex + 2; >+ if(fixIndexBufferKey & MtlFixIndexBufferKeyProvokingVertexLast) >+ { >+ WRITE_IDX(onOutIndex, tmpIndex2); // 2 is always the provoking vertex .: do not need to do anything special with isOdd >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ } >+ else >+ { >+ if(isOdd) >+ { >+ WRITE_IDX(onOutIndex, tmpIndex1); // in the case of odd this is REALLY (onIndex + 0) // provoking vertex >+ WRITE_IDX(onOutIndex, tmpIndex2); >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ } >+ else >+ { >+ WRITE_IDX(onOutIndex, tmpIndex0); // in the case of even this is (onIndex + 0) // provoking vertex >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ WRITE_IDX(onOutIndex, tmpIndex2); >+ } >+ } >+ // assert never worse that worst-case expansion >+ assert(onOutIndex <= (onIndex + 1) * 3); >+ assert(onOutIndex <= (indexCount - 2) * 3); >+ break; >+ } >+ case MtlFixIndexBufferKeyTriangleFan: >+ { >+ auto tmpIndex0 = 0; >+ auto tmpIndex1 = onIndex + 1; >+ auto tmpIndex2 = onIndex + 2; >+ // Provoking Vertex for triangle fans does not use the pivot index for flat shading data. >+ if(fixIndexBufferKey & MtlFixIndexBufferKeyProvokingVertexLast) >+ { >+ WRITE_IDX(onOutIndex, tmpIndex2); >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ } >+ else >+ { >+ WRITE_IDX(onOutIndex, tmpIndex1); >+ WRITE_IDX(onOutIndex, tmpIndex2); >+ WRITE_IDX(onOutIndex, tmpIndex0); >+ } >+ } >+ break; >+ >+ } >+#undef WRITE_IDX >+} >+ >+ >+ >+kernel void genIndexBuffer( >+ device ushort *outIndexBufferUint16 [[ buffer(1), function_constant(outIndexBufferIsUint16) ]], >+ device uint *outIndexBufferUint32 [[ buffer(1), function_constant(outIndexBufferIsUint32) ]], >+ constant uint &indexCount [[ buffer(2) ]], >+ constant uint &primCount [[ buffer(3) ]], >+ constant uint &firstVertex [[ buffer(4) ]], >+ uint prim [[thread_position_in_grid]]) >+{ >+ uint baseIndex = 0; >+ uint onIndex = onIndex; >+ uint onOutIndex = onOutIndex; >+ if(prim < primCount) >+ { >+ switch(fixIndexBufferMode) >+ { >+ case MtlFixIndexBufferKeyPoints: >+ onIndex = prim; >+ onOutIndex = prim; >+ break; >+ case MtlFixIndexBufferKeyLines: >+ onIndex = prim * 2; >+ onOutIndex = prim * 2; >+ break; >+ case MtlFixIndexBufferKeyLineStrip: >+ onIndex = prim; >+ onOutIndex = prim * 2; >+ break; >+ case MtlFixIndexBufferKeyLineLoop: >+ onIndex = prim; >+ onOutIndex = prim * 2; >+ break; >+ case MtlFixIndexBufferKeyTriangles: >+ onIndex = prim * 3; >+ onOutIndex = prim * 3; >+ break; >+ case MtlFixIndexBufferKeyTriangleStrip: >+ onIndex = prim; >+ onOutIndex = prim * 3; >+ break; >+ case MtlFixIndexBufferKeyTriangleFan: >+ onIndex = prim; >+ onOutIndex = prim * 3; >+ break; >+ } >+ generatePrimitive(outIndexBufferUint16, outIndexBufferUint32, firstVertex, indexCount, baseIndex, onIndex, primCount, onOutIndex); >+ } >+} >\ No newline at end of file >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices_shared.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices_shared.h >index 95706618783a795ebea99a77c6a1716351fc3af8..6a4e13d711baf6ca7f65b755a985b616fd1772e2 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices_shared.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/metal/shaders/rewrite_indices_shared.h >@@ -20,9 +20,11 @@ > #define MtlFixIndexBufferKeyModeShift 4U > #define MtlFixIndexBufferKeyPoints 0x00U > #define MtlFixIndexBufferKeyLines 0x01U >+#define MtlFixIndexBufferKeyLineLoop 0x02U > #define MtlFixIndexBufferKeyLineStrip 0x03U > #define MtlFixIndexBufferKeyTriangles 0x04U > #define MtlFixIndexBufferKeyTriangleStrip 0x05U >+#define MtlFixIndexBufferKeyTriangleFan 0x06U > #define MtlFixIndexBufferKeyPrimRestart 0x00100U > #define MtlFixIndexBufferKeyProvokingVertexLast 0x00200U > #endif /* rewrite_indices_shared_h */ >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/renderer_utils.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/renderer_utils.h >index f1635e198c7a514e1986291409bbd6f7509ebdf5..1943a896ec6ffdce482b8b80141b78133b5bedc1 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/renderer_utils.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/renderer_utils.h >@@ -448,6 +448,15 @@ class ResetBaseVertexBaseInstance : angle::NonCopyable > angle::FormatID ConvertToSRGB(angle::FormatID formatID); > angle::FormatID ConvertToLinear(angle::FormatID formatID); > bool IsOverridableLinearFormat(angle::FormatID formatID); >+ >+enum class PipelineType >+{ >+ Graphics = 0, >+ Compute = 1, >+ >+ InvalidEnum = 2, >+ EnumCount = 2, >+}; > } // namespace rx > > // MultiDraw macro patterns >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/serial_utils.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/serial_utils.h >index 8c45e7ff6ea00f0a112553b494ad71933e4df92a..66330becfd9061f7de38fd7edf5738976605a4c6 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/serial_utils.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/serial_utils.h >@@ -90,8 +90,9 @@ class SerialFactoryBase final : angle::NonCopyable > > Serial generate() > { >- ASSERT(mSerial + 1 > mSerial); >- return Serial(mSerial++); >+ uint64_t current = mSerial++; >+ ASSERT(mSerial > current); // Integer overflow >+ return Serial(current); > } > > private: >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BUILD.gn b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BUILD.gn >index f0ceccc89aeffaacf9d126d87769ff27e7fe6dad..1b2098453d3b57f1bfbcc188f8956e925b7deb3f 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BUILD.gn >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BUILD.gn >@@ -18,6 +18,16 @@ declare_args() { > angle_enable_vulkan_gpu_trace_events = false > } > >+declare_args() { >+ # Enable custom secondary command buffers for outside render pass commands only >+ angle_enable_custom_vulkan_outside_render_pass_cmd_buffers = >+ angle_enable_custom_vulkan_cmd_buffers >+ >+ # Enable custom secondary command buffers for render pass commands only >+ angle_enable_custom_vulkan_render_pass_cmd_buffers = >+ angle_enable_custom_vulkan_cmd_buffers >+} >+ > _vulkan_backend_sources = [ > "BufferVk.cpp", > "BufferVk.h", >@@ -223,8 +233,11 @@ config("angle_vulkan_backend_config") { > if (angle_enable_swiftshader) { > defines += [ "ANGLE_ENABLE_SWIFTSHADER" ] > } >- if (angle_enable_custom_vulkan_cmd_buffers) { >- defines += [ "ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1" ] >+ if (angle_enable_custom_vulkan_outside_render_pass_cmd_buffers) { >+ defines += [ "ANGLE_USE_CUSTOM_VULKAN_OUTSIDE_RENDER_PASS_CMD_BUFFERS=1" ] >+ } >+ if (angle_enable_custom_vulkan_render_pass_cmd_buffers) { >+ defines += [ "ANGLE_USE_CUSTOM_VULKAN_RENDER_PASS_CMD_BUFFERS=1" ] > } > if (angle_enable_vulkan_gpu_trace_events) { > defines += [ "ANGLE_ENABLE_VULKAN_GPU_TRACE_EVENTS=1" ] >@@ -235,7 +248,6 @@ config("angle_vulkan_backend_config") { > } > > angle_source_set("angle_vk_mem_alloc_wrapper") { >- defines = [ "VMA_USE_STL_CONTAINERS=1" ] > deps = [ > "$angle_root/src/common/vulkan:angle_vulkan_headers", > "$angle_vulkan_memory_allocator_dir", >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.cpp >index cfbc98b66294312b880e26bbeb7898f863d25c29..cd532fa00057e775bfb722728438ade81743b8a3 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.cpp >@@ -174,8 +174,9 @@ angle::Result GetMemoryTypeIndex(ContextVk *contextVk, > VkMemoryPropertyFlags memoryPropertyFlags, > uint32_t *memoryTypeIndexOut) > { >- RendererVk *renderer = contextVk->getRenderer(); >- vk::BufferMemoryAllocator &bufferMemoryAllocator = renderer->getBufferMemoryAllocator(); >+ RendererVk *renderer = contextVk->getRenderer(); >+ const vk::Allocator &allocator = renderer->getAllocator(); >+ > bool persistentlyMapped = renderer->getFeatures().persistentlyMappedBuffers.enabled; > VkBufferUsageFlags defaultBufferUsageFlags = GetDefaultBufferUsageFlags(renderer); > >@@ -196,14 +197,13 @@ angle::Result GetMemoryTypeIndex(ContextVk *contextVk, > > // Check that the allocation is not too large. > uint32_t memoryTypeIndex = 0; >- ANGLE_VK_TRY(contextVk, bufferMemoryAllocator.findMemoryTypeIndexForBufferInfo( >- renderer, createInfo, requiredFlags, preferredFlags, >- persistentlyMapped, &memoryTypeIndex)); >+ ANGLE_VK_TRY(contextVk, allocator.findMemoryTypeIndexForBufferInfo( >+ createInfo, requiredFlags, preferredFlags, persistentlyMapped, >+ &memoryTypeIndex)); > *memoryTypeIndexOut = memoryTypeIndex; > > return angle::Result::Continue; > } >- > } // namespace > > // ConversionBuffer implementation. >@@ -212,13 +212,15 @@ ConversionBuffer::ConversionBuffer(RendererVk *renderer, > size_t initialSize, > size_t alignment, > bool hostVisible) >- : dirty(true), lastAllocationOffset(0) >+ : dirty(true) > { >- data.init(renderer, usageFlags, alignment, initialSize, hostVisible, >- vk::DynamicBufferPolicy::OneShotUse); >+ data = std::make_unique<vk::BufferHelper>(); > } > >-ConversionBuffer::~ConversionBuffer() = default; >+ConversionBuffer::~ConversionBuffer() >+{ >+ ASSERT(!data || !data->valid()); >+} > > ConversionBuffer::ConversionBuffer(ConversionBuffer &&other) = default; > >@@ -245,12 +247,9 @@ BufferVk::VertexConversionBuffer::~VertexConversionBuffer() = default; > // BufferVk implementation. > BufferVk::BufferVk(const gl::BufferState &state) > : BufferImpl(state), >- mBuffer(nullptr), > mMemoryTypeIndex(0), > mMemoryPropertyFlags(0), >- mMapInvalidateRangeStagingBuffer(nullptr), >- mMapInvalidateRangeStagingBufferOffset(0), >- mMapInvalidateRangeMappedPtr(nullptr), >+ mIsStagingBufferMapped(false), > mHasValidData(false), > mHasBeenReferencedByGPU(false) > {} >@@ -267,69 +266,20 @@ void BufferVk::destroy(const gl::Context *context) > void BufferVk::release(ContextVk *contextVk) > { > RendererVk *renderer = contextVk->getRenderer(); >- if (mBuffer) >- { >- mBuffer->release(renderer); >- mBuffer.reset(nullptr); >- } >- mShadowBuffer.release(); >- mHostVisibleBufferPool.release(renderer); >- >- for (ConversionBuffer &buffer : mVertexConversionBuffers) >+ if (mBuffer.valid()) > { >- buffer.data.release(renderer); >+ mBuffer.release(renderer); > } >-} >- >-angle::Result BufferVk::initializeShadowBuffer(ContextVk *contextVk, >- gl::BufferBinding target, >- size_t size) >-{ >- if (!contextVk->getRenderer()->getFeatures().shadowBuffers.enabled) >+ if (mStagingBuffer.valid()) > { >- return angle::Result::Continue; >+ mStagingBuffer.release(renderer); > } > >- // For now, enable shadow buffers only for pixel unpack buffers. >- // If usecases present themselves, we can enable them for other buffer types. >- // Note: If changed, update the waitForIdle message in BufferVk::copySubData to reflect it. >- if (target == gl::BufferBinding::PixelUnpack) >- { >- // Initialize the shadow buffer >- mShadowBuffer.init(size); >- >- // Allocate required memory. If allocation fails, treat it is a non-fatal error >- // since we do not need the shadow buffer for functionality >- ANGLE_TRY(mShadowBuffer.allocate(size)); >- } >- >- return angle::Result::Continue; >-} >- >-void BufferVk::initializeHostVisibleBufferPool(ContextVk *contextVk) >-{ >- // These buffers will only be used as transfer sources or transfer targets. >- constexpr VkImageUsageFlags kUsageFlags = >- VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; >- >- // These buffers need to be host visible. >- constexpr VkMemoryPropertyFlags kDeviceLocalHostCoherentFlags = >- (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); >- >- constexpr size_t kBufferHelperAlignment = 1; >- constexpr size_t kBufferHelperPoolInitialSize = 0; >- >- mHostVisibleBufferPool.initWithFlags( >- contextVk->getRenderer(), kUsageFlags, kBufferHelperAlignment, kBufferHelperPoolInitialSize, >- kDeviceLocalHostCoherentFlags, vk::DynamicBufferPolicy::SporadicTextureUpload); >-} >- >-void BufferVk::updateShadowBuffer(const uint8_t *data, size_t size, size_t offset) >-{ >- if (mShadowBuffer.valid()) >+ for (ConversionBuffer &buffer : mVertexConversionBuffers) > { >- mShadowBuffer.updateData(data, size, offset); >+ buffer.data->release(renderer); > } >+ mVertexConversionBuffers.clear(); > } > > angle::Result BufferVk::setExternalBufferData(const gl::Context *context, >@@ -343,8 +293,6 @@ angle::Result BufferVk::setExternalBufferData(const gl::Context *context, > // Release and re-create the memory and buffer. > release(contextVk); > >- std::unique_ptr<vk::BufferHelper> buffer = std::make_unique<vk::BufferHelper>(); >- > VkBufferCreateInfo createInfo = {}; > createInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; > createInfo.flags = 0; >@@ -354,12 +302,7 @@ angle::Result BufferVk::setExternalBufferData(const gl::Context *context, > createInfo.queueFamilyIndexCount = 0; > createInfo.pQueueFamilyIndices = nullptr; > >- ANGLE_TRY(buffer->initExternal(contextVk, memoryPropertyFlags, createInfo, clientBuffer)); >- >- ASSERT(!mBuffer); >- mBuffer = std::move(buffer); >- >- return angle::Result::Continue; >+ return mBuffer.initExternal(contextVk, memoryPropertyFlags, createInfo, clientBuffer); > } > > angle::Result BufferVk::setDataWithUsageFlags(const gl::Context *context, >@@ -394,16 +337,12 @@ angle::Result BufferVk::setDataWithUsageFlags(const gl::Context *context, > if (isExternalBuffer) > { > ANGLE_TRY(setExternalBufferData(context, target, clientBuffer, size, memoryPropertyFlags)); >- if (!mBuffer->isHostVisible()) >+ if (!mBuffer.isHostVisible()) > { > // If external buffer's memory does not support host visible memory property, we cannot > // support a persistent map request. > ANGLE_VK_CHECK(vk::GetImpl(context), !persistentMapRequired, > VK_ERROR_MEMORY_MAP_FAILED); >- >- // Since external buffer is not host visible, allocate a host visible buffer pool >- // to handle map/unmap operations. >- initializeHostVisibleBufferPool(vk::GetImpl(context)); > } > > return angle::Result::Continue; >@@ -456,15 +395,6 @@ angle::Result BufferVk::setDataWithMemoryType(const gl::Context *context, > ANGLE_TRY(GetMemoryTypeIndex(contextVk, size, memoryPropertyFlags, &mMemoryTypeIndex)); > > ANGLE_TRY(acquireBufferHelper(contextVk, size, BufferUpdateType::StorageRedefined)); >- >- // persistentMapRequired may request that the server read from or write to the buffer while >- // it is mapped. The client's pointer to the data store remains valid so long as the data >- // store is mapped. So it cannot have shadow buffer >- if (!persistentMapRequired) >- { >- // Initialize the shadow buffer >- ANGLE_TRY(initializeShadowBuffer(contextVk, target, size)); >- } > } > > if (data) >@@ -485,7 +415,7 @@ angle::Result BufferVk::setSubData(const gl::Context *context, > size_t size, > size_t offset) > { >- ASSERT(mBuffer && mBuffer->valid()); >+ ASSERT(mBuffer.valid()); > > ContextVk *contextVk = vk::GetImpl(context); > ANGLE_TRY(setDataImpl(contextVk, static_cast<const uint8_t *>(data), size, offset, >@@ -500,7 +430,7 @@ angle::Result BufferVk::copySubData(const gl::Context *context, > GLintptr destOffset, > GLsizeiptr size) > { >- ASSERT(mBuffer && mBuffer->valid()); >+ ASSERT(mBuffer.valid()); > > ContextVk *contextVk = vk::GetImpl(context); > BufferVk *sourceVk = GetAs<BufferVk>(source); >@@ -508,43 +438,27 @@ angle::Result BufferVk::copySubData(const gl::Context *context, > ASSERT(sourceBuffer.valid()); > VkDeviceSize sourceBufferOffset = sourceBuffer.getOffset(); > >- // If the shadow buffer is enabled for the destination buffer then >- // we need to update that as well. This will require us to complete >- // all recorded and in-flight commands involving the source buffer. >- if (mShadowBuffer.valid()) >- { >- // Map the source buffer. >- void *mapPtr; >- ANGLE_TRY(sourceVk->mapRangeImpl(contextVk, sourceOffset, size, GL_MAP_READ_BIT, &mapPtr)); >- >- // Update the shadow buffer with data from source buffer >- updateShadowBuffer(static_cast<uint8_t *>(mapPtr), size, destOffset); >- >- // Unmap the source buffer >- ANGLE_TRY(sourceVk->unmapImpl(contextVk)); >- } >- > // Check for self-dependency. > vk::CommandBufferAccess access; >- if (sourceBuffer.getBufferSerial() == mBuffer->getBufferSerial()) >+ if (sourceBuffer.getBufferSerial() == mBuffer.getBufferSerial()) > { >- access.onBufferSelfCopy(mBuffer.get()); >+ access.onBufferSelfCopy(&mBuffer); > } > else > { > access.onBufferTransferRead(&sourceBuffer); >- access.onBufferTransferWrite(mBuffer.get()); >+ access.onBufferTransferWrite(&mBuffer); > } > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > // Enqueue a copy command on the GPU. > const VkBufferCopy copyRegion = {static_cast<VkDeviceSize>(sourceOffset) + sourceBufferOffset, >- static_cast<VkDeviceSize>(destOffset) + mBuffer->getOffset(), >+ static_cast<VkDeviceSize>(destOffset) + mBuffer.getOffset(), > static_cast<VkDeviceSize>(size)}; > >- commandBuffer->copyBuffer(sourceBuffer.getBuffer(), mBuffer->getBuffer(), 1, ©Region); >+ commandBuffer->copyBuffer(sourceBuffer.getBuffer(), mBuffer.getBuffer(), 1, ©Region); > mHasBeenReferencedByGPU = true; > > // The new destination buffer data may require a conversion for the next draw, so mark it dirty. >@@ -553,53 +467,78 @@ angle::Result BufferVk::copySubData(const gl::Context *context, > return angle::Result::Continue; > } > >-angle::Result BufferVk::handleDeviceLocalBufferMap(ContextVk *contextVk, >- VkDeviceSize offset, >- VkDeviceSize size, >- uint8_t **mapPtr) >+angle::Result BufferVk::allocStagingBuffer(ContextVk *contextVk, >+ vk::MemoryCoherency coherency, >+ VkDeviceSize size, >+ uint8_t **mapPtr) > { >- // The buffer is device local, create a copy of the buffer and return its CPU pointer. >- bool needToReleasePreviousBuffers = false; >- ANGLE_TRY(mHostVisibleBufferPool.allocate(contextVk, static_cast<size_t>(size), mapPtr, nullptr, >- &mHostVisibleBufferOffset, >- &needToReleasePreviousBuffers)); >- if (needToReleasePreviousBuffers) >+ ASSERT(!mIsStagingBufferMapped); >+ >+ if (mStagingBuffer.valid()) > { >- // Release previous buffers >- mHostVisibleBufferPool.releaseInFlightBuffers(contextVk); >+ if (size <= mStagingBuffer.getSize() && >+ (coherency == vk::MemoryCoherency::Coherent) == mStagingBuffer.isCoherent() && >+ !mStagingBuffer.isCurrentlyInUse(contextVk->getLastCompletedQueueSerial())) >+ { >+ // If size is big enough and it is idle, then just reuse the existing staging buffer >+ *mapPtr = mStagingBuffer.getMappedMemory(); >+ mIsStagingBufferMapped = true; >+ return angle::Result::Continue; >+ } >+ mStagingBuffer.release(contextVk->getRenderer()); > } > >- // Copy data from device local buffer to host visible staging buffer. >- vk::BufferHelper *hostVisibleBuffer = mHostVisibleBufferPool.getCurrentBuffer(); >- ASSERT(hostVisibleBuffer && hostVisibleBuffer->valid()); >- >- VkBufferCopy copyRegion = {mBuffer->getOffset() + offset, mHostVisibleBufferOffset, size}; >- ANGLE_TRY(hostVisibleBuffer->copyFromBuffer(contextVk, mBuffer.get(), 1, ©Region)); >- ANGLE_TRY(hostVisibleBuffer->waitForIdle(contextVk, >- "GPU stall due to mapping device local buffer", >- RenderPassClosureReason::DeviceLocalBufferMap)); >+ ANGLE_TRY( >+ mStagingBuffer.allocateForCopyBuffer(contextVk, static_cast<size_t>(size), coherency)); >+ *mapPtr = mStagingBuffer.getMappedMemory(); >+ mIsStagingBufferMapped = true; > > return angle::Result::Continue; > } > >-angle::Result BufferVk::handleDeviceLocalBufferUnmap(ContextVk *contextVk, >- VkDeviceSize offset, >- VkDeviceSize size) >+angle::Result BufferVk::flushStagingBuffer(ContextVk *contextVk, >+ VkDeviceSize offset, >+ VkDeviceSize size) > { >- // Copy data from the host visible buffer into the device local buffer. >- vk::BufferHelper *hostVisibleBuffer = mHostVisibleBufferPool.getCurrentBuffer(); >- ASSERT(hostVisibleBuffer && hostVisibleBuffer->valid()); >+ RendererVk *renderer = contextVk->getRenderer(); >+ >+ ASSERT(mIsStagingBufferMapped); >+ ASSERT(mStagingBuffer.valid()); >+ >+ if (!mStagingBuffer.isCoherent()) >+ { >+ ANGLE_TRY(mStagingBuffer.flush(renderer)); >+ } >+ >+ // Enqueue a copy command on the GPU. >+ VkBufferCopy copyRegion = {mStagingBuffer.getOffset(), mBuffer.getOffset() + offset, size}; >+ ANGLE_TRY(mBuffer.copyFromBuffer(contextVk, &mStagingBuffer, 1, ©Region)); > >- VkBufferCopy copyRegion = {mHostVisibleBufferOffset, mBuffer->getOffset() + offset, size}; >- ANGLE_TRY(mBuffer->copyFromBuffer(contextVk, hostVisibleBuffer, 1, ©Region)); > mHasBeenReferencedByGPU = true; > > return angle::Result::Continue; > } > >+angle::Result BufferVk::handleDeviceLocalBufferMap(ContextVk *contextVk, >+ VkDeviceSize offset, >+ VkDeviceSize size, >+ uint8_t **mapPtr) >+{ >+ ANGLE_TRY(allocStagingBuffer(contextVk, vk::MemoryCoherency::Coherent, size, mapPtr)); >+ >+ // Copy data from device local buffer to host visible staging buffer. >+ VkBufferCopy copyRegion = {mBuffer.getOffset() + offset, mStagingBuffer.getOffset(), size}; >+ ANGLE_TRY(mStagingBuffer.copyFromBuffer(contextVk, &mBuffer, 1, ©Region)); >+ ANGLE_TRY(mStagingBuffer.waitForIdle(contextVk, "GPU stall due to mapping device local buffer", >+ RenderPassClosureReason::DeviceLocalBufferMap)); >+ // Because the buffer is coherent, no need to call invalidate here. >+ >+ return angle::Result::Continue; >+} >+ > angle::Result BufferVk::map(const gl::Context *context, GLenum access, void **mapPtr) > { >- ASSERT(mBuffer && mBuffer->valid()); >+ ASSERT(mBuffer.valid()); > ASSERT(access == GL_WRITE_ONLY_OES); > > return mapImpl(vk::GetImpl(context), GL_MAP_WRITE_BIT, mapPtr); >@@ -631,11 +570,11 @@ angle::Result BufferVk::ghostMappedBuffer(ContextVk *contextVk, > // If we are creating a new buffer because the GPU is using it as read-only, then we > // also need to copy the contents of the previous buffer into the new buffer, in > // case the caller only updates a portion of the new buffer. >- std::unique_ptr<vk::BufferHelper> src = std::move(mBuffer); >+ vk::BufferHelper src = std::move(mBuffer); > > // Retain it to prevent acquireBufferHelper from actually releasing it. >- src->retainReadOnly(&contextVk->getResourceUseList()); >- bool srcBufferNeedsRelease = !src->isExternalBuffer(); >+ src.retainReadOnly(&contextVk->getResourceUseList()); >+ bool srcBufferNeedsRelease = !src.isExternalBuffer(); > > ANGLE_TRY(acquireBufferHelper(contextVk, static_cast<size_t>(mState.getSize()), > BufferUpdateType::ContentsUpdate)); >@@ -644,11 +583,11 @@ angle::Result BufferVk::ghostMappedBuffer(ContextVk *contextVk, > // contents into the new buffer. > uint8_t *srcMapPtr = nullptr; > uint8_t *dstMapPtr = nullptr; >- ANGLE_TRY(src->map(contextVk, &srcMapPtr)); >- ANGLE_TRY(mBuffer->map(contextVk, &dstMapPtr)); >+ ANGLE_TRY(src.map(contextVk, &srcMapPtr)); >+ ANGLE_TRY(mBuffer.map(contextVk, &dstMapPtr)); > >- ASSERT(src->isCoherent()); >- ASSERT(mBuffer->isCoherent()); >+ ASSERT(src.isCoherent()); >+ ASSERT(mBuffer.isCoherent()); > > // No need to copy over [offset, offset + length), just around it > if ((access & GL_MAP_INVALIDATE_RANGE_BIT) != 0) >@@ -672,7 +611,7 @@ angle::Result BufferVk::ghostMappedBuffer(ContextVk *contextVk, > > if (srcBufferNeedsRelease) > { >- src->release(contextVk->getRenderer()); >+ src.release(contextVk->getRenderer()); > } > // Return the already mapped pointer with the offset adjustment to avoid the call to unmap(). > *mapPtr = dstMapPtr + offset; >@@ -688,28 +627,16 @@ angle::Result BufferVk::mapRangeImpl(ContextVk *contextVk, > { > uint8_t **mapPtrBytes = reinterpret_cast<uint8_t **>(mapPtr); > >- if (mShadowBuffer.valid()) >- { >- // If the app requested a GL_MAP_UNSYNCHRONIZED_BIT access, the spec states - >- // No GL error is generated if pending operations which source or modify the >- // buffer overlap the mapped region, but the result of such previous and any >- // subsequent operations is undefined >- // To keep the code simple, irrespective of whether the access was GL_MAP_UNSYNCHRONIZED_BIT >- // or not, just return the shadow buffer. >- mShadowBuffer.map(static_cast<size_t>(offset), mapPtrBytes); >- return angle::Result::Continue; >- } >- >- ASSERT(mBuffer && mBuffer->valid()); >+ ASSERT(mBuffer.valid()); > >- bool hostVisible = mBuffer->isHostVisible(); >+ bool hostVisible = mBuffer.isHostVisible(); > > // MAP_UNSYNCHRONIZED_BIT, so immediately map. > if ((access & GL_MAP_UNSYNCHRONIZED_BIT) != 0) > { > if (hostVisible) > { >- return mBuffer->mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); >+ return mBuffer.mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); > } > return handleDeviceLocalBufferMap(contextVk, offset, length, mapPtrBytes); > } >@@ -719,19 +646,19 @@ angle::Result BufferVk::mapRangeImpl(ContextVk *contextVk, > { > // If app is not going to write, all we need is to ensure GPU write is finished. > // Concurrent reads from CPU and GPU is allowed. >- if (mBuffer->isCurrentlyInUseForWrite(contextVk->getLastCompletedQueueSerial())) >+ if (mBuffer.isCurrentlyInUseForWrite(contextVk->getLastCompletedQueueSerial())) > { > // If there are pending commands for the resource, flush them. >- if (mBuffer->usedInRecordedCommands()) >+ if (mBuffer.usedInRecordedCommands()) > { > ANGLE_TRY( > contextVk->flushImpl(nullptr, RenderPassClosureReason::BufferWriteThenMap)); > } >- ANGLE_TRY(mBuffer->finishGPUWriteCommands(contextVk)); >+ ANGLE_TRY(mBuffer.finishGPUWriteCommands(contextVk)); > } > if (hostVisible) > { >- return mBuffer->mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); >+ return mBuffer.mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); > } > return handleDeviceLocalBufferMap(contextVk, offset, length, mapPtrBytes); > } >@@ -743,9 +670,9 @@ angle::Result BufferVk::mapRangeImpl(ContextVk *contextVk, > } > > // Write case, buffer not in use. >- if (mBuffer->isExternalBuffer() || !isCurrentlyInUse(contextVk)) >+ if (mBuffer.isExternalBuffer() || !isCurrentlyInUse(contextVk)) > { >- return mBuffer->mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); >+ return mBuffer.mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); > } > > // Write case, buffer in use. >@@ -764,30 +691,28 @@ angle::Result BufferVk::mapRangeImpl(ContextVk *contextVk, > { > ANGLE_TRY(acquireBufferHelper(contextVk, static_cast<size_t>(mState.getSize()), > BufferUpdateType::ContentsUpdate)); >- return mBuffer->mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); >+ return mBuffer.mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); > } > > bool smallMapRange = (length < static_cast<VkDeviceSize>(mState.getSize()) / 2); > > if (smallMapRange && rangeInvalidate) > { >- ANGLE_TRY(allocMappedStagingBuffer( >- contextVk, static_cast<size_t>(length), &mMapInvalidateRangeStagingBuffer, >- &mMapInvalidateRangeStagingBufferOffset, &mMapInvalidateRangeMappedPtr)); >- *mapPtrBytes = mMapInvalidateRangeMappedPtr; >+ ANGLE_TRY(allocStagingBuffer(contextVk, vk::MemoryCoherency::NonCoherent, >+ static_cast<size_t>(length), mapPtrBytes)); > return angle::Result::Continue; > } > >- if (!mBuffer->isCurrentlyInUseForWrite(contextVk->getLastCompletedQueueSerial())) >+ if (!mBuffer.isCurrentlyInUseForWrite(contextVk->getLastCompletedQueueSerial())) > { > // This will keep the new buffer mapped and update mapPtr, so return immediately. > return ghostMappedBuffer(contextVk, offset, length, access, mapPtr); > } > > // Write case (worst case, buffer in use for write) >- ANGLE_TRY(mBuffer->waitForIdle(contextVk, "GPU stall due to mapping buffer in use by the GPU", >- RenderPassClosureReason::BufferInUseWhenSynchronizedMap)); >- return mBuffer->mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); >+ ANGLE_TRY(mBuffer.waitForIdle(contextVk, "GPU stall due to mapping buffer in use by the GPU", >+ RenderPassClosureReason::BufferInUseWhenSynchronizedMap)); >+ return mBuffer.mapWithOffset(contextVk, mapPtrBytes, static_cast<size_t>(offset)); > } > > angle::Result BufferVk::unmap(const gl::Context *context, GLboolean *result) >@@ -803,46 +728,25 @@ angle::Result BufferVk::unmap(const gl::Context *context, GLboolean *result) > > angle::Result BufferVk::unmapImpl(ContextVk *contextVk) > { >- ASSERT(mBuffer && mBuffer->valid()); >+ ASSERT(mBuffer.valid()); > > bool writeOperation = ((mState.getAccessFlags() & GL_MAP_WRITE_BIT) != 0); > >- if (mMapInvalidateRangeMappedPtr != nullptr) >- { >- ASSERT(!mShadowBuffer.valid()); >- ANGLE_TRY(flushMappedStagingBuffer(contextVk, mMapInvalidateRangeStagingBuffer, >- mMapInvalidateRangeStagingBufferOffset, >- static_cast<size_t>(mState.getMapLength()), >- static_cast<size_t>(mState.getMapOffset()))); >- mMapInvalidateRangeMappedPtr = nullptr; >- } >- else if (!mShadowBuffer.valid() && mBuffer->isHostVisible()) >+ if (mIsStagingBufferMapped) > { >- mBuffer->unmap(contextVk->getRenderer()); >- } >- else >- { >- size_t offset = static_cast<size_t>(mState.getMapOffset()); >- size_t size = static_cast<size_t>(mState.getMapLength()); >- >- // If it was a write operation we need to update the buffer with new data. >+ ASSERT(mStagingBuffer.valid()); >+ // The buffer is device local or optimization of small range map. > if (writeOperation) > { >- if (mShadowBuffer.valid()) >- { >- // We do not yet know if this data will ever be used. Perform a staged >- // update which will get flushed if and when necessary. >- const uint8_t *data = getShadowBuffer(offset); >- ANGLE_TRY(stagedUpdate(contextVk, data, size, offset)); >- mShadowBuffer.unmap(); >- } >- else >- { >- // The buffer is device local. >- ASSERT(!mBuffer->isHostVisible()); >- ANGLE_TRY(handleDeviceLocalBufferUnmap(contextVk, offset, size)); >- } >+ ANGLE_TRY(flushStagingBuffer(contextVk, mState.getMapOffset(), mState.getMapLength())); > } >+ >+ mIsStagingBufferMapped = false; >+ } >+ else >+ { >+ ASSERT(mBuffer.isHostVisible()); >+ mBuffer.unmap(contextVk->getRenderer()); > } > > if (writeOperation) >@@ -859,20 +763,12 @@ angle::Result BufferVk::getSubData(const gl::Context *context, > void *outData) > { > ASSERT(offset + size <= getSize()); >- if (!mShadowBuffer.valid()) >- { >- ASSERT(mBuffer && mBuffer->valid()); >- ContextVk *contextVk = vk::GetImpl(context); >- void *mapPtr; >- ANGLE_TRY(mapRangeImpl(contextVk, offset, size, GL_MAP_READ_BIT, &mapPtr)); >- memcpy(outData, mapPtr, size); >- ANGLE_TRY(unmapImpl(contextVk)); >- } >- else >- { >- memcpy(outData, mShadowBuffer.getCurrentBuffer() + offset, size); >- } >- return angle::Result::Continue; >+ ASSERT(mBuffer.valid()); >+ ContextVk *contextVk = vk::GetImpl(context); >+ void *mapPtr; >+ ANGLE_TRY(mapRangeImpl(contextVk, offset, size, GL_MAP_READ_BIT, &mapPtr)); >+ memcpy(outData, mapPtr, size); >+ return unmapImpl(contextVk); > } > > angle::Result BufferVk::getIndexRange(const gl::Context *context, >@@ -909,7 +805,7 @@ angle::Result BufferVk::updateBuffer(ContextVk *contextVk, > size_t size, > size_t offset) > { >- if (mBuffer->isHostVisible()) >+ if (mBuffer.isHostVisible()) > { > ANGLE_TRY(directUpdate(contextVk, data, size, offset)); > } >@@ -926,7 +822,7 @@ angle::Result BufferVk::directUpdate(ContextVk *contextVk, > { > uint8_t *mapPointer = nullptr; > >- ANGLE_TRY(mBuffer->mapWithOffset(contextVk, &mapPointer, offset)); >+ ANGLE_TRY(mBuffer.mapWithOffset(contextVk, &mapPointer, offset)); > ASSERT(mapPointer); > > memcpy(mapPointer, data, size); >@@ -936,9 +832,9 @@ angle::Result BufferVk::directUpdate(ContextVk *contextVk, > // to either the renderer or mBufferFreeList. > if (!IsUsageDynamic(mState.getUsage())) > { >- mBuffer->unmap(contextVk->getRenderer()); >+ mBuffer.unmap(contextVk->getRenderer()); > } >- ASSERT(mBuffer->isCoherent()); >+ ASSERT(mBuffer.isCoherent()); > > return angle::Result::Continue; > } >@@ -949,53 +845,11 @@ angle::Result BufferVk::stagedUpdate(ContextVk *contextVk, > size_t offset) > { > // Acquire a "new" staging buffer >- vk::DynamicBuffer *stagingBuffer = nullptr; >- VkDeviceSize stagingBufferOffset = 0; >- uint8_t *mapPointer = nullptr; >- >- ANGLE_TRY(allocMappedStagingBuffer(contextVk, size, &stagingBuffer, &stagingBufferOffset, >- &mapPointer)); >+ uint8_t *mapPointer = nullptr; >+ ANGLE_TRY(allocStagingBuffer(contextVk, vk::MemoryCoherency::NonCoherent, size, &mapPointer)); > memcpy(mapPointer, data, size); >- ANGLE_TRY( >- flushMappedStagingBuffer(contextVk, stagingBuffer, stagingBufferOffset, size, offset)); >- >- return angle::Result::Continue; >-} >- >-angle::Result BufferVk::allocMappedStagingBuffer(ContextVk *contextVk, >- size_t size, >- vk::DynamicBuffer **stagingBuffer, >- VkDeviceSize *stagingBufferOffset, >- uint8_t **mapPtr) >-{ >- // Acquire a "new" staging buffer >- ASSERT(mapPtr); >- ASSERT(stagingBuffer); >- >- *stagingBuffer = contextVk->getStagingBuffer(); >- >- ASSERT(*stagingBuffer); >- >- ANGLE_TRY( >- (*stagingBuffer)->allocate(contextVk, size, mapPtr, nullptr, stagingBufferOffset, nullptr)); >- ASSERT(*mapPtr); >- >- return angle::Result::Continue; >-} >- >-angle::Result BufferVk::flushMappedStagingBuffer(ContextVk *contextVk, >- vk::DynamicBuffer *stagingBuffer, >- VkDeviceSize stagingBufferOffset, >- size_t size, >- size_t offset) >-{ >- ANGLE_TRY(stagingBuffer->flush(contextVk)); >- >- // Enqueue a copy command on the GPU. >- VkBufferCopy copyRegion = {stagingBufferOffset, mBuffer->getOffset() + offset, size}; >- ANGLE_TRY( >- mBuffer->copyFromBuffer(contextVk, stagingBuffer->getCurrentBuffer(), 1, ©Region)); >- mHasBeenReferencedByGPU = true; >+ ANGLE_TRY(flushStagingBuffer(contextVk, offset, size)); >+ mIsStagingBufferMapped = false; > > return angle::Result::Continue; > } >@@ -1009,7 +863,7 @@ angle::Result BufferVk::acquireAndUpdate(ContextVk *contextVk, > // Here we acquire a new BufferHelper and directUpdate() the new buffer. > // If the subData size was less than the buffer's size we additionally enqueue > // a GPU copy of the remaining regions from the old mBuffer to the new one. >- std::unique_ptr<vk::BufferHelper> src; >+ vk::BufferHelper src; > size_t bufferSize = static_cast<size_t>(mState.getSize()); > size_t offsetAfterSubdata = (offset + updateSize); > bool updateRegionBeforeSubData = mHasValidData && (offset > 0); >@@ -1025,20 +879,20 @@ angle::Result BufferVk::acquireAndUpdate(ContextVk *contextVk, > // before copyFromBuffer() has a chance to retain it, so retain it now. This may end up > // double-retaining the buffer, which is a necessary side-effect to prevent a > // use-after-free. >- src->retainReadOnly(&contextVk->getResourceUseList()); >+ src.retainReadOnly(&contextVk->getResourceUseList()); > > // The total bytes that we need to copy from old buffer to new buffer > size_t copySize = bufferSize - updateSize; > > // If the buffer is host visible and the GPU is done writing to, we use the CPU to do the > // copy. We need to save the source buffer pointer before we acquire a new buffer. >- if (src->isHostVisible() && >- !src->isCurrentlyInUseForWrite(contextVk->getLastCompletedQueueSerial()) && >+ if (src.isHostVisible() && >+ !src.isCurrentlyInUseForWrite(contextVk->getLastCompletedQueueSerial()) && > ShouldUseCPUToCopyData(contextVk, copySize, bufferSize)) > { > uint8_t *mapPointer = nullptr; > // src buffer will be recycled (or released and unmapped) by acquireBufferHelper >- ANGLE_TRY(src->map(contextVk, &mapPointer)); >+ ANGLE_TRY(src.map(contextVk, &mapPointer)); > ASSERT(mapPointer); > srcMapPtrBeforeSubData = mapPointer; > srcMapPtrAfterSubData = mapPointer + offsetAfterSubdata; >@@ -1055,12 +909,12 @@ angle::Result BufferVk::acquireAndUpdate(ContextVk *contextVk, > { > if (srcMapPtrBeforeSubData) > { >- ASSERT(mBuffer->isHostVisible()); >+ ASSERT(mBuffer.isHostVisible()); > ANGLE_TRY(directUpdate(contextVk, srcMapPtrBeforeSubData, offset, 0)); > } > else > { >- copyRegions.push_back({src->getOffset(), mBuffer->getOffset(), offset}); >+ copyRegions.push_back({src.getOffset(), mBuffer.getOffset(), offset}); > } > } > >@@ -1069,26 +923,26 @@ angle::Result BufferVk::acquireAndUpdate(ContextVk *contextVk, > size_t copySize = bufferSize - offsetAfterSubdata; > if (srcMapPtrAfterSubData) > { >- ASSERT(mBuffer->isHostVisible()); >+ ASSERT(mBuffer.isHostVisible()); > ANGLE_TRY(directUpdate(contextVk, srcMapPtrAfterSubData, copySize, offsetAfterSubdata)); > } > else > { >- copyRegions.push_back({src->getOffset() + offsetAfterSubdata, >- mBuffer->getOffset() + offsetAfterSubdata, copySize}); >+ copyRegions.push_back({src.getOffset() + offsetAfterSubdata, >+ mBuffer.getOffset() + offsetAfterSubdata, copySize}); > } > } > > if (!copyRegions.empty()) > { >- ANGLE_TRY(mBuffer->copyFromBuffer( >- contextVk, src.get(), static_cast<uint32_t>(copyRegions.size()), copyRegions.data())); >+ ANGLE_TRY(mBuffer.copyFromBuffer(contextVk, &src, static_cast<uint32_t>(copyRegions.size()), >+ copyRegions.data())); > mHasBeenReferencedByGPU = true; > } > >- if (src && !src->isExternalBuffer()) >+ if (src.valid() && !src.isExternalBuffer()) > { >- src->release(contextVk->getRenderer()); >+ src.release(contextVk->getRenderer()); > } > > return angle::Result::Continue; >@@ -1100,9 +954,6 @@ angle::Result BufferVk::setDataImpl(ContextVk *contextVk, > size_t offset, > BufferUpdateType updateType) > { >- // Update shadow buffer >- updateShadowBuffer(data, size, offset); >- > // if the buffer is currently in use > // if it isn't an external buffer and sub data size meets threshold > // acquire a new BufferHelper from the pool >@@ -1114,7 +965,7 @@ angle::Result BufferVk::setDataImpl(ContextVk *contextVk, > // from old buffer to new buffer when we acquire a new buffer, we also favor > // acquireAndUpdate over stagedUpdate. This could happen when app calls glBufferData with > // same size and we will try to reuse the existing buffer storage. >- if (!mBuffer->isExternalBuffer() && >+ if (!mBuffer.isExternalBuffer() && > (!mHasValidData || ShouldAllocateNewMemoryForUpdate( > contextVk, size, static_cast<size_t>(mState.getSize())))) > { >@@ -1146,6 +997,7 @@ ConversionBuffer *BufferVk::getVertexConversionBuffer(RendererVk *renderer, > { > if (buffer.formatID == formatID && buffer.stride == stride && buffer.offset == offset) > { >+ ASSERT(buffer.data && buffer.data->valid()); > return &buffer; > } > } >@@ -1177,17 +1029,13 @@ angle::Result BufferVk::acquireBufferHelper(ContextVk *contextVk, > size_t size = roundUpPow2(sizeInBytes, kBufferSizeGranularity); > size_t alignment = GetDefaultBufferAlignment(renderer); > >- if (mBuffer) >+ if (mBuffer.valid()) > { >- mBuffer->release(renderer); >- mBuffer.reset(nullptr); >+ mBuffer.release(renderer); > } >- // Allocate the buffer directly >- std::unique_ptr<vk::BufferHelper> buffer = std::make_unique<vk::BufferHelper>(); >- >- ANGLE_TRY(buffer->initSubAllocation(contextVk, mMemoryTypeIndex, size, alignment)); > >- mBuffer = std::move(buffer); >+ // Allocate the buffer directly >+ ANGLE_TRY(mBuffer.initSuballocation(contextVk, mMemoryTypeIndex, size, alignment)); > > if (updateType == BufferUpdateType::ContentsUpdate) > { >@@ -1209,7 +1057,7 @@ angle::Result BufferVk::acquireBufferHelper(ContextVk *contextVk, > bool BufferVk::isCurrentlyInUse(ContextVk *contextVk) const > { > return mHasBeenReferencedByGPU && >- mBuffer->isCurrentlyInUse(contextVk->getLastCompletedQueueSerial()); >+ mBuffer.isCurrentlyInUse(contextVk->getLastCompletedQueueSerial()); > } > > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.h >index 9969d0098c7d7bd2416f208f6299051de340556f..d1c473f2d1117937b80f8bfd1702323cab3779e8 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/BufferVk.h >@@ -34,11 +34,8 @@ struct ConversionBuffer > // One state value determines if we need to re-stream vertex data. > bool dirty; > >- // One additional state value keeps the last allocation offset. >- VkDeviceSize lastAllocationOffset; >- >- // The conversion is stored in a dynamic buffer. >- vk::DynamicBuffer data; >+ // Where the conversion data is stored. >+ std::unique_ptr<vk::BufferHelper> data; > }; > > enum class BufferUpdateType >@@ -114,10 +111,10 @@ class BufferVk : public BufferImpl > // submission, since this function is only called when trying to get the underlying > // BufferHelper object so it can be used in a command. > mHasBeenReferencedByGPU = true; >- return *mBuffer.get(); >+ return mBuffer; > } > >- bool isBufferValid() const { return mBuffer.get() != nullptr; } >+ bool isBufferValid() const { return mBuffer.valid(); } > bool isCurrentlyInUse(ContextVk *contextVk) const; > > angle::Result mapImpl(ContextVk *contextVk, GLbitfield access, void **mapPtr); >@@ -140,22 +137,6 @@ class BufferVk : public BufferImpl > bool hostVisible); > > private: >- angle::Result initializeShadowBuffer(ContextVk *contextVk, >- gl::BufferBinding target, >- size_t size); >- void initializeHostVisibleBufferPool(ContextVk *contextVk); >- >- ANGLE_INLINE uint8_t *getShadowBuffer(size_t offset) >- { >- return (mShadowBuffer.getCurrentBuffer() + offset); >- } >- >- ANGLE_INLINE const uint8_t *getShadowBuffer(size_t offset) const >- { >- return (mShadowBuffer.getCurrentBuffer() + offset); >- } >- >- void updateShadowBuffer(const uint8_t *data, size_t size, size_t offset); > angle::Result updateBuffer(ContextVk *contextVk, > const uint8_t *data, > size_t size, >@@ -168,16 +149,11 @@ class BufferVk : public BufferImpl > const uint8_t *data, > size_t size, > size_t offset); >- angle::Result allocMappedStagingBuffer(ContextVk *contextVk, >- size_t size, >- vk::DynamicBuffer **stagingBuffer, >- VkDeviceSize *stagingBufferOffset, >- uint8_t **mapPtr); >- angle::Result flushMappedStagingBuffer(ContextVk *contextVk, >- vk::DynamicBuffer *stagingBuffer, >- VkDeviceSize stagingBufferOffset, >- size_t size, >- size_t offset); >+ angle::Result allocStagingBuffer(ContextVk *contextVk, >+ vk::MemoryCoherency coherency, >+ VkDeviceSize size, >+ uint8_t **mapPtr); >+ angle::Result flushStagingBuffer(ContextVk *contextVk, VkDeviceSize offset, VkDeviceSize size); > angle::Result acquireAndUpdate(ContextVk *contextVk, > const uint8_t *data, > size_t updateSize, >@@ -194,9 +170,6 @@ class BufferVk : public BufferImpl > VkDeviceSize offset, > VkDeviceSize size, > uint8_t **mapPtr); >- angle::Result handleDeviceLocalBufferUnmap(ContextVk *contextVk, >- VkDeviceSize offset, >- VkDeviceSize size); > angle::Result setDataImpl(ContextVk *contextVk, > const uint8_t *data, > size_t size, >@@ -226,31 +199,22 @@ class BufferVk : public BufferImpl > size_t offset; > }; > >- std::unique_ptr<vk::BufferHelper> mBuffer; >+ vk::BufferHelper mBuffer; > > uint32_t mMemoryTypeIndex; > // Memory/Usage property that will be used for memory allocation. > VkMemoryPropertyFlags mMemoryPropertyFlags; > >- // DynamicBuffer to aid map operations of buffers when they are not host visible. >- vk::DynamicBuffer mHostVisibleBufferPool; >- VkDeviceSize mHostVisibleBufferOffset; >- >- // For GPU-read only buffers glMap* latency is reduced by maintaining a copy >- // of the buffer which is writeable only by the CPU. The contents are updated on all >- // glData/glSubData/glCopy calls. With this, a glMap* call becomes a non-blocking >- // operation by elimnating the need to wait on any recorded or in-flight GPU commands. >- // We use DynamicShadowBuffer class to encapsulate all the bookeeping logic. >- vk::DynamicShadowBuffer mShadowBuffer; >- >- // A buffer pool to service GL_MAP_INVALIDATE_RANGE_BIT -style uploads. >- vk::DynamicBuffer *mMapInvalidateRangeStagingBuffer; >- VkDeviceSize mMapInvalidateRangeStagingBufferOffset; >- uint8_t *mMapInvalidateRangeMappedPtr; >+ // The staging buffer to aid map operations. This is used when buffers are not host visible or >+ // for performance optimization when only a smaller range of buffer is mapped. >+ vk::BufferHelper mStagingBuffer; > > // A cache of converted vertex data. > std::vector<VertexConversionBuffer> mVertexConversionBuffers; > >+ // Tracks whether mStagingBuffer has been mapped to user or not >+ bool mIsStagingBufferMapped; >+ > // Tracks if BufferVk object has valid data or not. > bool mHasValidData; > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.cpp >index d5a29fb98788ab7ceed3ac26d39b2d8a07ebf87d..9e02e13ae725cf188e8ac4e654f54710972cbffd 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.cpp >@@ -57,6 +57,30 @@ bool CommandsHaveValidOrdering(const std::vector<vk::CommandBatch> &commands) > > return true; > } >+ >+template <typename SecondaryCommandBufferListT> >+void ResetSecondaryCommandBuffers(VkDevice device, >+ vk::CommandPool *commandPool, >+ SecondaryCommandBufferListT *commandBuffers) >+{ >+ // Nothing to do when using ANGLE secondary command buffers. >+} >+ >+template <> >+ANGLE_MAYBE_UNUSED void ResetSecondaryCommandBuffers<std::vector<VulkanSecondaryCommandBuffer>>( >+ VkDevice device, >+ vk::CommandPool *commandPool, >+ std::vector<VulkanSecondaryCommandBuffer> *commandBuffers) >+{ >+ // Note: we currently free the command buffers individually, but we could potentially reset the >+ // entire command pool. https://issuetracker.google.com/issues/166793850 >+ for (VulkanSecondaryCommandBuffer &secondary : *commandBuffers) >+ { >+ commandPool->freeCommandBuffers(device, 1, secondary.ptr()); >+ secondary.releaseHandle(); >+ } >+ commandBuffers->clear(); >+} > } // namespace > > angle::Result FenceRecycler::newSharedFence(vk::Context *context, >@@ -98,33 +122,44 @@ void FenceRecycler::destroy(vk::Context *context) > // CommandProcessorTask implementation > void CommandProcessorTask::initTask() > { >- mTask = CustomTask::Invalid; >- mRenderPass = nullptr; >- mCommandBuffer = nullptr; >- mSemaphore = nullptr; >- mCommandPool = nullptr; >- mOneOffWaitSemaphore = nullptr; >- mOneOffWaitSemaphoreStageMask = 0; >- mOneOffFence = nullptr; >- mPresentInfo = {}; >- mPresentInfo.pResults = nullptr; >- mPresentInfo.pSwapchains = nullptr; >- mPresentInfo.pImageIndices = nullptr; >- mPresentInfo.pNext = nullptr; >- mPresentInfo.pWaitSemaphores = nullptr; >- mOneOffCommandBufferVk = VK_NULL_HANDLE; >- mPriority = egl::ContextPriority::Medium; >- mHasProtectedContent = false; >-} >- >-void CommandProcessorTask::initProcessCommands(bool hasProtectedContent, >- CommandBufferHelper *commandBuffer, >- const RenderPass *renderPass) >-{ >- mTask = CustomTask::ProcessCommands; >- mCommandBuffer = commandBuffer; >- mRenderPass = renderPass; >- mHasProtectedContent = hasProtectedContent; >+ mTask = CustomTask::Invalid; >+ mOutsideRenderPassCommandBuffer = nullptr; >+ mRenderPassCommandBuffer = nullptr; >+ mRenderPass = nullptr; >+ mSemaphore = nullptr; >+ mCommandPools = nullptr; >+ mOneOffWaitSemaphore = nullptr; >+ mOneOffWaitSemaphoreStageMask = 0; >+ mOneOffFence = nullptr; >+ mPresentInfo = {}; >+ mPresentInfo.pResults = nullptr; >+ mPresentInfo.pSwapchains = nullptr; >+ mPresentInfo.pImageIndices = nullptr; >+ mPresentInfo.pNext = nullptr; >+ mPresentInfo.pWaitSemaphores = nullptr; >+ mOneOffCommandBufferVk = VK_NULL_HANDLE; >+ mPriority = egl::ContextPriority::Medium; >+ mHasProtectedContent = false; >+} >+ >+void CommandProcessorTask::initOutsideRenderPassProcessCommands( >+ bool hasProtectedContent, >+ OutsideRenderPassCommandBufferHelper *commandBuffer) >+{ >+ mTask = CustomTask::ProcessOutsideRenderPassCommands; >+ mOutsideRenderPassCommandBuffer = commandBuffer; >+ mHasProtectedContent = hasProtectedContent; >+} >+ >+void CommandProcessorTask::initRenderPassProcessCommands( >+ bool hasProtectedContent, >+ RenderPassCommandBufferHelper *commandBuffer, >+ const RenderPass *renderPass) >+{ >+ mTask = CustomTask::ProcessRenderPassCommands; >+ mRenderPassCommandBuffer = commandBuffer; >+ mRenderPass = renderPass; >+ mHasProtectedContent = hasProtectedContent; > } > > void CommandProcessorTask::copyPresentInfo(const VkPresentInfoKHR &other) >@@ -218,16 +253,16 @@ void CommandProcessorTask::initFlushAndQueueSubmit( > const Semaphore *semaphore, > bool hasProtectedContent, > egl::ContextPriority priority, >- CommandPool *commandPool, >+ SecondaryCommandPools *commandPools, > GarbageList &¤tGarbage, >- std::vector<CommandBuffer> &&commandBuffersToReset, >+ SecondaryCommandBufferList &&commandBuffersToReset, > Serial submitQueueSerial) > { > mTask = CustomTask::FlushAndQueueSubmit; > mWaitSemaphores = waitSemaphores; > mWaitSemaphoreStageMasks = waitSemaphoreStageMasks; > mSemaphore = semaphore; >- mCommandPool = commandPool; >+ mCommandPools = commandPools; > mGarbage = std::move(currentGarbage); > mCommandBuffersToReset = std::move(commandBuffersToReset); > mPriority = priority; >@@ -261,7 +296,8 @@ CommandProcessorTask &CommandProcessorTask::operator=(CommandProcessorTask &&rhs > } > > std::swap(mRenderPass, rhs.mRenderPass); >- std::swap(mCommandBuffer, rhs.mCommandBuffer); >+ std::swap(mOutsideRenderPassCommandBuffer, rhs.mOutsideRenderPassCommandBuffer); >+ std::swap(mRenderPassCommandBuffer, rhs.mRenderPassCommandBuffer); > std::swap(mTask, rhs.mTask); > std::swap(mWaitSemaphores, rhs.mWaitSemaphores); > std::swap(mWaitSemaphoreStageMasks, rhs.mWaitSemaphoreStageMasks); >@@ -269,7 +305,7 @@ CommandProcessorTask &CommandProcessorTask::operator=(CommandProcessorTask &&rhs > std::swap(mOneOffWaitSemaphore, rhs.mOneOffWaitSemaphore); > std::swap(mOneOffWaitSemaphoreStageMask, rhs.mOneOffWaitSemaphoreStageMask); > std::swap(mOneOffFence, rhs.mOneOffFence); >- std::swap(mCommandPool, rhs.mCommandPool); >+ std::swap(mCommandPools, rhs.mCommandPools); > std::swap(mGarbage, rhs.mGarbage); > std::swap(mCommandBuffersToReset, rhs.mCommandBuffersToReset); > std::swap(mSerial, rhs.mSerial); >@@ -286,7 +322,7 @@ CommandProcessorTask &CommandProcessorTask::operator=(CommandProcessorTask &&rhs > } > > // CommandBatch implementation. >-CommandBatch::CommandBatch() : commandPool(nullptr), hasProtectedContent(false) {} >+CommandBatch::CommandBatch() : commandPools(nullptr), hasProtectedContent(false) {} > > CommandBatch::~CommandBatch() = default; > >@@ -298,7 +334,7 @@ CommandBatch::CommandBatch(CommandBatch &&other) : CommandBatch() > CommandBatch &CommandBatch::operator=(CommandBatch &&other) > { > std::swap(primaryCommands, other.primaryCommands); >- std::swap(commandPool, other.commandPool); >+ std::swap(commandPools, other.commandPools); > std::swap(commandBuffersToReset, other.commandBuffersToReset); > std::swap(fence, other.fence); > std::swap(serial, other.serial); >@@ -315,16 +351,10 @@ void CommandBatch::destroy(VkDevice device) > > void CommandBatch::resetSecondaryCommandBuffers(VkDevice device) > { >-#if !ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS >- for (CommandBuffer &secondary : commandBuffersToReset) >- { >- // Note: we currently free the command buffers individually, but we could potentially reset >- // the entire command pool. https://issuetracker.google.com/issues/166793850 >- commandPool->freeCommandBuffers(device, 1, secondary.ptr()); >- secondary.releaseHandle(); >- } >- commandBuffersToReset.clear(); >-#endif >+ ResetSecondaryCommandBuffers(device, &commandPools->outsideRenderPassPool, >+ &commandBuffersToReset.outsideRenderPassCommandBuffers); >+ ResetSecondaryCommandBuffers(device, &commandPools->renderPassPool, >+ &commandBuffersToReset.renderPassCommandBuffers); > } > > // CommandProcessor implementation. >@@ -466,7 +496,7 @@ angle::Result CommandProcessor::processTask(CommandProcessorTask *task) > this, task->hasProtectedContent(), task->getPriority(), task->getWaitSemaphores(), > task->getWaitSemaphoreStageMasks(), task->getSemaphore(), > std::move(task->getGarbage()), std::move(task->getCommandBuffersToReset()), >- task->getCommandPool(), task->getQueueSerial())); >+ task->getCommandPools(), task->getQueueSerial())); > > ASSERT(task->getGarbage().empty()); > break; >@@ -511,25 +541,29 @@ angle::Result CommandProcessor::processTask(CommandProcessorTask *task) > } > break; > } >- case CustomTask::ProcessCommands: >+ case CustomTask::ProcessOutsideRenderPassCommands: > { >- ASSERT(!task->getCommandBuffer()->empty()); >- >- CommandBufferHelper *commandBuffer = task->getCommandBuffer(); >- if (task->getRenderPass()) >- { >- ANGLE_TRY(mCommandQueue.flushRenderPassCommands( >- this, task->hasProtectedContent(), *task->getRenderPass(), &commandBuffer)); >- } >- else >- { >- ANGLE_TRY(mCommandQueue.flushOutsideRPCommands(this, task->hasProtectedContent(), >- &commandBuffer)); >- } >- >- CommandBufferHelper *originalCommandBuffer = task->getCommandBuffer(); >- ASSERT(originalCommandBuffer->empty()); >- mRenderer->recycleCommandBufferHelper(mRenderer->getDevice(), &originalCommandBuffer); >+ OutsideRenderPassCommandBufferHelper *commandBuffer = >+ task->getOutsideRenderPassCommandBuffer(); >+ ANGLE_TRY(mCommandQueue.flushOutsideRPCommands(this, task->hasProtectedContent(), >+ &commandBuffer)); >+ >+ OutsideRenderPassCommandBufferHelper *originalCommandBuffer = >+ task->getOutsideRenderPassCommandBuffer(); >+ mRenderer->recycleOutsideRenderPassCommandBufferHelper(mRenderer->getDevice(), >+ &originalCommandBuffer); >+ break; >+ } >+ case CustomTask::ProcessRenderPassCommands: >+ { >+ RenderPassCommandBufferHelper *commandBuffer = task->getRenderPassCommandBuffer(); >+ ANGLE_TRY(mCommandQueue.flushRenderPassCommands( >+ this, task->hasProtectedContent(), *task->getRenderPass(), &commandBuffer)); >+ >+ RenderPassCommandBufferHelper *originalCommandBuffer = >+ task->getRenderPassCommandBuffer(); >+ mRenderer->recycleRenderPassCommandBufferHelper(mRenderer->getDevice(), >+ &originalCommandBuffer); > break; > } > case CustomTask::CheckCompletedCommands: >@@ -689,15 +723,15 @@ angle::Result CommandProcessor::submitFrame( > const std::vector<VkPipelineStageFlags> &waitSemaphoreStageMasks, > const Semaphore *signalSemaphore, > GarbageList &¤tGarbage, >- std::vector<CommandBuffer> &&commandBuffersToReset, >- CommandPool *commandPool, >+ SecondaryCommandBufferList &&commandBuffersToReset, >+ SecondaryCommandPools *commandPools, > Serial submitQueueSerial) > { > ANGLE_TRY(checkAndPopPendingError(context)); > > CommandProcessorTask task; > task.initFlushAndQueueSubmit(waitSemaphores, waitSemaphoreStageMasks, signalSemaphore, >- hasProtectedContent, priority, commandPool, >+ hasProtectedContent, priority, commandPools, > std::move(currentGarbage), std::move(commandBuffersToReset), > submitQueueSerial); > >@@ -757,33 +791,35 @@ angle::Result CommandProcessor::waitForSerialWithUserTimeout(vk::Context *contex > return finishToSerial(context, serial, mRenderer->getMaxFenceWaitTimeNs()); > } > >-angle::Result CommandProcessor::flushOutsideRPCommands(Context *context, >- bool hasProtectedContent, >- CommandBufferHelper **outsideRPCommands) >+angle::Result CommandProcessor::flushOutsideRPCommands( >+ Context *context, >+ bool hasProtectedContent, >+ OutsideRenderPassCommandBufferHelper **outsideRPCommands) > { > ANGLE_TRY(checkAndPopPendingError(context)); > > (*outsideRPCommands)->markClosed(); > CommandProcessorTask task; >- task.initProcessCommands(hasProtectedContent, *outsideRPCommands, nullptr); >+ task.initOutsideRenderPassProcessCommands(hasProtectedContent, *outsideRPCommands); > queueCommand(std::move(task)); >- return mRenderer->getCommandBufferHelper(context, false, (*outsideRPCommands)->getCommandPool(), >- outsideRPCommands); >+ return mRenderer->getOutsideRenderPassCommandBufferHelper( >+ context, (*outsideRPCommands)->getCommandPool(), outsideRPCommands); > } > >-angle::Result CommandProcessor::flushRenderPassCommands(Context *context, >- bool hasProtectedContent, >- const RenderPass &renderPass, >- CommandBufferHelper **renderPassCommands) >+angle::Result CommandProcessor::flushRenderPassCommands( >+ Context *context, >+ bool hasProtectedContent, >+ const RenderPass &renderPass, >+ RenderPassCommandBufferHelper **renderPassCommands) > { > ANGLE_TRY(checkAndPopPendingError(context)); > > (*renderPassCommands)->markClosed(); > CommandProcessorTask task; >- task.initProcessCommands(hasProtectedContent, *renderPassCommands, &renderPass); >+ task.initRenderPassProcessCommands(hasProtectedContent, *renderPassCommands, &renderPass); > queueCommand(std::move(task)); >- return mRenderer->getCommandBufferHelper(context, true, (*renderPassCommands)->getCommandPool(), >- renderPassCommands); >+ return mRenderer->getRenderPassCommandBufferHelper( >+ context, (*renderPassCommands)->getCommandPool(), renderPassCommands); > } > > angle::Result CommandProcessor::ensureNoPendingWork(Context *context) >@@ -892,16 +928,16 @@ angle::Result CommandQueue::retireFinishedCommands(Context *context, size_t fini > mInFlightCommands.erase(beginIter, beginIter + finishedCount); > } > >- size_t freeIndex = 0; >- for (; freeIndex < mGarbageQueue.size(); ++freeIndex) >+ while (!mGarbageQueue.empty()) > { >- GarbageAndSerial &garbageList = mGarbageQueue[freeIndex]; >+ GarbageAndSerial &garbageList = mGarbageQueue.front(); > if (garbageList.getSerial() < mLastCompletedQueueSerial) > { > for (GarbageObject &garbage : garbageList.get()) > { > garbage.destroy(renderer); > } >+ mGarbageQueue.pop(); > } > else > { >@@ -909,37 +945,32 @@ angle::Result CommandQueue::retireFinishedCommands(Context *context, size_t fini > } > } > >- // Remove the entries from the garbage list - they should be ready to go. >- if (freeIndex > 0) >- { >- mGarbageQueue.erase(mGarbageQueue.begin(), mGarbageQueue.begin() + freeIndex); >- } >- > return angle::Result::Continue; > } > > void CommandQueue::releaseToCommandBatch(bool hasProtectedContent, > PrimaryCommandBuffer &&commandBuffer, >- CommandPool *commandPool, >+ SecondaryCommandPools *commandPools, > CommandBatch *batch) > { > ANGLE_TRACE_EVENT0("gpu.angle", "CommandQueue::releaseToCommandBatch"); > > batch->primaryCommands = std::move(commandBuffer); >- batch->commandPool = commandPool; >+ batch->commandPools = commandPools; > batch->hasProtectedContent = hasProtectedContent; > } > > void CommandQueue::clearAllGarbage(RendererVk *renderer) > { >- for (GarbageAndSerial &garbageList : mGarbageQueue) >+ while (!mGarbageQueue.empty()) > { >+ GarbageAndSerial &garbageList = mGarbageQueue.front(); > for (GarbageObject &garbage : garbageList.get()) > { > garbage.destroy(renderer); > } >+ mGarbageQueue.pop(); > } >- mGarbageQueue.clear(); > } > > void CommandQueue::handleDeviceLost(RendererVk *renderer) >@@ -1029,8 +1060,8 @@ angle::Result CommandQueue::submitFrame( > const std::vector<VkPipelineStageFlags> &waitSemaphoreStageMasks, > const Semaphore *signalSemaphore, > GarbageList &¤tGarbage, >- std::vector<CommandBuffer> &&commandBuffersToReset, >- CommandPool *commandPool, >+ SecondaryCommandBufferList &&commandBuffersToReset, >+ SecondaryCommandPools *commandPools, > Serial submitQueueSerial) > { > // Start an empty primary buffer if we have an empty submit. >@@ -1068,7 +1099,7 @@ angle::Result CommandQueue::submitFrame( > > if (!currentGarbage.empty()) > { >- mGarbageQueue.emplace_back(std::move(currentGarbage), batch.serial); >+ mGarbageQueue.emplace(std::move(currentGarbage), batch.serial); > } > > // Store the primary CommandBuffer and command pool used for secondary CommandBuffers >@@ -1076,11 +1107,11 @@ angle::Result CommandQueue::submitFrame( > if (hasProtectedContent) > { > releaseToCommandBatch(hasProtectedContent, std::move(mProtectedPrimaryCommands), >- commandPool, &batch); >+ commandPools, &batch); > } > else > { >- releaseToCommandBatch(hasProtectedContent, std::move(mPrimaryCommands), commandPool, >+ releaseToCommandBatch(hasProtectedContent, std::move(mPrimaryCommands), commandPools, > &batch); > } > mInFlightCommands.emplace_back(scopedBatch.release()); >@@ -1168,19 +1199,21 @@ angle::Result CommandQueue::ensurePrimaryCommandBufferValid(Context *context, > return angle::Result::Continue; > } > >-angle::Result CommandQueue::flushOutsideRPCommands(Context *context, >- bool hasProtectedContent, >- CommandBufferHelper **outsideRPCommands) >+angle::Result CommandQueue::flushOutsideRPCommands( >+ Context *context, >+ bool hasProtectedContent, >+ OutsideRenderPassCommandBufferHelper **outsideRPCommands) > { > ANGLE_TRY(ensurePrimaryCommandBufferValid(context, hasProtectedContent)); > PrimaryCommandBuffer &commandBuffer = getCommandBuffer(hasProtectedContent); >- return (*outsideRPCommands)->flushToPrimary(context, &commandBuffer, nullptr); >+ return (*outsideRPCommands)->flushToPrimary(context, &commandBuffer); > } > >-angle::Result CommandQueue::flushRenderPassCommands(Context *context, >- bool hasProtectedContent, >- const RenderPass &renderPass, >- CommandBufferHelper **renderPassCommands) >+angle::Result CommandQueue::flushRenderPassCommands( >+ Context *context, >+ bool hasProtectedContent, >+ const RenderPass &renderPass, >+ RenderPassCommandBufferHelper **renderPassCommands) > { > ANGLE_TRY(ensurePrimaryCommandBufferValid(context, hasProtectedContent)); > PrimaryCommandBuffer &commandBuffer = getCommandBuffer(hasProtectedContent); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.h >index 77d1ad99f64f357ec23414bae5689cd81fc19945..4f1b3cdcd8b8e06cf44875f76fe2e9a0b8fc0bcc 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/CommandProcessor.h >@@ -56,7 +56,8 @@ enum class CustomTask > { > Invalid = 0, > // Process SecondaryCommandBuffer commands into the primary CommandBuffer. >- ProcessCommands, >+ ProcessOutsideRenderPassCommands, >+ ProcessRenderPassCommands, > // End the current command buffer and submit commands to the queue > FlushAndQueueSubmit, > // Submit custom command buffer, excludes some state management >@@ -85,9 +86,12 @@ class CommandProcessorTask > > void initTask(CustomTask command) { mTask = command; } > >- void initProcessCommands(bool hasProtectedContent, >- CommandBufferHelper *commandBuffer, >- const RenderPass *renderPass); >+ void initOutsideRenderPassProcessCommands(bool hasProtectedContent, >+ OutsideRenderPassCommandBufferHelper *commandBuffer); >+ >+ void initRenderPassProcessCommands(bool hasProtectedContent, >+ RenderPassCommandBufferHelper *commandBuffer, >+ const RenderPass *renderPass); > > void initPresent(egl::ContextPriority priority, const VkPresentInfoKHR &presentInfo); > >@@ -100,9 +104,9 @@ class CommandProcessorTask > const Semaphore *semaphore, > bool hasProtectedContent, > egl::ContextPriority priority, >- CommandPool *commandPool, >+ SecondaryCommandPools *commandPools, > GarbageList &¤tGarbage, >- std::vector<CommandBuffer> &&commandBuffersToReset, >+ SecondaryCommandBufferList &&commandBuffersToReset, > Serial submitQueueSerial); > > void initOneOffQueueSubmit(VkCommandBuffer commandBufferHandle, >@@ -130,7 +134,10 @@ class CommandProcessorTask > } > const Semaphore *getSemaphore() { return mSemaphore; } > GarbageList &getGarbage() { return mGarbage; } >- std::vector<CommandBuffer> &getCommandBuffersToReset() { return mCommandBuffersToReset; } >+ SecondaryCommandBufferList &&getCommandBuffersToReset() >+ { >+ return std::move(mCommandBuffersToReset); >+ } > egl::ContextPriority getPriority() const { return mPriority; } > bool hasProtectedContent() const { return mHasProtectedContent; } > VkCommandBuffer getOneOffCommandBufferVk() const { return mOneOffCommandBufferVk; } >@@ -139,8 +146,15 @@ class CommandProcessorTask > const Fence *getOneOffFence() { return mOneOffFence; } > const VkPresentInfoKHR &getPresentInfo() const { return mPresentInfo; } > const RenderPass *getRenderPass() const { return mRenderPass; } >- CommandBufferHelper *getCommandBuffer() const { return mCommandBuffer; } >- CommandPool *getCommandPool() const { return mCommandPool; } >+ OutsideRenderPassCommandBufferHelper *getOutsideRenderPassCommandBuffer() const >+ { >+ return mOutsideRenderPassCommandBuffer; >+ } >+ RenderPassCommandBufferHelper *getRenderPassCommandBuffer() const >+ { >+ return mRenderPassCommandBuffer; >+ } >+ SecondaryCommandPools *getCommandPools() const { return mCommandPools; } > > private: > void copyPresentInfo(const VkPresentInfoKHR &other); >@@ -148,16 +162,17 @@ class CommandProcessorTask > CustomTask mTask; > > // ProcessCommands >+ OutsideRenderPassCommandBufferHelper *mOutsideRenderPassCommandBuffer; >+ RenderPassCommandBufferHelper *mRenderPassCommandBuffer; > const RenderPass *mRenderPass; >- CommandBufferHelper *mCommandBuffer; > > // Flush data > std::vector<VkSemaphore> mWaitSemaphores; > std::vector<VkPipelineStageFlags> mWaitSemaphoreStageMasks; > const Semaphore *mSemaphore; >- CommandPool *mCommandPool; >+ SecondaryCommandPools *mCommandPools; > GarbageList mGarbage; >- std::vector<CommandBuffer> mCommandBuffersToReset; >+ SecondaryCommandBufferList mCommandBuffersToReset; > > // FinishToSerial & Flush command data > Serial mSerial; >@@ -194,9 +209,9 @@ struct CommandBatch final : angle::NonCopyable > void resetSecondaryCommandBuffers(VkDevice device); > > PrimaryCommandBuffer primaryCommands; >- // commandPool is for secondary CommandBuffer allocation >- CommandPool *commandPool; >- std::vector<CommandBuffer> commandBuffersToReset; >+ // commandPools is for secondary CommandBuffer allocation >+ SecondaryCommandPools *commandPools; >+ SecondaryCommandBufferList commandBuffersToReset; > Shared<Fence> fence; > Serial serial; > bool hasProtectedContent; >@@ -290,8 +305,8 @@ class CommandQueueInterface : angle::NonCopyable > const std::vector<VkPipelineStageFlags> &waitSemaphoreStageMasks, > const Semaphore *signalSemaphore, > GarbageList &¤tGarbage, >- std::vector<CommandBuffer> &&commandBuffersToReset, >- CommandPool *commandPool, >+ SecondaryCommandBufferList &&commandBuffersToReset, >+ SecondaryCommandPools *commandPools, > Serial submitQueueSerial) = 0; > virtual angle::Result queueSubmitOneOff(Context *context, > bool hasProtectedContent, >@@ -315,13 +330,15 @@ class CommandQueueInterface : angle::NonCopyable > // result). It would be nice if we didn't have to expose this for QueryVk::getResult. > virtual angle::Result checkCompletedCommands(Context *context) = 0; > >- virtual angle::Result flushOutsideRPCommands(Context *context, >- bool hasProtectedContent, >- CommandBufferHelper **outsideRPCommands) = 0; >- virtual angle::Result flushRenderPassCommands(Context *context, >- bool hasProtectedContent, >- const RenderPass &renderPass, >- CommandBufferHelper **renderPassCommands) = 0; >+ virtual angle::Result flushOutsideRPCommands( >+ Context *context, >+ bool hasProtectedContent, >+ OutsideRenderPassCommandBufferHelper **outsideRPCommands) = 0; >+ virtual angle::Result flushRenderPassCommands( >+ Context *context, >+ bool hasProtectedContent, >+ const RenderPass &renderPass, >+ RenderPassCommandBufferHelper **renderPassCommands) = 0; > > // For correct synchronization with external, in particular when asked to signal an external > // semaphore, we need to ensure that there are no pending submissions. >@@ -355,8 +372,8 @@ class CommandQueue final : public CommandQueueInterface > const std::vector<VkPipelineStageFlags> &waitSemaphoreStageMasks, > const Semaphore *signalSemaphore, > GarbageList &¤tGarbage, >- std::vector<CommandBuffer> &&commandBuffersToReset, >- CommandPool *commandPool, >+ SecondaryCommandBufferList &&commandBuffersToReset, >+ SecondaryCommandPools *commandPools, > Serial submitQueueSerial) override; > > angle::Result queueSubmitOneOff(Context *context, >@@ -379,13 +396,15 @@ class CommandQueue final : public CommandQueueInterface > > angle::Result checkCompletedCommands(Context *context) override; > >- angle::Result flushOutsideRPCommands(Context *context, >- bool hasProtectedContent, >- CommandBufferHelper **outsideRPCommands) override; >- angle::Result flushRenderPassCommands(Context *context, >- bool hasProtectedContent, >- const RenderPass &renderPass, >- CommandBufferHelper **renderPassCommands) override; >+ angle::Result flushOutsideRPCommands( >+ Context *context, >+ bool hasProtectedContent, >+ OutsideRenderPassCommandBufferHelper **outsideRPCommands) override; >+ angle::Result flushRenderPassCommands( >+ Context *context, >+ bool hasProtectedContent, >+ const RenderPass &renderPass, >+ RenderPassCommandBufferHelper **renderPassCommands) override; > > angle::Result ensureNoPendingWork(Context *context) override { return angle::Result::Continue; } > >@@ -409,7 +428,7 @@ class CommandQueue final : public CommandQueueInterface > private: > void releaseToCommandBatch(bool hasProtectedContent, > PrimaryCommandBuffer &&commandBuffer, >- CommandPool *commandPool, >+ SecondaryCommandPools *commandPools, > CommandBatch *batch); > angle::Result retireFinishedCommands(Context *context, size_t finishedCount); > angle::Result ensurePrimaryCommandBufferValid(Context *context, bool hasProtectedContent); >@@ -504,8 +523,8 @@ class CommandProcessor : public Context, public CommandQueueInterface > const std::vector<VkPipelineStageFlags> &waitSemaphoreStageMasks, > const Semaphore *signalSemaphore, > GarbageList &¤tGarbage, >- std::vector<CommandBuffer> &&commandBuffersToReset, >- CommandPool *commandPool, >+ SecondaryCommandBufferList &&commandBuffersToReset, >+ SecondaryCommandPools *commandPools, > Serial submitQueueSerial) override; > > angle::Result queueSubmitOneOff(Context *context, >@@ -527,13 +546,15 @@ class CommandProcessor : public Context, public CommandQueueInterface > > angle::Result checkCompletedCommands(Context *context) override; > >- angle::Result flushOutsideRPCommands(Context *context, >- bool hasProtectedContent, >- CommandBufferHelper **outsideRPCommands) override; >- angle::Result flushRenderPassCommands(Context *context, >- bool hasProtectedContent, >- const RenderPass &renderPass, >- CommandBufferHelper **renderPassCommands) override; >+ angle::Result flushOutsideRPCommands( >+ Context *context, >+ bool hasProtectedContent, >+ OutsideRenderPassCommandBufferHelper **outsideRPCommands) override; >+ angle::Result flushRenderPassCommands( >+ Context *context, >+ bool hasProtectedContent, >+ const RenderPass &renderPass, >+ RenderPassCommandBufferHelper **renderPassCommands) override; > > angle::Result ensureNoPendingWork(Context *context) override; > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.cpp >index 36d0aa34d86677ba34ec348b808486de708ea42e..de784aa6ba6088a8070c2d4aeab186633cb8f88d 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.cpp >@@ -63,7 +63,7 @@ struct GraphicsDriverUniforms > // 32 bits for 32 clip planes > uint32_t enabledClipPlanes; > >- uint32_t xfbActiveUnpaused; >+ uint32_t unused; // Gap usable for future > int32_t xfbVerticesPerInstance; > > // Used to replace gl_NumSamples. Because gl_NumSamples cannot be recognized in SPIR-V. >@@ -209,10 +209,10 @@ void ApplySampleCoverage(const gl::State &glState, > *maskOut &= coverageMask; > } > >-bool IsRenderPassStartedAndUsesImage(const vk::CommandBufferHelper &renderPassCommands, >+bool IsRenderPassStartedAndUsesImage(const vk::RenderPassCommandBufferHelper &renderPassCommands, > const vk::ImageHelper &image) > { >- return renderPassCommands.started() && renderPassCommands.usesImageInRenderPass(image); >+ return renderPassCommands.started() && renderPassCommands.usesImage(image); > } > > // When an Android surface is rotated differently than the device's native orientation, ANGLE must >@@ -365,6 +365,153 @@ void AppendBufferVectorToDesc(vk::ShaderBuffersDescriptorDesc *desc, > desc->append32BitValue(std::numeric_limits<uint32_t>::max()); > } > >+vk::ImageLayout GetImageReadLayout(TextureVk *textureVk, >+ const gl::ProgramExecutable *executable, >+ size_t textureUnit, >+ PipelineType pipelineType) >+{ >+ vk::ImageHelper &image = textureVk->getImage(); >+ >+ if (textureVk->hasBeenBoundAsImage()) >+ { >+ return pipelineType == PipelineType::Compute ? vk::ImageLayout::ComputeShaderWrite >+ : vk::ImageLayout::AllGraphicsShadersWrite; >+ } >+ >+ gl::ShaderBitSet remainingShaderBits = >+ executable->getSamplerShaderBitsForTextureUnitIndex(textureUnit); >+ ASSERT(remainingShaderBits.any()); >+ gl::ShaderType firstShader = remainingShaderBits.first(); >+ gl::ShaderType lastShader = remainingShaderBits.last(); >+ remainingShaderBits.reset(firstShader); >+ remainingShaderBits.reset(lastShader); >+ >+ if (image.hasRenderPassUsageFlag(vk::RenderPassUsage::RenderTargetAttachment)) >+ { >+ // Right now we set this flag only when RenderTargetAttachment is set since we do >+ // not track all textures in the renderpass. >+ image.setRenderPassUsageFlag(vk::RenderPassUsage::TextureSampler); >+ >+ if (image.isDepthOrStencil()) >+ { >+ if (image.hasRenderPassUsageFlag(vk::RenderPassUsage::ReadOnlyAttachment)) >+ { >+ if (firstShader == gl::ShaderType::Fragment) >+ { >+ ASSERT(remainingShaderBits.none() && lastShader == firstShader); >+ return vk::ImageLayout::DSAttachmentReadAndFragmentShaderRead; >+ } >+ return vk::ImageLayout::DSAttachmentReadAndAllShadersRead; >+ } >+ >+ return firstShader == gl::ShaderType::Fragment >+ ? vk::ImageLayout::DSAttachmentWriteAndFragmentShaderRead >+ : vk::ImageLayout::DSAttachmentWriteAndAllShadersRead; >+ } >+ >+ return firstShader == gl::ShaderType::Fragment >+ ? vk::ImageLayout::ColorAttachmentAndFragmentShaderRead >+ : vk::ImageLayout::ColorAttachmentAndAllShadersRead; >+ } >+ >+ if (image.isDepthOrStencil()) >+ { >+ // We always use a depth-stencil read-only layout for any depth Textures to simplify >+ // our implementation's handling of depth-stencil read-only mode. We don't have to >+ // split a RenderPass to transition a depth texture from shader-read to read-only. >+ // This improves performance in Manhattan. Future optimizations are likely possible >+ // here including using specialized barriers without breaking the RenderPass. >+ if (firstShader == gl::ShaderType::Fragment) >+ { >+ ASSERT(remainingShaderBits.none() && lastShader == firstShader); >+ return vk::ImageLayout::DSAttachmentReadAndFragmentShaderRead; >+ } >+ return vk::ImageLayout::DSAttachmentReadAndAllShadersRead; >+ } >+ >+ // We barrier against either: >+ // - Vertex only >+ // - Fragment only >+ // - Pre-fragment only (vertex, geometry and tessellation together) >+ if (remainingShaderBits.any() || firstShader != lastShader) >+ { >+ return lastShader == gl::ShaderType::Fragment ? vk::ImageLayout::AllGraphicsShadersReadOnly >+ : vk::ImageLayout::PreFragmentShadersReadOnly; >+ } >+ >+ return kShaderReadOnlyImageLayouts[firstShader]; >+} >+ >+vk::ImageLayout GetImageWriteLayoutAndSubresource(const gl::ImageUnit &imageUnit, >+ vk::ImageHelper &image, >+ gl::ShaderBitSet shaderStages, >+ gl::LevelIndex *levelOut, >+ uint32_t *layerStartOut, >+ uint32_t *layerCountOut) >+{ >+ *levelOut = gl::LevelIndex(static_cast<uint32_t>(imageUnit.level)); >+ >+ *layerStartOut = 0; >+ *layerCountOut = image.getLayerCount(); >+ if (imageUnit.layered) >+ { >+ *layerStartOut = imageUnit.layered; >+ *layerCountOut = 1; >+ } >+ >+ gl::ShaderType firstShader = shaderStages.first(); >+ gl::ShaderType lastShader = shaderStages.last(); >+ shaderStages.reset(firstShader); >+ shaderStages.reset(lastShader); >+ // We barrier against either: >+ // - Vertex only >+ // - Fragment only >+ // - Pre-fragment only (vertex, geometry and tessellation together) >+ if (shaderStages.any() || firstShader != lastShader) >+ { >+ return lastShader == gl::ShaderType::Fragment ? vk::ImageLayout::AllGraphicsShadersWrite >+ : vk::ImageLayout::PreFragmentShadersWrite; >+ } >+ >+ return kShaderWriteImageLayouts[firstShader]; >+} >+ >+void OnTextureBufferRead(ContextVk *contextVk, >+ BufferVk *bufferVk, >+ gl::ShaderBitSet stages, >+ vk::CommandBufferHelperCommon *commandBufferHelper) >+{ >+ vk::BufferHelper &buffer = bufferVk->getBuffer(); >+ >+ ASSERT(stages.any()); >+ >+ // TODO: accept multiple stages in bufferRead. http://anglebug.com/3573 >+ for (gl::ShaderType stage : stages) >+ { >+ // Note: if another range of the same buffer is simultaneously used for storage, >+ // such as for transform feedback output, or SSBO, unnecessary barriers can be >+ // generated. >+ commandBufferHelper->bufferRead(contextVk, VK_ACCESS_SHADER_READ_BIT, >+ vk::GetPipelineStage(stage), &buffer); >+ } >+} >+ >+void OnImageBufferWrite(ContextVk *contextVk, >+ BufferVk *bufferVk, >+ gl::ShaderBitSet stages, >+ vk::CommandBufferHelperCommon *commandBufferHelper) >+{ >+ vk::BufferHelper &buffer = bufferVk->getBuffer(); >+ >+ // TODO: accept multiple stages in bufferWrite. http://anglebug.com/3573 >+ for (gl::ShaderType stage : stages) >+ { >+ commandBufferHelper->bufferWrite( >+ contextVk, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, >+ vk::GetPipelineStage(stage), vk::AliasingMode::Disallowed, &buffer); >+ } >+} >+ > constexpr angle::PackedEnumMap<RenderPassClosureReason, const char *> kRenderPassClosureReason = {{ > {RenderPassClosureReason::AlreadySpecifiedElsewhere, nullptr}, > {RenderPassClosureReason::ContextDestruction, "Render pass closed due to context destruction"}, >@@ -547,10 +694,6 @@ ContextVk::ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk > mCurrentRotationDrawFramebuffer(SurfaceRotation::Identity), > mCurrentRotationReadFramebuffer(SurfaceRotation::Identity), > mActiveRenderPassQueries{}, >- mVertexArray(nullptr), >- mDrawFramebuffer(nullptr), >- mProgram(nullptr), >- mExecutable(nullptr), > mLastIndexBufferOffset(nullptr), > mCurrentIndexBufferOffset(0), > mCurrentDrawElementsType(gl::DrawElementsType::InvalidEnum), >@@ -739,7 +882,6 @@ void ContextVk::onDestroy(const gl::Context *context) > > mDefaultUniformStorage.release(mRenderer); > mEmptyBuffer.release(mRenderer); >- mStagingBuffer.release(mRenderer); > > for (vk::DynamicBuffer &defaultBuffer : mDefaultAttribBuffers) > { >@@ -752,8 +894,8 @@ void ContextVk::onDestroy(const gl::Context *context) > } > > // Recycle current commands buffers. >- mRenderer->recycleCommandBufferHelper(device, &mOutsideRenderPassCommands); >- mRenderer->recycleCommandBufferHelper(device, &mRenderPassCommands); >+ mRenderer->recycleOutsideRenderPassCommandBufferHelper(device, &mOutsideRenderPassCommands); >+ mRenderer->recycleRenderPassCommandBufferHelper(device, &mRenderPassCommands); > > mRenderer->releaseSharedResources(&mResourceUseList); > >@@ -762,12 +904,33 @@ void ContextVk::onDestroy(const gl::Context *context) > mRenderPassCache.destroy(mRenderer); > mShaderLibrary.destroy(device); > mGpuEventQueryPool.destroy(device); >- mCommandPool.destroy(device); >+ mCommandPools.outsideRenderPassPool.destroy(device); >+ mCommandPools.renderPassPool.destroy(device); > > ASSERT(mCurrentGarbage.empty()); > ASSERT(mResourceUseList.empty()); > } > >+VertexArrayVk *ContextVk::getVertexArray() const >+{ >+ return vk::GetImpl(mState.getVertexArray()); >+} >+ >+FramebufferVk *ContextVk::getDrawFramebuffer() const >+{ >+ return vk::GetImpl(mState.getDrawFramebuffer()); >+} >+ >+ProgramVk *ContextVk::getProgram() const >+{ >+ return vk::SafeGetImpl(mState.getProgram()); >+} >+ >+ProgramPipelineVk *ContextVk::getProgramPipeline() const >+{ >+ return vk::SafeGetImpl(mState.getProgramPipeline()); >+} >+ > angle::Result ContextVk::getIncompleteTexture(const gl::Context *context, > gl::TextureType type, > gl::SamplerFormat format, >@@ -870,11 +1033,16 @@ angle::Result ContextVk::initialize() > mEmulateSeamfulCubeMapSampling = shouldEmulateSeamfulCubeMapSampling(); > > // Assign initial command buffers from queue >- ANGLE_TRY(vk::CommandBuffer::InitializeCommandPool( >- this, &mCommandPool, mRenderer->getDeviceQueueIndex(), hasProtectedContent())); >- ANGLE_TRY( >- mRenderer->getCommandBufferHelper(this, false, &mCommandPool, &mOutsideRenderPassCommands)); >- ANGLE_TRY(mRenderer->getCommandBufferHelper(this, true, &mCommandPool, &mRenderPassCommands)); >+ ANGLE_TRY(vk::OutsideRenderPassCommandBuffer::InitializeCommandPool( >+ this, &mCommandPools.outsideRenderPassPool, mRenderer->getDeviceQueueIndex(), >+ hasProtectedContent())); >+ ANGLE_TRY(vk::RenderPassCommandBuffer::InitializeCommandPool( >+ this, &mCommandPools.renderPassPool, mRenderer->getDeviceQueueIndex(), >+ hasProtectedContent())); >+ ANGLE_TRY(mRenderer->getOutsideRenderPassCommandBufferHelper( >+ this, &mCommandPools.outsideRenderPassPool, &mOutsideRenderPassCommands)); >+ ANGLE_TRY(mRenderer->getRenderPassCommandBufferHelper(this, &mCommandPools.renderPassPool, >+ &mRenderPassCommands)); > > if (mGpuEventsEnabled) > { >@@ -914,25 +1082,6 @@ angle::Result ContextVk::initialize() > constexpr VkMemoryPropertyFlags kMemoryType = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; > ANGLE_TRY(mEmptyBuffer.init(this, emptyBufferInfo, kMemoryType)); > >- constexpr VkImageUsageFlags kStagingBufferUsageFlags = >- VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; >- size_t stagingBufferAlignment = >- static_cast<size_t>(mRenderer->getPhysicalDeviceProperties().limits.minMemoryMapAlignment); >- ASSERT(gl::isPow2(mRenderer->getPhysicalDeviceProperties().limits.nonCoherentAtomSize)); >- ASSERT(gl::isPow2( >- mRenderer->getPhysicalDeviceProperties().limits.optimalBufferCopyOffsetAlignment)); >- stagingBufferAlignment = static_cast<size_t>(std::max( >- stagingBufferAlignment, >- static_cast<size_t>( >- mRenderer->getPhysicalDeviceProperties().limits.optimalBufferCopyOffsetAlignment))); >- stagingBufferAlignment = static_cast<size_t>(std::max( >- stagingBufferAlignment, >- static_cast<size_t>(mRenderer->getPhysicalDeviceProperties().limits.nonCoherentAtomSize))); >- >- constexpr size_t kStagingBufferSize = 1024u * 1024u; // 1M >- mStagingBuffer.init(mRenderer, kStagingBufferUsageFlags, stagingBufferAlignment, >- kStagingBufferSize, true, vk::DynamicBufferPolicy::SporadicTextureUpload); >- > // Add context into the share group > mShareGroupVk->getContexts()->insert(this); > >@@ -979,24 +1128,22 @@ angle::Result ContextVk::setupDraw(const gl::Context *context, > } > > // Must be called before the command buffer is started. Can call finish. >- if (mVertexArray->getStreamingVertexAttribsMask().any()) >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ if (vertexArrayVk->getStreamingVertexAttribsMask().any()) > { > // All client attribs & any emulated buffered attribs will be updated >- ANGLE_TRY(mVertexArray->updateStreamedAttribs(context, firstVertexOrInvalid, >- vertexOrIndexCount, instanceCount, >- indexTypeOrInvalid, indices)); >+ ANGLE_TRY(vertexArrayVk->updateStreamedAttribs(context, firstVertexOrInvalid, >+ vertexOrIndexCount, instanceCount, >+ indexTypeOrInvalid, indices)); > > mGraphicsDirtyBits.set(DIRTY_BIT_VERTEX_BUFFERS); > } > >- if (mProgram && mProgram->hasDirtyUniforms()) >+ ProgramExecutableVk *programExecutableVk = getExecutable(); >+ if (programExecutableVk->hasDirtyUniforms()) > { >- ANGLE_TRY(mProgram->updateUniforms(this)); >- mGraphicsDirtyBits.set(DIRTY_BIT_DESCRIPTOR_SETS); >- } >- else if (mProgramPipeline && mProgramPipeline->hasDirtyUniforms()) >- { >- ANGLE_TRY(mProgramPipeline->updateUniforms(this)); >+ ANGLE_TRY(programExecutableVk->updateUniforms(this, *mState.getProgramExecutable(), >+ &mDefaultUniformStorage)); > mGraphicsDirtyBits.set(DIRTY_BIT_DESCRIPTOR_SETS); > } > >@@ -1051,11 +1198,12 @@ angle::Result ContextVk::setupIndexedDraw(const gl::Context *context, > ANGLE_TRY(onIndexBufferChange(nullptr)); > } > >- const gl::Buffer *elementArrayBuffer = mVertexArray->getState().getElementArrayBuffer(); >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ const gl::Buffer *elementArrayBuffer = vertexArrayVk->getState().getElementArrayBuffer(); > if (!elementArrayBuffer) > { > mGraphicsDirtyBits.set(DIRTY_BIT_INDEX_BUFFER); >- ANGLE_TRY(mVertexArray->convertIndexBufferCPU(this, indexType, indexCount, indices)); >+ ANGLE_TRY(vertexArrayVk->convertIndexBufferCPU(this, indexType, indexCount, indices)); > mCurrentIndexBufferOffset = 0; > } > else >@@ -1086,12 +1234,12 @@ angle::Result ContextVk::setupIndexedDraw(const gl::Context *context, > src += reinterpret_cast<uintptr_t>(indices); > const size_t byteCount = static_cast<size_t>(elementArrayBuffer->getSize()) - > reinterpret_cast<uintptr_t>(indices); >- ANGLE_TRY(mVertexArray->convertIndexBufferCPU(this, indexType, byteCount, src)); >+ ANGLE_TRY(vertexArrayVk->convertIndexBufferCPU(this, indexType, byteCount, src)); > ANGLE_TRY(bufferVk->unmapImpl(this)); > } > else > { >- ANGLE_TRY(mVertexArray->convertIndexBufferGPU(this, bufferVk, indices)); >+ ANGLE_TRY(vertexArrayVk->convertIndexBufferGPU(this, bufferVk, indices)); > } > > mCurrentIndexBufferOffset = 0; >@@ -1105,8 +1253,7 @@ angle::Result ContextVk::setupIndexedDraw(const gl::Context *context, > angle::Result ContextVk::setupIndirectDraw(const gl::Context *context, > gl::PrimitiveMode mode, > DirtyBits dirtyBitMask, >- vk::BufferHelper *indirectBuffer, >- VkDeviceSize indirectBufferOffset) >+ vk::BufferHelper *indirectBuffer) > { > GLint firstVertex = -1; > GLsizei vertexCount = 0; >@@ -1133,8 +1280,7 @@ angle::Result ContextVk::setupIndirectDraw(const gl::Context *context, > angle::Result ContextVk::setupIndexedIndirectDraw(const gl::Context *context, > gl::PrimitiveMode mode, > gl::DrawElementsType indexType, >- vk::BufferHelper *indirectBuffer, >- VkDeviceSize indirectBufferOffset) >+ vk::BufferHelper *indirectBuffer) > { > ASSERT(mode != gl::PrimitiveMode::LineLoop); > >@@ -1144,8 +1290,7 @@ angle::Result ContextVk::setupIndexedIndirectDraw(const gl::Context *context, > ANGLE_TRY(onIndexBufferChange(nullptr)); > } > >- return setupIndirectDraw(context, mode, mIndexedDirtyBitsMask, indirectBuffer, >- indirectBufferOffset); >+ return setupIndirectDraw(context, mode, mIndexedDirtyBitsMask, indirectBuffer); > } > > angle::Result ContextVk::setupLineLoopIndexedIndirectDraw(const gl::Context *context, >@@ -1153,20 +1298,17 @@ angle::Result ContextVk::setupLineLoopIndexedIndirectDraw(const gl::Context *con > gl::DrawElementsType indexType, > vk::BufferHelper *srcIndirectBuf, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut) >+ vk::BufferHelper **indirectBufferOut) > { > ASSERT(mode == gl::PrimitiveMode::LineLoop); > >- vk::BufferHelper *dstIndirectBuf = nullptr; >- VkDeviceSize dstIndirectBufOffset = 0; >+ vk::BufferHelper *dstIndirectBuf = nullptr; > >- ANGLE_TRY(mVertexArray->handleLineLoopIndexIndirect(this, indexType, srcIndirectBuf, >- indirectBufferOffset, &dstIndirectBuf, >- &dstIndirectBufOffset)); >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ ANGLE_TRY(vertexArrayVk->handleLineLoopIndexIndirect(this, indexType, srcIndirectBuf, >+ indirectBufferOffset, &dstIndirectBuf)); > >- *indirectBufferOut = dstIndirectBuf; >- *indirectBufferOffsetOut = dstIndirectBufOffset; >+ *indirectBufferOut = dstIndirectBuf; > > if (indexType != mCurrentDrawElementsType) > { >@@ -1174,24 +1316,22 @@ angle::Result ContextVk::setupLineLoopIndexedIndirectDraw(const gl::Context *con > ANGLE_TRY(onIndexBufferChange(nullptr)); > } > >- return setupIndirectDraw(context, mode, mIndexedDirtyBitsMask, dstIndirectBuf, >- dstIndirectBufOffset); >+ return setupIndirectDraw(context, mode, mIndexedDirtyBitsMask, dstIndirectBuf); > } > > angle::Result ContextVk::setupLineLoopIndirectDraw(const gl::Context *context, > gl::PrimitiveMode mode, > vk::BufferHelper *indirectBuffer, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut) >+ vk::BufferHelper **indirectBufferOut) > { > ASSERT(mode == gl::PrimitiveMode::LineLoop); > > vk::BufferHelper *indirectBufferHelperOut = nullptr; > >- ANGLE_TRY(mVertexArray->handleLineLoopIndirectDraw( >- context, indirectBuffer, indirectBufferOffset, &indirectBufferHelperOut, >- indirectBufferOffsetOut)); >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ ANGLE_TRY(vertexArrayVk->handleLineLoopIndirectDraw( >+ context, indirectBuffer, indirectBufferOffset, &indirectBufferHelperOut)); > > *indirectBufferOut = indirectBufferHelperOut; > >@@ -1201,8 +1341,7 @@ angle::Result ContextVk::setupLineLoopIndirectDraw(const gl::Context *context, > ANGLE_TRY(onIndexBufferChange(nullptr)); > } > >- return setupIndirectDraw(context, mode, mIndexedDirtyBitsMask, indirectBufferHelperOut, >- *indirectBufferOffsetOut); >+ return setupIndirectDraw(context, mode, mIndexedDirtyBitsMask, indirectBufferHelperOut); > } > > angle::Result ContextVk::setupLineLoopDraw(const gl::Context *context, >@@ -1213,9 +1352,10 @@ angle::Result ContextVk::setupLineLoopDraw(const gl::Context *context, > const void *indices, > uint32_t *numIndicesOut) > { >- mCurrentIndexBufferOffset = 0; >- ANGLE_TRY(mVertexArray->handleLineLoop(this, firstVertex, vertexOrIndexCount, >- indexTypeOrInvalid, indices, numIndicesOut)); >+ mCurrentIndexBufferOffset = 0; >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ ANGLE_TRY(vertexArrayVk->handleLineLoop(this, firstVertex, vertexOrIndexCount, >+ indexTypeOrInvalid, indices, numIndicesOut)); > ANGLE_TRY(onIndexBufferChange(nullptr)); > mCurrentDrawElementsType = indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum > ? indexTypeOrInvalid >@@ -1231,14 +1371,11 @@ angle::Result ContextVk::setupDispatch(const gl::Context *context) > // TODO: Remove this and fix tests. http://anglebug.com/5070 > ANGLE_TRY(flushOutsideRenderPassCommands()); > >- if (mProgram && mProgram->hasDirtyUniforms()) >+ ProgramExecutableVk *programExecutableVk = getExecutable(); >+ if (programExecutableVk->hasDirtyUniforms()) > { >- ANGLE_TRY(mProgram->updateUniforms(this)); >- mComputeDirtyBits.set(DIRTY_BIT_DESCRIPTOR_SETS); >- } >- else if (mProgramPipeline && mProgramPipeline->hasDirtyUniforms()) >- { >- ANGLE_TRY(mProgramPipeline->updateUniforms(this)); >+ ANGLE_TRY(programExecutableVk->updateUniforms(this, *mState.getProgramExecutable(), >+ &mDefaultUniformStorage)); > mComputeDirtyBits.set(DIRTY_BIT_DESCRIPTOR_SETS); > } > >@@ -1304,55 +1441,44 @@ bool ContextVk::renderPassUsesStorageResources() const > } > } > >- gl::ShaderMap<const gl::ProgramState *> programStates; >- mExecutable->fillProgramStateMap(this, &programStates); >- >- for (const gl::ShaderType shaderType : executable->getLinkedShaderStages()) >+ // Storage buffers: >+ const std::vector<gl::InterfaceBlock> &blocks = executable->getShaderStorageBlocks(); >+ for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex) > { >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >+ uint32_t binding = blocks[bufferIndex].binding; >+ const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = >+ mState.getIndexedShaderStorageBuffer(binding); > >- // Storage buffers: >- const std::vector<gl::InterfaceBlock> &blocks = programState->getShaderStorageBlocks(); >- >- for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex) >+ if (bufferBinding.get() == nullptr) > { >- const gl::InterfaceBlock &block = blocks[bufferIndex]; >- const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = >- mState.getIndexedShaderStorageBuffer(block.binding); >- >- if (!block.isActive(shaderType) || bufferBinding.get() == nullptr) >- { >- continue; >- } >+ continue; >+ } > >- vk::BufferHelper &buffer = vk::GetImpl(bufferBinding.get())->getBuffer(); >- if (mRenderPassCommands->usesBuffer(buffer)) >- { >- return true; >- } >+ vk::BufferHelper &buffer = vk::GetImpl(bufferBinding.get())->getBuffer(); >+ if (mRenderPassCommands->usesBuffer(buffer)) >+ { >+ return true; > } >+ } > >- // Atomic counters: >- const std::vector<gl::AtomicCounterBuffer> &atomicCounterBuffers = >- programState->getAtomicCounterBuffers(); >+ // Atomic counters: >+ const std::vector<gl::AtomicCounterBuffer> &atomicCounterBuffers = >+ executable->getAtomicCounterBuffers(); >+ for (uint32_t bufferIndex = 0; bufferIndex < atomicCounterBuffers.size(); ++bufferIndex) >+ { >+ uint32_t binding = atomicCounterBuffers[bufferIndex].binding; >+ const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = >+ mState.getIndexedAtomicCounterBuffer(binding); > >- for (uint32_t bufferIndex = 0; bufferIndex < atomicCounterBuffers.size(); ++bufferIndex) >+ if (bufferBinding.get() == nullptr) > { >- uint32_t binding = atomicCounterBuffers[bufferIndex].binding; >- const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = >- mState.getIndexedAtomicCounterBuffer(binding); >- >- if (bufferBinding.get() == nullptr) >- { >- continue; >- } >+ continue; >+ } > >- vk::BufferHelper &buffer = vk::GetImpl(bufferBinding.get())->getBuffer(); >- if (mRenderPassCommands->usesBuffer(buffer)) >- { >- return true; >- } >+ vk::BufferHelper &buffer = vk::GetImpl(bufferBinding.get())->getBuffer(); >+ if (mRenderPassCommands->usesBuffer(buffer)) >+ { >+ return true; > } > } > >@@ -1414,7 +1540,8 @@ angle::Result ContextVk::handleDirtyComputeEventLog() > return handleDirtyEventLogImpl(&mOutsideRenderPassCommands->getCommandBuffer()); > } > >-angle::Result ContextVk::handleDirtyEventLogImpl(vk::CommandBuffer *commandBuffer) >+template <typename CommandBufferT> >+angle::Result ContextVk::handleDirtyEventLogImpl(CommandBufferT *commandBuffer) > { > // This method is called when a draw or dispatch command is being processed. It's purpose is > // to call the vkCmd*DebugUtilsLabelEXT functions in order to communicate to debuggers >@@ -1499,7 +1626,8 @@ angle::Result ContextVk::handleDirtyGraphicsPipelineDesc(DirtyBits::Iterator *di > ? mCurrentGraphicsPipeline->getPipeline().getHandle() > : VK_NULL_HANDLE; > >- ASSERT(mExecutable); >+ ProgramExecutableVk *executableVk = getExecutable(); >+ ASSERT(executableVk); > > if (!mCurrentGraphicsPipeline) > { >@@ -1511,8 +1639,8 @@ angle::Result ContextVk::handleDirtyGraphicsPipelineDesc(DirtyBits::Iterator *di > updateGraphicsPipelineDescWithSpecConstUsageBits(usageBits); > > // Draw call shader patching, shader compilation, and pipeline cache query. >- ANGLE_TRY(mExecutable->getGraphicsPipeline(this, mCurrentDrawMode, *mGraphicsPipelineDesc, >- &descPtr, &mCurrentGraphicsPipeline)); >+ ANGLE_TRY(executableVk->getGraphicsPipeline(this, mCurrentDrawMode, *mGraphicsPipelineDesc, >+ &descPtr, &mCurrentGraphicsPipeline)); > mGraphicsPipelineTransition.reset(); > } > else if (mGraphicsPipelineTransition.any()) >@@ -1524,9 +1652,9 @@ angle::Result ContextVk::handleDirtyGraphicsPipelineDesc(DirtyBits::Iterator *di > vk::PipelineHelper *oldPipeline = mCurrentGraphicsPipeline; > const vk::GraphicsPipelineDesc *descPtr; > >- ANGLE_TRY(mExecutable->getGraphicsPipeline(this, mCurrentDrawMode, >- *mGraphicsPipelineDesc, &descPtr, >- &mCurrentGraphicsPipeline)); >+ ANGLE_TRY(executableVk->getGraphicsPipeline(this, mCurrentDrawMode, >+ *mGraphicsPipelineDesc, &descPtr, >+ &mCurrentGraphicsPipeline)); > > oldPipeline->addTransition(mGraphicsPipelineTransition, descPtr, > mCurrentGraphicsPipeline); >@@ -1578,7 +1706,8 @@ angle::Result ContextVk::handleDirtyGraphicsRenderPass(DirtyBits::Iterator *dirt > RenderPassClosureReason::AlreadySpecifiedElsewhere)); > } > >- gl::Rectangle scissoredRenderArea = mDrawFramebuffer->getRotatedScissoredRenderArea(this); >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ gl::Rectangle scissoredRenderArea = drawFramebufferVk->getRotatedScissoredRenderArea(this); > bool renderPassDescChanged = false; > > ANGLE_TRY(startRenderPass(scissoredRenderArea, nullptr, &renderPassDescChanged)); >@@ -1608,8 +1737,9 @@ angle::Result ContextVk::handleDirtyComputePipelineDesc() > { > if (!mCurrentComputePipeline) > { >- ASSERT(mExecutable); >- ANGLE_TRY(mExecutable->getComputePipeline(this, &mCurrentComputePipeline)); >+ ProgramExecutableVk *executableVk = getExecutable(); >+ ASSERT(executableVk); >+ ANGLE_TRY(executableVk->getComputePipeline(this, &mCurrentComputePipeline)); > } > > ASSERT(mComputeDirtyBits.test(DIRTY_BIT_PIPELINE_BINDING)); >@@ -1628,8 +1758,9 @@ angle::Result ContextVk::handleDirtyComputePipelineBinding() > return angle::Result::Continue; > } > >+template <typename CommandBufferHelperT> > ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl( >- vk::CommandBufferHelper *commandBufferHelper, >+ CommandBufferHelperT *commandBufferHelper, > PipelineType pipelineType) > { > const gl::ProgramExecutable *executable = mState.getProgramExecutable(); >@@ -1644,141 +1775,36 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyTexturesImpl( > // If it's a texture buffer, get the attached buffer. > if (textureVk->getBuffer().get() != nullptr) > { >- BufferVk *bufferVk = vk::GetImpl(textureVk->getBuffer().get()); >- vk::BufferHelper &buffer = bufferVk->getBuffer(); >- >- gl::ShaderBitSet stages = >+ BufferVk *bufferVk = vk::GetImpl(textureVk->getBuffer().get()); >+ const gl::ShaderBitSet stages = > executable->getSamplerShaderBitsForTextureUnitIndex(textureUnit); >- ASSERT(stages.any()); > >- // TODO: accept multiple stages in bufferRead. http://anglebug.com/3573 >- for (gl::ShaderType stage : stages) >- { >- // Note: if another range of the same buffer is simultaneously used for storage, >- // such as for transform feedback output, or SSBO, unnecessary barriers can be >- // generated. >- commandBufferHelper->bufferRead(this, VK_ACCESS_SHADER_READ_BIT, >- vk::GetPipelineStage(stage), &buffer); >- } >+ OnTextureBufferRead(this, bufferVk, stages, commandBufferHelper); > > textureVk->retainBufferViews(&mResourceUseList); >- > continue; > } > >- vk::ImageHelper &image = textureVk->getImage(); >- > // The image should be flushed and ready to use at this point. There may still be > // lingering staged updates in its staging buffer for unused texture mip levels or > // layers. Therefore we can't verify it has no staged updates right here. >+ vk::ImageHelper &image = textureVk->getImage(); > > // Select the appropriate vk::ImageLayout depending on whether the texture is also bound as > // a GL image, and whether the program is a compute or graphics shader. >- vk::ImageLayout textureLayout; >- if (textureVk->hasBeenBoundAsImage()) >- { >- textureLayout = pipelineType == PipelineType::Compute >- ? vk::ImageLayout::ComputeShaderWrite >- : vk::ImageLayout::AllGraphicsShadersWrite; >- } >- else >- { >- gl::ShaderBitSet remainingShaderBits = >- executable->getSamplerShaderBitsForTextureUnitIndex(textureUnit); >- ASSERT(remainingShaderBits.any()); >- gl::ShaderType firstShader = remainingShaderBits.first(); >- gl::ShaderType lastShader = remainingShaderBits.last(); >- remainingShaderBits.reset(firstShader); >- remainingShaderBits.reset(lastShader); >+ const vk::ImageLayout imageLayout = >+ GetImageReadLayout(textureVk, executable, textureUnit, pipelineType); > >- if (image.hasRenderPassUsageFlag(vk::RenderPassUsage::RenderTargetAttachment)) >- { >- // Right now we set this flag only when RenderTargetAttachment is set since we do >- // not track all textures in the renderpass. >- image.setRenderPassUsageFlag(vk::RenderPassUsage::TextureSampler); >- >- if (image.isDepthOrStencil()) >- { >- if (image.hasRenderPassUsageFlag(vk::RenderPassUsage::ReadOnlyAttachment)) >- { >- if (firstShader == gl::ShaderType::Fragment) >- { >- ASSERT(remainingShaderBits.none() && lastShader == firstShader); >- textureLayout = vk::ImageLayout::DSAttachmentReadAndFragmentShaderRead; >- } >- else >- { >- textureLayout = vk::ImageLayout::DSAttachmentReadAndAllShadersRead; >- } >- } >- else >- { >- if (firstShader == gl::ShaderType::Fragment) >- { >- textureLayout = vk::ImageLayout::DSAttachmentWriteAndFragmentShaderRead; >- } >- else >- { >- textureLayout = vk::ImageLayout::DSAttachmentWriteAndAllShadersRead; >- } >- } >- } >- else >- { >- if (firstShader == gl::ShaderType::Fragment) >- { >- textureLayout = vk::ImageLayout::ColorAttachmentAndFragmentShaderRead; >- } >- else >- { >- textureLayout = vk::ImageLayout::ColorAttachmentAndAllShadersRead; >- } >- } >- } >- else if (image.isDepthOrStencil()) >- { >- // We always use a depth-stencil read-only layout for any depth Textures to simplify >- // our implementation's handling of depth-stencil read-only mode. We don't have to >- // split a RenderPass to transition a depth texture from shader-read to read-only. >- // This improves performance in Manhattan. Future optimizations are likely possible >- // here including using specialized barriers without breaking the RenderPass. >- if (firstShader == gl::ShaderType::Fragment) >- { >- ASSERT(remainingShaderBits.none() && lastShader == firstShader); >- textureLayout = vk::ImageLayout::DSAttachmentReadAndFragmentShaderRead; >- } >- else >- { >- textureLayout = vk::ImageLayout::DSAttachmentReadAndAllShadersRead; >- } >- } >- else >- { >- // We barrier against either: >- // - Vertex only >- // - Fragment only >- // - Pre-fragment only (vertex, geometry and tessellation together) >- if (remainingShaderBits.any() || firstShader != lastShader) >- { >- textureLayout = lastShader == gl::ShaderType::Fragment >- ? vk::ImageLayout::AllGraphicsShadersReadOnly >- : vk::ImageLayout::PreFragmentShadersReadOnly; >- } >- else >- { >- textureLayout = kShaderReadOnlyImageLayouts[firstShader]; >- } >- } >- } > // Ensure the image is in the desired layout >- commandBufferHelper->imageRead(this, image.getAspectFlags(), textureLayout, &image); >+ commandBufferHelper->imageRead(this, image.getAspectFlags(), imageLayout, &image); > > textureVk->retainImageViews(&mResourceUseList); > } > > if (executable->hasTextures()) > { >- ANGLE_TRY(mExecutable->updateTexturesDescriptorSet(this, mActiveTexturesDesc)); >+ ProgramExecutableVk *executableVk = getExecutable(); >+ ANGLE_TRY(executableVk->updateTexturesDescriptorSet(this, mActiveTexturesDesc)); > } > > return angle::Result::Continue; >@@ -1798,16 +1824,17 @@ angle::Result ContextVk::handleDirtyComputeTextures() > angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(DirtyBits::Iterator *dirtyBitsIterator, > DirtyBits dirtyBitMask) > { >- uint32_t maxAttrib = mState.getProgramExecutable()->getMaxActiveAttribLocation(); >- const gl::AttribArray<VkBuffer> &bufferHandles = mVertexArray->getCurrentArrayBufferHandles(); >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ uint32_t maxAttrib = mState.getProgramExecutable()->getMaxActiveAttribLocation(); >+ const gl::AttribArray<VkBuffer> &bufferHandles = vertexArrayVk->getCurrentArrayBufferHandles(); > const gl::AttribArray<VkDeviceSize> &bufferOffsets = >- mVertexArray->getCurrentArrayBufferOffsets(); >+ vertexArrayVk->getCurrentArrayBufferOffsets(); > > mRenderPassCommandBuffer->bindVertexBuffers(0, maxAttrib, bufferHandles.data(), > bufferOffsets.data()); > > const gl::AttribArray<vk::BufferHelper *> &arrayBufferResources = >- mVertexArray->getCurrentArrayBuffers(); >+ vertexArrayVk->getCurrentArrayBuffers(); > > // Mark all active vertex buffers as accessed. > const gl::ProgramExecutable *executable = mState.getProgramExecutable(); >@@ -1828,15 +1855,14 @@ angle::Result ContextVk::handleDirtyGraphicsVertexBuffers(DirtyBits::Iterator *d > angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(DirtyBits::Iterator *dirtyBitsIterator, > DirtyBits dirtyBitMask) > { >- vk::BufferHelper *elementArrayBuffer = mVertexArray->getCurrentElementArrayBuffer(); >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ vk::BufferHelper *elementArrayBuffer = vertexArrayVk->getCurrentElementArrayBuffer(); > ASSERT(elementArrayBuffer != nullptr); > >- VkDeviceSize offset = >- mVertexArray->getCurrentElementArrayBufferOffset() + mCurrentIndexBufferOffset; >- >- mRenderPassCommandBuffer->bindIndexBuffer(elementArrayBuffer->getBuffer(), >- elementArrayBuffer->getOffset() + offset, >- getVkIndexType(mCurrentDrawElementsType)); >+ mRenderPassCommandBuffer->bindIndexBuffer( >+ elementArrayBuffer->getBuffer(), >+ elementArrayBuffer->getOffset() + mCurrentIndexBufferOffset, >+ getVkIndexType(mCurrentDrawElementsType)); > > mRenderPassCommands->bufferRead(this, VK_ACCESS_INDEX_READ_BIT, vk::PipelineStage::VertexInput, > elementArrayBuffer); >@@ -1860,8 +1886,8 @@ angle::Result ContextVk::handleDirtyGraphicsFramebufferFetchBarrier( > return angle::Result::Continue; > } > >-ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl( >- vk::CommandBufferHelper *commandBufferHelper) >+template <typename CommandBufferHelperT> >+angle::Result ContextVk::handleDirtyShaderResourcesImpl(CommandBufferHelperT *commandBufferHelper) > { > const gl::ProgramExecutable *executable = mState.getProgramExecutable(); > ASSERT(executable); >@@ -1882,13 +1908,33 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl( > ANGLE_TRY(updateActiveImages(commandBufferHelper)); > } > >+ handleDirtyShaderBufferResourcesImpl(commandBufferHelper); >+ >+ ProgramExecutableVk *executableVk = getExecutable(); >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ ANGLE_TRY(executableVk->updateShaderResourcesDescriptorSet(this, drawFramebufferVk, >+ mShaderBuffersDescriptorDesc)); >+ >+ // Record usage of storage buffers and images in the command buffer to aid handling of >+ // glMemoryBarrier. >+ if (hasImages || hasStorageBuffers) >+ { >+ commandBufferHelper->setHasShaderStorageOutput(); >+ } >+ >+ return angle::Result::Continue; >+} >+ >+void ContextVk::handleDirtyShaderBufferResourcesImpl( >+ vk::CommandBufferHelperCommon *commandBufferHelper) >+{ >+ const gl::ProgramExecutable *executable = mState.getProgramExecutable(); >+ ASSERT(executable); >+ > // Process buffer barriers. >- gl::ShaderMap<const gl::ProgramState *> programStates; >- mExecutable->fillProgramStateMap(this, &programStates); > for (const gl::ShaderType shaderType : executable->getLinkedShaderStages()) > { >- const gl::ProgramState &programState = *programStates[shaderType]; >- const std::vector<gl::InterfaceBlock> &ubos = programState.getUniformBlocks(); >+ const std::vector<gl::InterfaceBlock> &ubos = executable->getUniformBlocks(); > > for (const gl::InterfaceBlock &ubo : ubos) > { >@@ -1912,7 +1958,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl( > vk::GetPipelineStage(shaderType), &bufferHelper); > } > >- const std::vector<gl::InterfaceBlock> &ssbos = programState.getShaderStorageBlocks(); >+ const std::vector<gl::InterfaceBlock> &ssbos = executable->getShaderStorageBlocks(); > for (const gl::InterfaceBlock &ssbo : ssbos) > { > const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = >@@ -1937,7 +1983,7 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl( > vk::AliasingMode::Allowed, &bufferHelper); > } > >- const std::vector<gl::AtomicCounterBuffer> &acbs = programState.getAtomicCounterBuffers(); >+ const std::vector<gl::AtomicCounterBuffer> &acbs = executable->getAtomicCounterBuffers(); > for (const gl::AtomicCounterBuffer &atomicCounterBuffer : acbs) > { > uint32_t binding = atomicCounterBuffer.binding; >@@ -1958,18 +2004,6 @@ ANGLE_INLINE angle::Result ContextVk::handleDirtyShaderResourcesImpl( > vk::GetPipelineStage(shaderType), vk::AliasingMode::Allowed, &bufferHelper); > } > } >- >- ANGLE_TRY(mExecutable->updateShaderResourcesDescriptorSet( >- this, mDrawFramebuffer, mShaderBuffersDescriptorDesc, commandBufferHelper)); >- >- // Record usage of storage buffers and images in the command buffer to aid handling of >- // glMemoryBarrier. >- if (hasImages || hasStorageBuffers) >- { >- commandBufferHelper->setHasShaderStorageOutput(); >- } >- >- return angle::Result::Continue; > } > > angle::Result ContextVk::handleDirtyGraphicsShaderResources(DirtyBits::Iterator *dirtyBitsIterator, >@@ -2020,9 +2054,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation( > xfbBufferDesc.updateDefaultUniformBuffer(uniformBuffer ? uniformBuffer->getBufferSerial() > : vk::kInvalidBufferSerial); > >- return mProgram->getExecutable().updateTransformFeedbackDescriptorSet( >- mProgram->getState(), mProgram->getDefaultUniformBlocks(), uniformBuffer, this, >- xfbBufferDesc); >+ ProgramVk *programVk = getProgram(); >+ return programVk->getExecutable().updateTransformFeedbackDescriptorSet( >+ this, *executable, uniformBuffer, xfbBufferDesc); > } > > angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension( >@@ -2155,17 +2189,19 @@ angle::Result ContextVk::handleDirtyComputeDescriptorSets() > PipelineType::Compute); > } > >-angle::Result ContextVk::handleDirtyDescriptorSetsImpl(vk::CommandBuffer *commandBuffer, >+template <typename CommandBufferT> >+angle::Result ContextVk::handleDirtyDescriptorSetsImpl(CommandBufferT *commandBuffer, > PipelineType pipelineType) > { > // When using Vulkan secondary command buffers, the descriptor sets need to be updated before > // they are bound. >- if (!vk::CommandBuffer::ExecutesInline()) >+ if (!CommandBufferT::ExecutesInline()) > { > flushDescriptorSetUpdates(); > } > >- return mExecutable->updateDescriptorSets(this, commandBuffer, pipelineType); >+ ProgramExecutableVk *executableVk = getExecutable(); >+ return executableVk->updateDescriptorSets(this, commandBuffer, pipelineType); > } > > void ContextVk::syncObjectPerfCounters() >@@ -2265,7 +2301,7 @@ void ContextVk::updateOverlayOnPresent() > } > } > >-void ContextVk::addOverlayUsedBuffersCount(vk::CommandBufferHelper *commandBuffer) >+void ContextVk::addOverlayUsedBuffersCount(vk::CommandBufferHelperCommon *commandBuffer) > { > const gl::OverlayType *overlay = mState.getOverlay(); > if (!overlay->isEnabled()) >@@ -2296,7 +2332,7 @@ angle::Result ContextVk::submitFrame(const vk::Semaphore *signalSemaphore, Seria > } > } > >- if (vk::CommandBufferHelper::kEnableCommandStreamDiagnostics) >+ if (vk::CommandBufferHelperCommon::kEnableCommandStreamDiagnostics) > { > dumpCommandStreamDiagnostics(); > } >@@ -2306,7 +2342,7 @@ angle::Result ContextVk::submitFrame(const vk::Semaphore *signalSemaphore, Seria > std::move(mWaitSemaphores), > std::move(mWaitSemaphoreStageMasks), signalSemaphore, > getShareGroupVk()->releaseResourceUseLists(), >- std::move(mCurrentGarbage), &mCommandPool, submitSerialOut)); >+ std::move(mCurrentGarbage), &mCommandPools, submitSerialOut)); > > onRenderPassFinished(RenderPassClosureReason::AlreadySpecifiedElsewhere); > mComputeDirtyBits |= mNewComputeCommandBufferDirtyBits; >@@ -2391,9 +2427,6 @@ angle::Result ContextVk::synchronizeCpuGpuTime() > // > // Note: Once VK_EXT_calibrated_timestamps is ubiquitous, this should be redone. > >- // Make sure nothing is running >- ASSERT(!hasRecordedCommands()); >- > ANGLE_TRACE_EVENT0("gpu.angle", "ContextVk::synchronizeCpuGpuTime"); > > // Create a query used to receive the GPU timestamp >@@ -2519,7 +2552,7 @@ angle::Result ContextVk::synchronizeCpuGpuTime() > return angle::Result::Continue; > } > >-angle::Result ContextVk::traceGpuEventImpl(vk::CommandBuffer *commandBuffer, >+angle::Result ContextVk::traceGpuEventImpl(vk::OutsideRenderPassCommandBuffer *commandBuffer, > char phase, > const EventName &name) > { >@@ -2923,7 +2956,8 @@ angle::Result ContextVk::multiDrawArraysIndirectHelper(const gl::Context *contex > GLsizei drawcount, > GLsizei stride) > { >- if (drawcount > 1 && !CanMultiDrawIndirectUseCmd(this, mVertexArray, mode, drawcount, stride)) >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ if (drawcount > 1 && !CanMultiDrawIndirectUseCmd(this, vertexArrayVk, mode, drawcount, stride)) > { > return rx::MultiDrawArraysIndirectGeneral(this, context, mode, indirect, drawcount, stride); > } >@@ -2936,7 +2970,7 @@ angle::Result ContextVk::multiDrawArraysIndirectHelper(const gl::Context *contex > vk::BufferHelper *currentIndirectBuf = &vk::GetImpl(indirectBuffer)->getBuffer(); > VkDeviceSize currentIndirectBufOffset = reinterpret_cast<VkDeviceSize>(indirect); > >- if (mVertexArray->getStreamingVertexAttribsMask().any()) >+ if (vertexArrayVk->getStreamingVertexAttribsMask().any()) > { > // Handling instanced vertex attributes is not covered for drawcount > 1. > ASSERT(drawcount <= 1); >@@ -2963,21 +2997,17 @@ angle::Result ContextVk::multiDrawArraysIndirectHelper(const gl::Context *contex > ASSERT(drawcount <= 1); > > ASSERT(indirectBuffer); >- vk::BufferHelper *dstIndirectBuf = nullptr; >- VkDeviceSize dstIndirectBufOffset = 0; >+ vk::BufferHelper *dstIndirectBuf = nullptr; > > ANGLE_TRY(setupLineLoopIndirectDraw(context, mode, currentIndirectBuf, >- currentIndirectBufOffset, &dstIndirectBuf, >- &dstIndirectBufOffset)); >+ currentIndirectBufOffset, &dstIndirectBuf)); > > mRenderPassCommandBuffer->drawIndexedIndirect( >- dstIndirectBuf->getBuffer(), dstIndirectBuf->getOffset() + dstIndirectBufOffset, >- drawcount, vkStride); >+ dstIndirectBuf->getBuffer(), dstIndirectBuf->getOffset(), drawcount, vkStride); > return angle::Result::Continue; > } > >- ANGLE_TRY(setupIndirectDraw(context, mode, mNonIndexedDirtyBitsMask, currentIndirectBuf, >- currentIndirectBufOffset)); >+ ANGLE_TRY(setupIndirectDraw(context, mode, mNonIndexedDirtyBitsMask, currentIndirectBuf)); > > mRenderPassCommandBuffer->drawIndirect( > currentIndirectBuf->getBuffer(), currentIndirectBuf->getOffset() + currentIndirectBufOffset, >@@ -3025,7 +3055,8 @@ angle::Result ContextVk::multiDrawElementsIndirectHelper(const gl::Context *cont > GLsizei drawcount, > GLsizei stride) > { >- if (drawcount > 1 && !CanMultiDrawIndirectUseCmd(this, mVertexArray, mode, drawcount, stride)) >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ if (drawcount > 1 && !CanMultiDrawIndirectUseCmd(this, vertexArrayVk, mode, drawcount, stride)) > { > return rx::MultiDrawElementsIndirectGeneral(this, context, mode, type, indirect, drawcount, > stride); >@@ -3045,7 +3076,7 @@ angle::Result ContextVk::multiDrawElementsIndirectHelper(const gl::Context *cont > mGraphicsDirtyBits.set(DIRTY_BIT_INDEX_BUFFER); > mCurrentIndexBufferOffset = 0; > >- if (mVertexArray->getStreamingVertexAttribsMask().any()) >+ if (vertexArrayVk->getStreamingVertexAttribsMask().any()) > { > // Handling instanced vertex attributes is not covered for drawcount > 1. > ASSERT(drawcount <= 1); >@@ -3075,14 +3106,12 @@ angle::Result ContextVk::multiDrawElementsIndirectHelper(const gl::Context *cont > "of hardware support"); > > vk::BufferHelper *dstIndirectBuf; >- VkDeviceSize dstIndirectBufOffset; > >- ANGLE_TRY(mVertexArray->convertIndexBufferIndirectGPU( >- this, currentIndirectBuf, currentIndirectBufOffset, &dstIndirectBuf, >- &dstIndirectBufOffset)); >+ ANGLE_TRY(vertexArrayVk->convertIndexBufferIndirectGPU( >+ this, currentIndirectBuf, currentIndirectBufOffset, &dstIndirectBuf)); > > currentIndirectBuf = dstIndirectBuf; >- currentIndirectBufOffset = dstIndirectBufOffset; >+ currentIndirectBufOffset = 0; > } > > if (mode == gl::PrimitiveMode::LineLoop) >@@ -3091,19 +3120,16 @@ angle::Result ContextVk::multiDrawElementsIndirectHelper(const gl::Context *cont > ASSERT(drawcount <= 1); > > vk::BufferHelper *dstIndirectBuf; >- VkDeviceSize dstIndirectBufOffset; > > ANGLE_TRY(setupLineLoopIndexedIndirectDraw(context, mode, type, currentIndirectBuf, >- currentIndirectBufOffset, &dstIndirectBuf, >- &dstIndirectBufOffset)); >+ currentIndirectBufOffset, &dstIndirectBuf)); > > currentIndirectBuf = dstIndirectBuf; >- currentIndirectBufOffset = dstIndirectBufOffset; >+ currentIndirectBufOffset = 0; > } > else > { >- ANGLE_TRY(setupIndexedIndirectDraw(context, mode, type, currentIndirectBuf, >- currentIndirectBufOffset)); >+ ANGLE_TRY(setupIndexedIndirectDraw(context, mode, type, currentIndirectBuf)); > } > > mRenderPassCommandBuffer->drawIndexedIndirect( >@@ -3153,7 +3179,8 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle) > return; > } > >- RenderTargetVk *color0RenderTarget = mDrawFramebuffer->getColorDrawRenderTarget(0); >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ RenderTargetVk *color0RenderTarget = drawFramebufferVk->getColorDrawRenderTarget(0); > if (!color0RenderTarget) > { > return; >@@ -3161,7 +3188,7 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle) > > // EGL1.5 spec: The contents of ancillary buffers are always undefined after calling > // eglSwapBuffers >- RenderTargetVk *depthStencilRenderTarget = mDrawFramebuffer->getDepthStencilRenderTarget(); >+ RenderTargetVk *depthStencilRenderTarget = drawFramebufferVk->getDepthStencilRenderTarget(); > if (depthStencilRenderTarget) > { > // Change depth/stencil attachment storeOp to DONT_CARE >@@ -3170,9 +3197,6 @@ void ContextVk::optimizeRenderPassForPresent(VkFramebuffer framebufferHandle) > dsState, mRenderPassCommands->getRenderArea()); > mRenderPassCommands->invalidateRenderPassDepthAttachment( > dsState, mRenderPassCommands->getRenderArea()); >- // Mark content as invalid so that we will not load them in next renderpass >- depthStencilRenderTarget->invalidateEntireContent(this); >- depthStencilRenderTarget->invalidateEntireStencilContent(this); > } > > // Use finalLayout instead of extra barrier for layout change to present >@@ -3209,10 +3233,14 @@ void ContextVk::insertEventMarkerImpl(GLenum source, const char *marker) > VkDebugUtilsLabelEXT label; > vk::MakeDebugUtilsLabel(source, marker, &label); > >- vk::CommandBuffer *commandBuffer = hasStartedRenderPass() >- ? mRenderPassCommandBuffer >- : &mOutsideRenderPassCommands->getCommandBuffer(); >- commandBuffer->insertDebugUtilsLabelEXT(label); >+ if (hasStartedRenderPass()) >+ { >+ mRenderPassCommandBuffer->insertDebugUtilsLabelEXT(label); >+ } >+ else >+ { >+ mOutsideRenderPassCommands->getCommandBuffer().insertDebugUtilsLabelEXT(label); >+ } > } > > angle::Result ContextVk::pushGroupMarker(GLsizei length, const char *marker) >@@ -3248,10 +3276,14 @@ angle::Result ContextVk::pushDebugGroupImpl(GLenum source, GLuint id, const char > VkDebugUtilsLabelEXT label; > vk::MakeDebugUtilsLabel(source, message, &label); > >- vk::CommandBuffer *commandBuffer = hasStartedRenderPass() >- ? mRenderPassCommandBuffer >- : &mOutsideRenderPassCommands->getCommandBuffer(); >- commandBuffer->beginDebugUtilsLabelEXT(label); >+ if (hasStartedRenderPass()) >+ { >+ mRenderPassCommandBuffer->beginDebugUtilsLabelEXT(label); >+ } >+ else >+ { >+ mOutsideRenderPassCommands->getCommandBuffer().beginDebugUtilsLabelEXT(label); >+ } > > return angle::Result::Continue; > } >@@ -3263,10 +3295,14 @@ angle::Result ContextVk::popDebugGroupImpl() > return angle::Result::Continue; > } > >- vk::CommandBuffer *commandBuffer = hasStartedRenderPass() >- ? mRenderPassCommandBuffer >- : &mOutsideRenderPassCommands->getCommandBuffer(); >- commandBuffer->endDebugUtilsLabelEXT(); >+ if (hasStartedRenderPass()) >+ { >+ mRenderPassCommandBuffer->endDebugUtilsLabelEXT(); >+ } >+ else >+ { >+ mOutsideRenderPassCommands->getCommandBuffer().endDebugUtilsLabelEXT(); >+ } > > return angle::Result::Continue; > } >@@ -3312,16 +3348,15 @@ void ContextVk::endEventLogForClearOrQuery() > return; > } > >- vk::CommandBuffer *commandBuffer = nullptr; > switch (mQueryEventType) > { > case GraphicsEventCmdBuf::InOutsideCmdBufQueryCmd: > ASSERT(mOutsideRenderPassCommands); >- commandBuffer = &mOutsideRenderPassCommands->getCommandBuffer(); >+ mOutsideRenderPassCommands->getCommandBuffer().endDebugUtilsLabelEXT(); > break; > case GraphicsEventCmdBuf::InRenderPassCmdBufQueryCmd: > ASSERT(mRenderPassCommands); >- commandBuffer = &mRenderPassCommands->getCommandBuffer(); >+ mRenderPassCommands->getCommandBuffer().endDebugUtilsLabelEXT(); > break; > case GraphicsEventCmdBuf::NotInQueryCmd: > // The glClear* or gl*Query* command was noop'd or otherwise ended early. We could >@@ -3332,7 +3367,6 @@ void ContextVk::endEventLogForClearOrQuery() > default: > UNREACHABLE(); > } >- commandBuffer->endDebugUtilsLabelEXT(); > > mQueryEventType = GraphicsEventCmdBuf::NotInQueryCmd; > } >@@ -3353,21 +3387,18 @@ angle::Result ContextVk::handleGraphicsEventLog(GraphicsEventCmdBuf queryEventTy > > mQueryEventType = queryEventType; > >- vk::CommandBuffer *commandBuffer = nullptr; > switch (mQueryEventType) > { > case GraphicsEventCmdBuf::InOutsideCmdBufQueryCmd: > ASSERT(mOutsideRenderPassCommands); >- commandBuffer = &mOutsideRenderPassCommands->getCommandBuffer(); >- break; >+ return handleDirtyEventLogImpl(&mOutsideRenderPassCommands->getCommandBuffer()); > case GraphicsEventCmdBuf::InRenderPassCmdBufQueryCmd: > ASSERT(mRenderPassCommands); >- commandBuffer = &mRenderPassCommands->getCommandBuffer(); >- break; >+ return handleDirtyEventLogImpl(&mRenderPassCommands->getCommandBuffer()); > default: > UNREACHABLE(); >+ return angle::Result::Stop; > } >- return handleDirtyEventLogImpl(commandBuffer); > } > > bool ContextVk::isViewportFlipEnabledForDrawFBO() const >@@ -3632,35 +3663,12 @@ void ContextVk::updateRasterizerDiscardEnabled(bool isPrimitivesGeneratedQueryAc > } > } > >-void ContextVk::invalidateProgramBindingHelper(const gl::State &glState) >+void ContextVk::invalidateProgramBindingHelper() > { >- mProgram = nullptr; >- mProgramPipeline = nullptr; >- mExecutable = nullptr; >- >- if (glState.getProgram()) >+ ProgramExecutableVk *executableVk = getExecutable(); >+ if (executableVk) > { >- mProgram = vk::GetImpl(glState.getProgram()); >- mExecutable = &mProgram->getExecutable(); >- } >- >- if (glState.getProgramPipeline()) >- { >- mProgramPipeline = vk::GetImpl(glState.getProgramPipeline()); >- if (!mExecutable) >- { >- // A bound program always overrides a program pipeline >- mExecutable = &mProgramPipeline->getExecutable(); >- } >- } >- >- if (mProgram) >- { >- mProgram->onProgramBind(); >- } >- else if (mProgramPipeline) >- { >- mProgramPipeline->onProgramBind(); >+ executableVk->onProgramBind(*mState.getProgramExecutable()); > } > } > >@@ -3687,8 +3695,9 @@ angle::Result ContextVk::invalidateProgramExecutableHelper(const gl::Context *co > mCurrentGraphicsPipeline = nullptr; > mGraphicsPipelineTransition.reset(); > >- ASSERT(mExecutable); >- mExecutable->updateEarlyFragmentTestsOptimization(this); >+ ProgramExecutableVk *executableVk = getExecutable(); >+ ASSERT(executableVk); >+ executableVk->updateEarlyFragmentTestsOptimization(this, *executable); > > if (mLastProgramUsesFramebufferFetch != executable->usesFramebufferFetch()) > { >@@ -3696,9 +3705,10 @@ angle::Result ContextVk::invalidateProgramExecutableHelper(const gl::Context *co > ANGLE_TRY( > flushCommandsAndEndRenderPass(RenderPassClosureReason::FramebufferFetchEmulation)); > >- ASSERT(mDrawFramebuffer); >- mDrawFramebuffer->onSwitchProgramFramebufferFetch(this, >- executable->usesFramebufferFetch()); >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ ASSERT(drawFramebufferVk); >+ drawFramebufferVk->onSwitchProgramFramebufferFetch(this, >+ executable->usesFramebufferFetch()); > } > } > >@@ -3719,6 +3729,9 @@ angle::Result ContextVk::syncState(const gl::Context *context, > invalidateCurrentGraphicsPipeline(); > } > >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ > for (auto iter = dirtyBits.begin(), endIter = dirtyBits.end(); iter != endIter; ++iter) > { > size_t dirtyBit = *iter; >@@ -3751,12 +3764,12 @@ angle::Result ContextVk::syncState(const gl::Context *context, > case gl::State::DIRTY_BIT_BLEND_FUNCS: > mGraphicsPipelineDesc->updateBlendFuncs( > &mGraphicsPipelineTransition, glState.getBlendStateExt(), >- mDrawFramebuffer->getState().getColorAttachmentsMask()); >+ drawFramebufferVk->getState().getColorAttachmentsMask()); > break; > case gl::State::DIRTY_BIT_BLEND_EQUATIONS: > mGraphicsPipelineDesc->updateBlendEquations( > &mGraphicsPipelineTransition, glState.getBlendStateExt(), >- mDrawFramebuffer->getState().getColorAttachmentsMask()); >+ drawFramebufferVk->getState().getColorAttachmentsMask()); > break; > case gl::State::DIRTY_BIT_COLOR_MASK: > updateColorMasks(); >@@ -3770,16 +3783,16 @@ angle::Result ContextVk::syncState(const gl::Context *context, > iter.setLaterBit(gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE); > break; > case gl::State::DIRTY_BIT_SAMPLE_COVERAGE_ENABLED: >- updateSampleMaskWithRasterizationSamples(mDrawFramebuffer->getSamples()); >+ updateSampleMaskWithRasterizationSamples(drawFramebufferVk->getSamples()); > break; > case gl::State::DIRTY_BIT_SAMPLE_COVERAGE: >- updateSampleMaskWithRasterizationSamples(mDrawFramebuffer->getSamples()); >+ updateSampleMaskWithRasterizationSamples(drawFramebufferVk->getSamples()); > break; > case gl::State::DIRTY_BIT_SAMPLE_MASK_ENABLED: >- updateSampleMaskWithRasterizationSamples(mDrawFramebuffer->getSamples()); >+ updateSampleMaskWithRasterizationSamples(drawFramebufferVk->getSamples()); > break; > case gl::State::DIRTY_BIT_SAMPLE_MASK: >- updateSampleMaskWithRasterizationSamples(mDrawFramebuffer->getSamples()); >+ updateSampleMaskWithRasterizationSamples(drawFramebufferVk->getSamples()); > break; > case gl::State::DIRTY_BIT_DEPTH_TEST_ENABLED: > { >@@ -3916,17 +3929,15 @@ angle::Result ContextVk::syncState(const gl::Context *context, > mHasDeferredFlush = true; > } > >- gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer(); >- mDrawFramebuffer = vk::GetImpl(drawFramebuffer); >- mDrawFramebuffer->setReadOnlyDepthFeedbackLoopMode(false); >+ drawFramebufferVk->setReadOnlyDepthFeedbackLoopMode(false); > updateFlipViewportDrawFramebuffer(glState); > updateSurfaceRotationDrawFramebuffer(glState); > SpecConstUsageBits usageBits = getCurrentProgramSpecConstUsageBits(); > updateGraphicsPipelineDescWithSpecConstUsageBits(usageBits); >- updateViewport(mDrawFramebuffer, glState.getViewport(), glState.getNearPlane(), >+ updateViewport(drawFramebufferVk, glState.getViewport(), glState.getNearPlane(), > glState.getFarPlane()); > updateColorMasks(); >- updateRasterizationSamples(mDrawFramebuffer->getSamples()); >+ updateRasterizationSamples(drawFramebufferVk->getSamples()); > updateRasterizerDiscardEnabled( > mState.isQueryActive(gl::QueryType::PrimitivesGenerated)); > >@@ -3939,24 +3950,23 @@ angle::Result ContextVk::syncState(const gl::Context *context, > // Clear the blend funcs/equations for color attachment indices that no longer > // exist. > gl::DrawBufferMask newColorAttachmentMask = >- mDrawFramebuffer->getState().getColorAttachmentsMask(); >+ drawFramebufferVk->getState().getColorAttachmentsMask(); > mGraphicsPipelineDesc->resetBlendFuncsAndEquations( >- &mGraphicsPipelineTransition, mCachedDrawFramebufferColorAttachmentMask, >- newColorAttachmentMask); >+ &mGraphicsPipelineTransition, glState.getBlendStateExt(), >+ mCachedDrawFramebufferColorAttachmentMask, newColorAttachmentMask); > mCachedDrawFramebufferColorAttachmentMask = newColorAttachmentMask; > > mGraphicsPipelineDesc->resetSubpass(&mGraphicsPipelineTransition); >- onDrawFramebufferRenderPassDescChange(mDrawFramebuffer, nullptr); >+ onDrawFramebufferRenderPassDescChange(drawFramebufferVk, nullptr); > break; > } > case gl::State::DIRTY_BIT_RENDERBUFFER_BINDING: > break; > case gl::State::DIRTY_BIT_VERTEX_ARRAY_BINDING: > { >- mVertexArray = vk::GetImpl(glState.getVertexArray()); > invalidateDefaultAttributes(context->getStateCache().getActiveDefaultAttribsMask()); >- ANGLE_TRY(mVertexArray->updateActiveAttribInfo(this)); >- ANGLE_TRY(onIndexBufferChange(mVertexArray->getCurrentElementArrayBuffer())); >+ ANGLE_TRY(vertexArrayVk->updateActiveAttribInfo(this)); >+ ANGLE_TRY(onIndexBufferChange(vertexArrayVk->getCurrentElementArrayBuffer())); > break; > } > case gl::State::DIRTY_BIT_DRAW_INDIRECT_BUFFER_BINDING: >@@ -3964,7 +3974,7 @@ angle::Result ContextVk::syncState(const gl::Context *context, > case gl::State::DIRTY_BIT_DISPATCH_INDIRECT_BUFFER_BINDING: > break; > case gl::State::DIRTY_BIT_PROGRAM_BINDING: >- invalidateProgramBindingHelper(glState); >+ invalidateProgramBindingHelper(); > static_assert( > gl::State::DIRTY_BIT_PROGRAM_EXECUTABLE > gl::State::DIRTY_BIT_PROGRAM_BINDING, > "Dirty bit order"); >@@ -4034,7 +4044,7 @@ angle::Result ContextVk::syncState(const gl::Context *context, > glState.isSampleAlphaToOneEnabled()); > break; > case gl::State::DIRTY_BIT_SAMPLE_SHADING: >- updateSampleShadingWithRasterizationSamples(mDrawFramebuffer->getSamples()); >+ updateSampleShadingWithRasterizationSamples(drawFramebufferVk->getSamples()); > break; > case gl::State::DIRTY_BIT_COVERAGE_MODULATION: > break; >@@ -5034,12 +5044,13 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(DirtyBits::Iterator * > ANGLE_TRY(allocateDriverUniforms(driverUniformSize, &mDriverUniforms[PipelineType::Graphics], > &ptr, &newBuffer)); > >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); > if (useGraphicsDriverUniformsExtended) > { > float halfRenderAreaWidth = >- static_cast<float>(mDrawFramebuffer->getState().getDimensions().width) * 0.5f; >+ static_cast<float>(drawFramebufferVk->getState().getDimensions().width) * 0.5f; > float halfRenderAreaHeight = >- static_cast<float>(mDrawFramebuffer->getState().getDimensions().height) * 0.5f; >+ static_cast<float>(drawFramebufferVk->getState().getDimensions().height) * 0.5f; > > float flipX = 1.0f; > float flipY = -1.0f; >@@ -5098,26 +5109,24 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(DirtyBits::Iterator * > std::swap(glViewport.width, glViewport.height); > } > >- uint32_t xfbActiveUnpaused = mState.isTransformFeedbackActiveUnpaused(); >- > float depthRangeNear = mState.getNearPlane(); > float depthRangeFar = mState.getFarPlane(); > float depthRangeDiff = depthRangeFar - depthRangeNear; >- int32_t numSamples = mDrawFramebuffer->getSamples(); >+ int32_t numSamples = drawFramebufferVk->getSamples(); > > // Copy and flush to the device. > *driverUniforms = { > {static_cast<float>(glViewport.x), static_cast<float>(glViewport.y), > static_cast<float>(glViewport.width), static_cast<float>(glViewport.height)}, > mState.getEnabledClipDistances().bits(), >- xfbActiveUnpaused, >+ 0, > static_cast<int32_t>(mXfbVertexCountPerInstance), > numSamples, > {}, > {}, > {depthRangeNear, depthRangeFar, depthRangeDiff, 0.0f}}; > >- if (xfbActiveUnpaused) >+ if (mState.isTransformFeedbackActiveUnpaused()) > { > TransformFeedbackVk *transformFeedbackVk = > vk::GetImpl(mState.getCurrentTransformFeedback()); >@@ -5157,7 +5166,8 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms() > PipelineType::Compute); > } > >-void ContextVk::handleDirtyDriverUniformsBindingImpl(vk::CommandBuffer *commandBuffer, >+template <typename CommandBufferT> >+void ContextVk::handleDirtyDriverUniformsBindingImpl(CommandBufferT *commandBuffer, > VkPipelineBindPoint bindPoint, > DriverUniformsDescriptorSet *driverUniforms) > { >@@ -5170,8 +5180,9 @@ void ContextVk::handleDirtyDriverUniformsBindingImpl(vk::CommandBuffer *commandB > driverUniforms->descriptorPoolBinding.get().retain(&mResourceUseList); > } > >+ ProgramExecutableVk *executableVk = getExecutable(); > commandBuffer->bindDescriptorSets( >- mExecutable->getPipelineLayout(), bindPoint, DescriptorSetIndex::Internal, 1, >+ executableVk->getPipelineLayout(), bindPoint, DescriptorSetIndex::Internal, 1, > &driverUniforms->descriptorSet, 1, &driverUniforms->dynamicOffset); > } > >@@ -5344,8 +5355,9 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context, gl::Co > if (!isIncompleteTexture && texture->isDepthOrStencil() && > shouldSwitchToReadOnlyDepthFeedbackLoopMode(texture, command)) > { >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); > // Special handling for deferred clears. >- ANGLE_TRY(mDrawFramebuffer->flushDeferredClears(this)); >+ ANGLE_TRY(drawFramebufferVk->flushDeferredClears(this)); > > if (hasStartedRenderPass()) > { >@@ -5359,11 +5371,11 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context, gl::Co > } > else > { >- mDrawFramebuffer->updateRenderPassReadOnlyDepthMode(this, mRenderPassCommands); >+ drawFramebufferVk->updateRenderPassReadOnlyDepthMode(this, mRenderPassCommands); > } > } > >- mDrawFramebuffer->setReadOnlyDepthFeedbackLoopMode(true); >+ drawFramebufferVk->setReadOnlyDepthFeedbackLoopMode(true); > } > > gl::Sampler *sampler = mState.getSampler(static_cast<uint32_t>(textureUnit)); >@@ -5377,7 +5389,13 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context, gl::Co > activeTexture.sampler = &samplerHelper; > activeTexture.srgbDecode = samplerState.getSRGBDecode(); > >- if (activeTexture.srgbDecode == GL_SKIP_DECODE_EXT) >+ // GL_EXT_texture_sRGB_decode >+ // The new parameter, TEXTURE_SRGB_DECODE_EXT controls whether the >+ // decoding happens at sample time. It only applies to textures with an >+ // internal format that is sRGB and is ignored for all other textures. >+ ASSERT(textureVk->getImage().valid()); >+ if (textureVk->getImage().getActualFormat().isSRGB && >+ activeTexture.srgbDecode == GL_SKIP_DECODE_EXT) > { > // Make sure we use the MUTABLE bit for the storage. Because the "skip decode" is a > // Sampler state we might not have caught this setting in TextureVk::syncState. >@@ -5409,7 +5427,8 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context, gl::Co > } > } > >- if (!mExecutable->areImmutableSamplersCompatible(immutableSamplerIndexMap)) >+ ProgramExecutableVk *executableVk = getExecutable(); >+ if (!executableVk->areImmutableSamplersCompatible(immutableSamplerIndexMap)) > { > recreatePipelineLayout = true; > } >@@ -5417,27 +5436,21 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context, gl::Co > // Recreate the pipeline layout, if necessary. > if (recreatePipelineLayout) > { >- ANGLE_TRY(mExecutable->createPipelineLayout(this, *executable, &mActiveTextures)); >+ ANGLE_TRY(executableVk->createPipelineLayout(this, *executable, &mActiveTextures)); > > // The default uniforms descriptor set was reset during createPipelineLayout(), so mark them > // dirty to get everything reallocated/rebound before the next draw. > if (executable->hasDefaultUniforms()) > { >- if (mProgram) >- { >- mProgram->setAllDefaultUniformsDirty(); >- } >- else if (mProgramPipeline) >- { >- mProgramPipeline->setAllDefaultUniformsDirty(); >- } >+ executableVk->setAllDefaultUniformsDirty(*executable); > } > } > > return angle::Result::Continue; > } > >-angle::Result ContextVk::updateActiveImages(vk::CommandBufferHelper *commandBufferHelper) >+template <typename CommandBufferHelperT> >+angle::Result ContextVk::updateActiveImages(CommandBufferHelperT *commandBufferHelper) > { > const gl::State &glState = mState; > const gl::ProgramExecutable *executable = glState.getProgramExecutable(); >@@ -5478,19 +5491,11 @@ angle::Result ContextVk::updateActiveImages(vk::CommandBufferHelper *commandBuff > // Special handling of texture buffers. They have a buffer attached instead of an image. > if (texture->getType() == gl::TextureType::Buffer) > { >- BufferVk *bufferVk = vk::GetImpl(textureVk->getBuffer().get()); >- vk::BufferHelper &buffer = bufferVk->getBuffer(); >+ BufferVk *bufferVk = vk::GetImpl(textureVk->getBuffer().get()); > >- // TODO: accept multiple stages in bufferWrite. http://anglebug.com/3573 >- for (gl::ShaderType stage : shaderStages) >- { >- commandBufferHelper->bufferWrite( >- this, VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, >- vk::GetPipelineStage(stage), vk::AliasingMode::Disallowed, &buffer); >- } >+ OnImageBufferWrite(this, bufferVk, shaderStages, commandBufferHelper); > > textureVk->retainBufferViews(&mResourceUseList); >- > continue; > } > >@@ -5502,50 +5507,20 @@ angle::Result ContextVk::updateActiveImages(vk::CommandBufferHelper *commandBuff > } > alreadyProcessed.insert(image); > >- vk::ImageLayout imageLayout; >- gl::ShaderType firstShader = shaderStages.first(); >- gl::ShaderType lastShader = shaderStages.last(); >- shaderStages.reset(firstShader); >- shaderStages.reset(lastShader); >- // We barrier against either: >- // - Vertex only >- // - Fragment only >- // - Pre-fragment only (vertex, geometry and tessellation together) >- if (shaderStages.any() || firstShader != lastShader) >- { >- imageLayout = lastShader == gl::ShaderType::Fragment >- ? vk::ImageLayout::AllGraphicsShadersWrite >- : vk::ImageLayout::PreFragmentShadersWrite; >- } >- else >- { >- imageLayout = kShaderWriteImageLayouts[firstShader]; >- } >- >- VkImageAspectFlags aspectFlags = image->getAspectFlags(); >- >- uint32_t layerStart = 0; >- uint32_t layerCount = image->getLayerCount(); >- if (imageUnit.layered) >- { >- layerStart = imageUnit.layered; >- layerCount = 1; >- } >+ gl::LevelIndex level; >+ uint32_t layerStart = 0; >+ uint32_t layerCount = 0; >+ const vk::ImageLayout imageLayout = GetImageWriteLayoutAndSubresource( >+ imageUnit, *image, shaderStages, &level, &layerStart, &layerCount); > >- commandBufferHelper->imageWrite( >- this, gl::LevelIndex(static_cast<uint32_t>(imageUnit.level)), layerStart, layerCount, >- aspectFlags, imageLayout, vk::AliasingMode::Allowed, image); >+ commandBufferHelper->imageWrite(this, level, layerStart, layerCount, >+ image->getAspectFlags(), imageLayout, >+ vk::AliasingMode::Allowed, image); > } > > return angle::Result::Continue; > } > >-bool ContextVk::hasRecordedCommands() >-{ >- ASSERT(mOutsideRenderPassCommands && mRenderPassCommands); >- return !mOutsideRenderPassCommands->empty() || mRenderPassCommands->started(); >-} >- > angle::Result ContextVk::flushImpl(const vk::Semaphore *signalSemaphore, > RenderPassClosureReason renderPassClosureReason) > { >@@ -5611,7 +5586,6 @@ angle::Result ContextVk::flushAndGetSerial(const vk::Semaphore *signalSemaphore, > driverUniform.dynamicBuffer.releaseInFlightBuffersToResourceUseList(this); > } > mDefaultUniformStorage.releaseInFlightBuffersToResourceUseList(this); >- mStagingBuffer.releaseInFlightBuffersToResourceUseList(this); > > ANGLE_TRY(submitFrame(signalSemaphore, submitSerialOut)); > >@@ -5679,11 +5653,6 @@ void ContextVk::addWaitSemaphore(VkSemaphore semaphore, VkPipelineStageFlags sta > mWaitSemaphoreStageMasks.push_back(stageMask); > } > >-const vk::CommandPool &ContextVk::getCommandPool() const >-{ >- return mCommandPool; >-} >- > bool ContextVk::isSerialInUse(Serial serial) const > { > return serial > getLastCompletedQueueSerial(); >@@ -5823,9 +5792,10 @@ angle::Result ContextVk::updateDefaultAttribute(size_t attribIndex) > ASSERT(!defaultBuffer.isCoherent()); > ANGLE_TRY(defaultBuffer.flush(this)); > >- return mVertexArray->updateDefaultAttrib(this, attribIndex, bufferHandle, >- defaultBuffer.getCurrentBuffer(), >- static_cast<uint32_t>(offset)); >+ VertexArrayVk *vertexArrayVk = getVertexArray(); >+ return vertexArrayVk->updateDefaultAttrib(this, attribIndex, bufferHandle, >+ defaultBuffer.getCurrentBuffer(), >+ static_cast<uint32_t>(offset)); > } > > vk::DescriptorSetLayoutDesc ContextVk::getDriverUniformsDescriptorSetDesc() const >@@ -5882,7 +5852,7 @@ angle::Result ContextVk::beginNewRenderPass( > const vk::PackedAttachmentCount colorAttachmentCount, > const vk::PackedAttachmentIndex depthStencilAttachmentIndex, > const vk::PackedClearValuesArray &clearValues, >- vk::CommandBuffer **commandBufferOut) >+ vk::RenderPassCommandBuffer **commandBufferOut) > { > // Next end any currently outstanding render pass. The render pass is normally closed before > // reaching here for various reasons, except typically when UtilsVk needs to start one. >@@ -5895,13 +5865,14 @@ angle::Result ContextVk::beginNewRenderPass( > } > > angle::Result ContextVk::startRenderPass(gl::Rectangle renderArea, >- vk::CommandBuffer **commandBufferOut, >+ vk::RenderPassCommandBuffer **commandBufferOut, > bool *renderPassDescChangedOut) > { >- ASSERT(mDrawFramebuffer == vk::GetImpl(mState.getDrawFramebuffer())); >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ ASSERT(drawFramebufferVk == vk::GetImpl(mState.getDrawFramebuffer())); > >- ANGLE_TRY(mDrawFramebuffer->startNewRenderPass(this, renderArea, &mRenderPassCommandBuffer, >- renderPassDescChangedOut)); >+ ANGLE_TRY(drawFramebufferVk->startNewRenderPass(this, renderArea, &mRenderPassCommandBuffer, >+ renderPassDescChangedOut)); > > // Make sure the render pass is not restarted if it is started by UtilsVk (as opposed to > // setupDraw(), which clears this bit automatically). >@@ -5915,7 +5886,7 @@ angle::Result ContextVk::startRenderPass(gl::Rectangle renderArea, > mRenderPassCommands->onDepthAccess(depthAccess); > mRenderPassCommands->onStencilAccess(stencilAccess); > >- mDrawFramebuffer->updateRenderPassReadOnlyDepthMode(this, mRenderPassCommands); >+ drawFramebufferVk->updateRenderPassReadOnlyDepthMode(this, mRenderPassCommands); > > if (commandBufferOut) > { >@@ -5925,14 +5896,14 @@ angle::Result ContextVk::startRenderPass(gl::Rectangle renderArea, > return angle::Result::Continue; > } > >-void ContextVk::startNextSubpass() >+angle::Result ContextVk::startNextSubpass() > { > ASSERT(hasStartedRenderPass()); > >- mRenderPassCommands->getCommandBuffer().nextSubpass(VK_SUBPASS_CONTENTS_INLINE); >- > // The graphics pipelines are bound to a subpass, so update the subpass as well. > mGraphicsPipelineDesc->nextSubpass(&mGraphicsPipelineTransition); >+ >+ return mRenderPassCommands->nextSubpass(this, &mRenderPassCommandBuffer); > } > > void ContextVk::restoreFinishedRenderPass(vk::Framebuffer *framebuffer) >@@ -6016,7 +5987,7 @@ angle::Result ContextVk::flushCommandsAndEndRenderPassImpl(QueueSubmitType queue > > ANGLE_TRY(mRenderPassCommands->endRenderPass(this)); > >- if (vk::CommandBufferHelper::kEnableCommandStreamDiagnostics) >+ if (vk::CommandBufferHelperCommon::kEnableCommandStreamDiagnostics) > { > mRenderPassCommands->addCommandDiagnostics(this); > } >@@ -6164,7 +6135,7 @@ angle::Result ContextVk::flushOutsideRenderPassCommands() > > addOverlayUsedBuffersCount(mOutsideRenderPassCommands); > >- if (vk::CommandBufferHelper::kEnableCommandStreamDiagnostics) >+ if (vk::CommandBufferHelperCommon::kEnableCommandStreamDiagnostics) > { > mOutsideRenderPassCommands->addCommandDiagnostics(this); > } >@@ -6412,7 +6383,7 @@ void ContextVk::onProgramExecutableReset(ProgramExecutableVk *executableVk) > > // Only do this for the currently bound ProgramExecutableVk, since Program A can be linked while > // Program B is currently in use and we don't want to reset/invalidate Program B's pipeline. >- if (executableVk != mExecutable) >+ if (executableVk != getExecutable()) > { > return; > } >@@ -6436,7 +6407,8 @@ void ContextVk::onProgramExecutableReset(ProgramExecutableVk *executableVk) > > angle::Result ContextVk::updateRenderPassDepthStencilAccess() > { >- if (hasStartedRenderPass() && mDrawFramebuffer->getDepthStencilRenderTarget()) >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ if (hasStartedRenderPass() && drawFramebufferVk->getDepthStencilRenderTarget()) > { > const gl::DepthStencilState &dsState = mState.getDepthStencilState(); > vk::ResourceAccess depthAccess = GetDepthAccess(dsState); >@@ -6444,7 +6416,7 @@ angle::Result ContextVk::updateRenderPassDepthStencilAccess() > > if ((depthAccess == vk::ResourceAccess::Write || > stencilAccess == vk::ResourceAccess::Write) && >- mDrawFramebuffer->isReadOnlyDepthFeedbackLoopMode()) >+ drawFramebufferVk->isReadOnlyDepthFeedbackLoopMode()) > { > // If we are switching out of read only mode and we are in feedback loop, we must end > // renderpass here. Otherwise, updating it to writeable layout will produce a writable >@@ -6453,14 +6425,14 @@ angle::Result ContextVk::updateRenderPassDepthStencilAccess() > ANGLE_TRY(flushCommandsAndEndRenderPass( > RenderPassClosureReason::DepthStencilWriteAfterFeedbackLoop)); > // Clear read-only depth feedback mode. >- mDrawFramebuffer->setReadOnlyDepthFeedbackLoopMode(false); >+ drawFramebufferVk->setReadOnlyDepthFeedbackLoopMode(false); > } > else > { > mRenderPassCommands->onDepthAccess(depthAccess); > mRenderPassCommands->onStencilAccess(stencilAccess); > >- mDrawFramebuffer->updateRenderPassReadOnlyDepthMode(this, mRenderPassCommands); >+ drawFramebufferVk->updateRenderPassReadOnlyDepthMode(this, mRenderPassCommands); > } > } > >@@ -6483,15 +6455,17 @@ bool ContextVk::shouldSwitchToReadOnlyDepthFeedbackLoopMode(gl::Texture *texture > // mode in the RenderPass. The tracking tells us when we can retroactively go back and > // change the RenderPass to read-only. If there are any writes we need to break and > // finish the current RP before starting the read-only one. >- return texture->isBoundToFramebuffer(mDrawFramebuffer->getState().getFramebufferSerial()) && >- !mState.isDepthWriteEnabled() && !mDrawFramebuffer->isReadOnlyDepthFeedbackLoopMode(); >+ FramebufferVk *drawFramebufferVk = getDrawFramebuffer(); >+ return texture->isBoundToFramebuffer(drawFramebufferVk->getState().getFramebufferSerial()) && >+ !mState.isDepthWriteEnabled() && !drawFramebufferVk->isReadOnlyDepthFeedbackLoopMode(); > } > > angle::Result ContextVk::onResourceAccess(const vk::CommandBufferAccess &access) > { > ANGLE_TRY(flushCommandBuffersIfNecessary(access)); > >- vk::CommandBuffer *commandBuffer = &mOutsideRenderPassCommands->getCommandBuffer(); >+ vk::OutsideRenderPassCommandBuffer *commandBuffer = >+ &mOutsideRenderPassCommands->getCommandBuffer(); > > for (const vk::CommandBufferImageAccess &imageAccess : access.getReadImages()) > { >@@ -6616,34 +6590,24 @@ angle::Result ContextVk::endRenderPassIfComputeReadAfterTransformFeedbackWrite() > const gl::ProgramExecutable *executable = mState.getProgramExecutable(); > ASSERT(executable && executable->hasLinkedShaderStage(gl::ShaderType::Compute)); > >- gl::ShaderMap<const gl::ProgramState *> programStates; >- mExecutable->fillProgramStateMap(this, &programStates); >+ // Uniform buffers: >+ const std::vector<gl::InterfaceBlock> &blocks = executable->getUniformBlocks(); > >- for (const gl::ShaderType shaderType : executable->getLinkedShaderStages()) >+ for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex) > { >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >- >- // Uniform buffers: >- const std::vector<gl::InterfaceBlock> &blocks = programState->getUniformBlocks(); >+ const gl::InterfaceBlock &block = blocks[bufferIndex]; >+ const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = >+ mState.getIndexedUniformBuffer(block.binding); > >- for (uint32_t bufferIndex = 0; bufferIndex < blocks.size(); ++bufferIndex) >+ if (bufferBinding.get() == nullptr) > { >- const gl::InterfaceBlock &block = blocks[bufferIndex]; >- const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = >- mState.getIndexedUniformBuffer(block.binding); >- >- if (!block.isActive(shaderType) || bufferBinding.get() == nullptr) >- { >- continue; >- } >+ continue; >+ } > >- vk::BufferHelper &buffer = vk::GetImpl(bufferBinding.get())->getBuffer(); >- if (mCurrentTransformFeedbackBuffers.contains(&buffer)) >- { >- return flushCommandsAndEndRenderPass( >- RenderPassClosureReason::XfbWriteThenComputeRead); >- } >+ vk::BufferHelper &buffer = vk::GetImpl(bufferBinding.get())->getBuffer(); >+ if (mCurrentTransformFeedbackBuffers.contains(&buffer)) >+ { >+ return flushCommandsAndEndRenderPass(RenderPassClosureReason::XfbWriteThenComputeRead); > } > } > >@@ -6715,4 +6679,25 @@ ContextVkPerfCounters ContextVk::getAndResetObjectPerfCounters() > mContextPerfCounters.descriptorSetsAllocated = {}; > return counters; > } >+ >+ProgramExecutableVk *ContextVk::getExecutable() const >+{ >+ gl::Program *program = mState.getProgram(); >+ if (program) >+ { >+ if (!program->hasLinkingState()) >+ { >+ return &vk::GetImpl(program)->getExecutable(); >+ } >+ } >+ else >+ { >+ ProgramPipelineVk *programPipelineVk = getProgramPipeline(); >+ if (programPipelineVk) >+ { >+ return &programPipelineVk->getExecutable(); >+ } >+ } >+ return nullptr; >+} > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.h >index 4baf04083232db3c937c32e54dd772a18a1d067f..1fca310922cc21eeca83af1da807f29417be0a3d 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ContextVk.h >@@ -37,15 +37,6 @@ class ShareGroupVk; > static constexpr uint32_t kMaxGpuEventNameLen = 32; > using EventName = std::array<char, kMaxGpuEventNameLen>; > >-enum class PipelineType >-{ >- Graphics = 0, >- Compute = 1, >- >- InvalidEnum = 2, >- EnumCount = 2, >-}; >- > using ContextVkDescriptorSetList = angle::PackedEnumMap<PipelineType, uint32_t>; > > struct ContextVkPerfCounters >@@ -276,7 +267,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > : isViewportFlipEnabledForDrawFBO(); > } > >- void invalidateProgramBindingHelper(const gl::State &glState); >+ void invalidateProgramBindingHelper(); > > // State sync with dirty bits. > angle::Result syncState(const gl::Context *context, >@@ -446,8 +437,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > > void addWaitSemaphore(VkSemaphore semaphore, VkPipelineStageFlags stageMask); > >- const vk::CommandPool &getCommandPool() const; >- > Serial getLastCompletedQueueSerial() const { return mRenderer->getLastCompletedQueueSerial(); } > > bool isSerialInUse(Serial serial) const; >@@ -481,7 +470,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > // Create Begin/End/Instant GPU trace events, which take their timestamps from GPU queries. > // The events are queued until the query results are available. Possible values for `phase` > // are TRACE_EVENT_PHASE_* >- ANGLE_INLINE angle::Result traceGpuEvent(vk::CommandBuffer *commandBuffer, >+ ANGLE_INLINE angle::Result traceGpuEvent(vk::OutsideRenderPassCommandBuffer *commandBuffer, > char phase, > const EventName &name) > { >@@ -555,10 +544,10 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > } > } > >- angle::Result getOutsideRenderPassCommandBuffer(const vk::CommandBufferAccess &access, >- vk::CommandBuffer **commandBufferOut) >+ angle::Result getOutsideRenderPassCommandBuffer( >+ const vk::CommandBufferAccess &access, >+ vk::OutsideRenderPassCommandBuffer **commandBufferOut) > { >- ASSERT(!mOutsideRenderPassCommands->hasRenderPass()); > ANGLE_TRY(onResourceAccess(access)); > *commandBufferOut = &mOutsideRenderPassCommands->getCommandBuffer(); > return angle::Result::Continue; >@@ -571,7 +560,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > const vk::PackedAttachmentCount colorAttachmentCount, > const vk::PackedAttachmentIndex depthStencilAttachmentIndex, > const vk::PackedClearValuesArray &clearValues, >- vk::CommandBuffer **commandBufferOut); >+ vk::RenderPassCommandBuffer **commandBufferOut); > > // Only returns true if we have a started RP and we've run setupDraw. > bool hasStartedRenderPass() const >@@ -591,7 +580,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > return hasStartedRenderPass() && !mRenderPassCommands->getCommandBuffer().empty(); > } > >- vk::CommandBufferHelper &getStartedRenderPassCommands() >+ vk::RenderPassCommandBufferHelper &getStartedRenderPassCommands() > { > ASSERT(mRenderPassCommands->started()); > return *mRenderPassCommands; >@@ -605,9 +594,9 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > > egl::ContextPriority getContextPriority() const override { return mContextPriority; } > angle::Result startRenderPass(gl::Rectangle renderArea, >- vk::CommandBuffer **commandBufferOut, >+ vk::RenderPassCommandBuffer **commandBufferOut, > bool *renderPassDescChangedOut); >- void startNextSubpass(); >+ angle::Result startNextSubpass(); > angle::Result flushCommandsAndEndRenderPass(RenderPassClosureReason reason); > angle::Result flushCommandsAndEndRenderPassWithoutQueueSubmit(RenderPassClosureReason reason); > >@@ -624,8 +613,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > return getFeatures().basicGLLineRasterization.enabled && gl::IsLineMode(mode); > } > >- const ProgramExecutableVk *getExecutable() const { return mExecutable; } >- ProgramExecutableVk *getExecutable() { return mExecutable; } >+ ProgramExecutableVk *getExecutable() const; > > bool isRobustResourceInitEnabled() const; > >@@ -644,7 +632,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > > void syncObjectPerfCounters(); > void updateOverlayOnPresent(); >- void addOverlayUsedBuffersCount(vk::CommandBufferHelper *commandBuffer); >+ void addOverlayUsedBuffersCount(vk::CommandBufferHelperCommon *commandBuffer); > > // DescriptorSet writes > VkDescriptorBufferInfo *allocDescriptorBufferInfos(size_t count); >@@ -655,12 +643,10 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > VkDescriptorImageInfo &allocDescriptorImageInfo() { return *allocDescriptorImageInfos(1); } > VkWriteDescriptorSet &allocWriteDescriptorSet() { return *allocWriteDescriptorSets(1); } > >- vk::DynamicBuffer *getDefaultUniformStorage() { return &mDefaultUniformStorage; } > // For testing only. > void setDefaultUniformBlocksMinSizeForTesting(size_t minSize); > > vk::BufferHelper &getEmptyBuffer() { return mEmptyBuffer; } >- vk::DynamicBuffer *getStagingBuffer() { return &mStagingBuffer; } > > const vk::PerfCounters &getPerfCounters() const { return mPerfCounters; } > vk::PerfCounters &getPerfCounters() { return mPerfCounters; } >@@ -679,9 +665,9 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > > void flushDescriptorSetUpdates(); > >- vk::BufferPool *getDefaultBufferPool(uint32_t memoryTypeIndex) >+ vk::BufferPool *getDefaultBufferPool(VkDeviceSize size, uint32_t memoryTypeIndex) > { >- return mShareGroupVk->getDefaultBufferPool(mRenderer, memoryTypeIndex); >+ return mShareGroupVk->getDefaultBufferPool(mRenderer, size, memoryTypeIndex); > } > > private: >@@ -798,27 +784,23 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > angle::Result setupIndirectDraw(const gl::Context *context, > gl::PrimitiveMode mode, > DirtyBits dirtyBitMask, >- vk::BufferHelper *indirectBuffer, >- VkDeviceSize indirectBufferOffset); >+ vk::BufferHelper *indirectBuffer); > angle::Result setupIndexedIndirectDraw(const gl::Context *context, > gl::PrimitiveMode mode, > gl::DrawElementsType indexType, >- vk::BufferHelper *indirectBuffer, >- VkDeviceSize indirectBufferOffset); >+ vk::BufferHelper *indirectBuffer); > > angle::Result setupLineLoopIndexedIndirectDraw(const gl::Context *context, > gl::PrimitiveMode mode, > gl::DrawElementsType indexType, > vk::BufferHelper *srcIndirectBuf, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut); >+ vk::BufferHelper **indirectBufferOut); > angle::Result setupLineLoopIndirectDraw(const gl::Context *context, > gl::PrimitiveMode mode, > vk::BufferHelper *indirectBuffer, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut); >+ vk::BufferHelper **indirectBufferOut); > > angle::Result setupLineLoopDraw(const gl::Context *context, > gl::PrimitiveMode mode, >@@ -841,7 +823,8 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > void updateSurfaceRotationReadFramebuffer(const gl::State &glState); > > angle::Result updateActiveTextures(const gl::Context *context, gl::Command command); >- angle::Result updateActiveImages(vk::CommandBufferHelper *commandBufferHelper); >+ template <typename CommandBufferHelperT> >+ angle::Result updateActiveImages(CommandBufferHelperT *commandBufferHelper); > angle::Result updateDefaultAttribute(size_t attribIndex); > > ANGLE_INLINE void invalidateCurrentGraphicsPipeline() >@@ -922,14 +905,20 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > // Common parts of the common dirty bit handlers. > angle::Result handleDirtyMemoryBarrierImpl(DirtyBits::Iterator *dirtyBitsIterator, > DirtyBits dirtyBitMask); >- angle::Result handleDirtyEventLogImpl(vk::CommandBuffer *commandBuffer); >- angle::Result handleDirtyTexturesImpl(vk::CommandBufferHelper *commandBufferHelper, >+ template <typename CommandBufferT> >+ angle::Result handleDirtyEventLogImpl(CommandBufferT *commandBuffer); >+ template <typename CommandBufferHelperT> >+ angle::Result handleDirtyTexturesImpl(CommandBufferHelperT *commandBufferHelper, > PipelineType pipelineType); >- angle::Result handleDirtyShaderResourcesImpl(vk::CommandBufferHelper *commandBufferHelper); >- void handleDirtyDriverUniformsBindingImpl(vk::CommandBuffer *commandBuffer, >+ template <typename CommandBufferHelperT> >+ angle::Result handleDirtyShaderResourcesImpl(CommandBufferHelperT *commandBufferHelper); >+ void handleDirtyShaderBufferResourcesImpl(vk::CommandBufferHelperCommon *commandBufferHelper); >+ template <typename CommandBufferT> >+ void handleDirtyDriverUniformsBindingImpl(CommandBufferT *commandBuffer, > VkPipelineBindPoint bindPoint, > DriverUniformsDescriptorSet *driverUniforms); >- angle::Result handleDirtyDescriptorSetsImpl(vk::CommandBuffer *commandBuffer, >+ template <typename CommandBufferT> >+ angle::Result handleDirtyDescriptorSetsImpl(CommandBufferT *commandBuffer, > PipelineType pipelineType); > void handleDirtyGraphicsScissorImpl(bool isPrimitivesGeneratedQueryActive); > >@@ -946,7 +935,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > angle::Result submitFrame(const vk::Semaphore *signalSemaphore, Serial *submitSerialOut); > > angle::Result synchronizeCpuGpuTime(); >- angle::Result traceGpuEventImpl(vk::CommandBuffer *commandBuffer, >+ angle::Result traceGpuEventImpl(vk::OutsideRenderPassCommandBuffer *commandBuffer, > char phase, > const EventName &name); > angle::Result checkCompletedGpuEvents(); >@@ -954,7 +943,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > void handleDeviceLost(); > bool shouldEmulateSeamfulCubeMapSampling() const; > void clearAllGarbage(); >- bool hasRecordedCommands(); > void dumpCommandStreamDiagnostics(); > angle::Result flushOutsideRenderPassCommands(); > // Flush commands and end render pass without setting any dirty bits. >@@ -971,6 +959,11 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > > void initIndexTypeMap(); > >+ VertexArrayVk *getVertexArray() const; >+ FramebufferVk *getDrawFramebuffer() const; >+ ProgramVk *getProgram() const; >+ ProgramPipelineVk *getProgramPipeline() const; >+ > // Read-after-write hazards are generally handled with |glMemoryBarrier| when the source of > // write is storage output. When the write is outside render pass, the natural placement of the > // render pass after the current outside render pass commands ensures that the memory barriers >@@ -1023,7 +1016,7 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > std::array<GraphicsDirtyBitHandler, DIRTY_BIT_MAX> mGraphicsDirtyBitHandlers; > std::array<ComputeDirtyBitHandler, DIRTY_BIT_MAX> mComputeDirtyBitHandlers; > >- vk::CommandBuffer *mRenderPassCommandBuffer; >+ vk::RenderPassCommandBuffer *mRenderPassCommandBuffer; > > vk::PipelineHelper *mCurrentGraphicsPipeline; > vk::PipelineHelper *mCurrentComputePipeline; >@@ -1073,13 +1066,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > static constexpr DirtyBits kDriverUniformsAndBindingDirtyBits{ > DIRTY_BIT_DRIVER_UNIFORMS, DIRTY_BIT_DRIVER_UNIFORMS_BINDING}; > >- // Cached back-end objects. >- VertexArrayVk *mVertexArray; >- FramebufferVk *mDrawFramebuffer; >- ProgramVk *mProgram; >- ProgramPipelineVk *mProgramPipeline; >- ProgramExecutableVk *mExecutable; >- > // The offset we had the last time we bound the index buffer. > const GLvoid *mLastIndexBufferOffset; > VkDeviceSize mCurrentIndexBufferOffset; >@@ -1135,14 +1121,14 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > gl::AttribArray<vk::DynamicBuffer> mDefaultAttribBuffers; > > // We use a single pool for recording commands. We also keep a free list for pool recycling. >- vk::CommandPool mCommandPool; >+ vk::SecondaryCommandPools mCommandPools; > > vk::GarbageList mCurrentGarbage; > > RenderPassCache mRenderPassCache; > >- vk::CommandBufferHelper *mOutsideRenderPassCommands; >- vk::CommandBufferHelper *mRenderPassCommands; >+ vk::OutsideRenderPassCommandBufferHelper *mOutsideRenderPassCommands; >+ vk::RenderPassCommandBufferHelper *mRenderPassCommands; > > // The following is used when creating debug-util markers for graphics debuggers (e.g. AGI). A > // given gl{Begin|End}Query command may result in commands being submitted to the outside or >@@ -1223,9 +1209,6 @@ class ContextVk : public ContextImpl, public vk::Context, public MultisampleText > // Storage for default uniforms of ProgramVks and ProgramPipelineVks. > vk::DynamicBuffer mDefaultUniformStorage; > >- // All staging buffer support is provided by a DynamicBuffer. >- vk::DynamicBuffer mStagingBuffer; >- > std::vector<std::string> mCommandBufferDiagnostics; > > // Record GL API calls for debuggers >@@ -1277,6 +1260,11 @@ ANGLE_INLINE angle::Result ContextVk::onVertexAttributeChange(size_t attribIndex > relativeOffset); > return onVertexBufferChange(vertexBuffer); > } >+ >+ANGLE_INLINE bool UseLineRaster(const ContextVk *contextVk, gl::PrimitiveMode mode) >+{ >+ return contextVk->getFeatures().basicGLLineRasterization.enabled && gl::IsLineMode(mode); >+} > } // namespace rx > > // Generate a perf warning, and insert an event marker in the command buffer. >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.cpp >index 21206c540a8b2a60863b13fbd131ab18f40ba394..f9f3c85cc92a72fb239518236c0a1eaf91cb31ff 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.cpp >@@ -12,16 +12,44 @@ > #include <stdint.h> > > #include "common/debug.h" >+#include "common/vulkan/vulkan_icd.h" > #include "libANGLE/Display.h" > #include "libANGLE/renderer/vulkan/DisplayVk.h" > #include "libANGLE/renderer/vulkan/RendererVk.h" > > namespace rx > { >+namespace >+{ >+ >+DeviceVk *gDevice = nullptr; >+ >+class ScopedEnv : public angle::vk::ScopedVkLoaderEnvironment >+{ >+ public: >+ ScopedEnv() >+ : angle::vk::ScopedVkLoaderEnvironment( >+ gDevice ? gDevice->getRenderer()->getEnableValidationLayers() : false, >+ gDevice ? gDevice->getRenderer()->getEnabledICD() : angle::vk::ICD::Default) >+ { >+ if (!gDevice) >+ { >+ WARN() << "No DeviceVk instance."; >+ } >+ } >+}; >+ >+} // namespace > > DeviceVk::DeviceVk() = default; > >-DeviceVk::~DeviceVk() = default; >+DeviceVk::~DeviceVk() >+{ >+ if (gDevice == this) >+ { >+ gDevice = nullptr; >+ } >+} > > egl::Error DeviceVk::initialize() > { >@@ -32,63 +60,67 @@ egl::Error DeviceVk::getAttribute(const egl::Display *display, EGLint attribute, > { > RendererVk *renderer = > static_cast<rx::DisplayVk *>(display->getImplementation())->getRenderer(); >+ ASSERT(mRenderer == nullptr || mRenderer == renderer); >+ mRenderer = renderer; > switch (attribute) > { > case EGL_VULKAN_VERSION_ANGLE: > { >- auto version = static_cast<intptr_t>(renderer->getApiVersion()); >+ auto version = static_cast<intptr_t>(mRenderer->getApiVersion()); > *outValue = reinterpret_cast<void *>(version); > return egl::NoError(); > } > case EGL_VULKAN_INSTANCE_ANGLE: > { >- *outValue = renderer->getInstance(); >+ *outValue = mRenderer->getInstance(); > return egl::NoError(); > } > case EGL_VULKAN_DEVICE_ANGLE: > { >- *outValue = renderer->getDevice(); >+ *outValue = mRenderer->getDevice(); > return egl::NoError(); > } > case EGL_VULKAN_PHYSICAL_DEVICE_ANGLE: > { >- *outValue = renderer->getPhysicalDevice(); >+ *outValue = mRenderer->getPhysicalDevice(); > return egl::NoError(); > } > case EGL_VULKAN_QUEUE_ANGLE: > { > // egl::ContextPriority::Medium is the default context priority. >- *outValue = renderer->getQueue(egl::ContextPriority::Medium); >+ *outValue = mRenderer->getQueue(egl::ContextPriority::Medium); > return egl::NoError(); > } > case EGL_VULKAN_QUEUE_FAMILIY_INDEX_ANGLE: > { >- intptr_t index = static_cast<intptr_t>(renderer->getQueueFamilyIndex()); >+ intptr_t index = static_cast<intptr_t>(mRenderer->getQueueFamilyIndex()); > *outValue = reinterpret_cast<void *>(index); > return egl::NoError(); > } > case EGL_VULKAN_DEVICE_EXTENSIONS_ANGLE: > { >- char **extensions = const_cast<char **>(renderer->getEnabledDeviceExtensions().data()); >+ char **extensions = const_cast<char **>(mRenderer->getEnabledDeviceExtensions().data()); > *outValue = reinterpret_cast<void *>(extensions); > return egl::NoError(); > } > case EGL_VULKAN_INSTANCE_EXTENSIONS_ANGLE: > { > char **extensions = >- const_cast<char **>(renderer->getEnabledInstanceExtensions().data()); >+ const_cast<char **>(mRenderer->getEnabledInstanceExtensions().data()); > *outValue = reinterpret_cast<void *>(extensions); > return egl::NoError(); > } > case EGL_VULKAN_FEATURES_ANGLE: > { >- const auto *features = &renderer->getEnabledFeatures(); >+ const auto *features = &mRenderer->getEnabledFeatures(); > *outValue = const_cast<void *>(reinterpret_cast<const void *>(features)); > return egl::NoError(); > } > case EGL_VULKAN_GET_INSTANCE_PROC_ADDR: > { >- *outValue = reinterpret_cast<void *>(vkGetInstanceProcAddr); >+ *outValue = reinterpret_cast<void *>(DeviceVk::WrappedGetInstanceProcAddr); >+ ASSERT(!gDevice || gDevice == this); >+ gDevice = this; > return egl::NoError(); > } > default: >@@ -106,4 +138,85 @@ void DeviceVk::generateExtensions(egl::DeviceExtensions *outExtensions) const > outExtensions->deviceVulkan = true; > } > >+// static >+VKAPI_ATTR VkResult VKAPI_CALL >+DeviceVk::WrappedCreateInstance(const VkInstanceCreateInfo *pCreateInfo, >+ const VkAllocationCallbacks *pAllocator, >+ VkInstance *pInstance) >+{ >+ ScopedEnv scopedEnv; >+ return vkCreateInstance(pCreateInfo, pAllocator, pInstance); >+} >+ >+// static >+VKAPI_ATTR VkResult VKAPI_CALL >+DeviceVk::WrappedEnumerateInstanceExtensionProperties(const char *pLayerName, >+ uint32_t *pPropertyCount, >+ VkExtensionProperties *pProperties) >+{ >+ ScopedEnv scopedEnv; >+ return vkEnumerateInstanceExtensionProperties(pLayerName, pPropertyCount, pProperties); >+} >+ >+// static >+VKAPI_ATTR VkResult VKAPI_CALL >+DeviceVk::WrappedEnumerateInstanceLayerProperties(uint32_t *pPropertyCount, >+ VkLayerProperties *pProperties) >+{ >+ ScopedEnv scopedEnv; >+ return vkEnumerateInstanceLayerProperties(pPropertyCount, pProperties); >+} >+ >+// static >+VKAPI_ATTR VkResult VKAPI_CALL DeviceVk::WrappedEnumerateInstanceVersion(uint32_t *pApiVersion) >+{ >+ ScopedEnv scopedEnv; >+ return vkEnumerateInstanceVersion(pApiVersion); >+} >+ >+// static >+VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL DeviceVk::WrappedGetInstanceProcAddr(VkInstance instance, >+ const char *pName) >+{ >+ if (!pName || pName[0] != 'v' || pName[1] != 'k') >+ { >+ return nullptr; >+ } >+ >+ if (instance != VK_NULL_HANDLE) >+ { >+ return vkGetInstanceProcAddr(instance, pName); >+ } >+ >+ if (!strcmp(pName, "vkCreateInstance")) >+ { >+ return reinterpret_cast<PFN_vkVoidFunction>(DeviceVk::WrappedCreateInstance); >+ } >+ if (!strcmp(pName, "vkEnumerateInstanceExtensionProperties")) >+ { >+ return reinterpret_cast<PFN_vkVoidFunction>( >+ DeviceVk::WrappedEnumerateInstanceExtensionProperties); >+ } >+ if (!strcmp(pName, "vkEnumerateInstanceLayerProperties")) >+ { >+ return reinterpret_cast<PFN_vkVoidFunction>( >+ DeviceVk::WrappedEnumerateInstanceLayerProperties); >+ } >+ if (!strcmp(pName, "vkEnumerateInstanceVersion")) >+ { >+ if (!vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion")) >+ { >+ // Vulkan 1.0 doesn't have vkEnumerateInstanceVersion. >+ return nullptr; >+ } >+ return reinterpret_cast<PFN_vkVoidFunction>(DeviceVk::WrappedEnumerateInstanceVersion); >+ } >+ if (!strcmp(pName, "vkGetInstanceProcAddr")) >+ { >+ return reinterpret_cast<PFN_vkVoidFunction>(DeviceVk::WrappedGetInstanceProcAddr); >+ } >+ >+ return vkGetInstanceProcAddr(instance, pName); >+} >+ > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.h >index a0c50fff38369fce83c2510e7db0e1b764b7e355..e3727a0bc216ca4f6c523f2b78a57304db13632c 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DeviceVk.h >@@ -12,9 +12,13 @@ > > #include "libANGLE/renderer/DeviceImpl.h" > >+#include "common/vulkan/vk_headers.h" >+ > namespace rx > { > >+class RendererVk; >+ > class DeviceVk : public DeviceImpl > { > public: >@@ -27,6 +31,27 @@ class DeviceVk : public DeviceImpl > void **outValue) override; > EGLint getType() override; > void generateExtensions(egl::DeviceExtensions *outExtensions) const override; >+ RendererVk *getRenderer() const { return mRenderer; } >+ >+ private: >+ // Wrappers for some global vulkan methods which need to read env variables. >+ // The wrappers will set those env variables before calling those global methods. >+ static VKAPI_ATTR VkResult VKAPI_CALL >+ WrappedCreateInstance(const VkInstanceCreateInfo *pCreateInfo, >+ const VkAllocationCallbacks *pAllocator, >+ VkInstance *pInstance); >+ static VKAPI_ATTR VkResult VKAPI_CALL >+ WrappedEnumerateInstanceExtensionProperties(const char *pLayerName, >+ uint32_t *pPropertyCount, >+ VkExtensionProperties *pProperties); >+ static VKAPI_ATTR VkResult VKAPI_CALL >+ WrappedEnumerateInstanceLayerProperties(uint32_t *pPropertyCount, >+ VkLayerProperties *pProperties); >+ static VKAPI_ATTR VkResult VKAPI_CALL WrappedEnumerateInstanceVersion(uint32_t *pApiVersion); >+ static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL WrappedGetInstanceProcAddr(VkInstance instance, >+ const char *pName); >+ >+ RendererVk *mRenderer = nullptr; > }; > > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.cpp >index eb4b8b4590c16166c719116b33fa9373e5d06fda..8d3316a5c812331b85feb51ef43977f675d74e7b 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.cpp >@@ -324,6 +324,9 @@ void DisplayVk::generateExtensions(egl::DisplayExtensions *outExtensions) const > getRenderer()->getFeatures().supportsSharedPresentableImageExtension.enabled; > > outExtensions->vulkanImageANGLE = true; >+ >+ outExtensions->lockSurface3KHR = >+ getRenderer()->getFeatures().supportsLockSurfaceExtension.enabled; > } > > void DisplayVk::generateCaps(egl::Caps *outCaps) const >@@ -402,23 +405,47 @@ void ShareGroupVk::onDestroy(const egl::Display *display) > } > } > >+ if (mSmallBufferPool) >+ { >+ mSmallBufferPool->destroy(renderer); >+ } >+ > mPipelineLayoutCache.destroy(renderer); > mDescriptorSetLayoutCache.destroy(renderer); > > ASSERT(mResourceUseLists.empty()); > } > >-vk::BufferPool *ShareGroupVk::getDefaultBufferPool(RendererVk *renderer, uint32_t memoryTypeIndex) >+vk::BufferPool *ShareGroupVk::getDefaultBufferPool(RendererVk *renderer, >+ VkDeviceSize size, >+ uint32_t memoryTypeIndex) > { >- if (!mDefaultBufferPools[memoryTypeIndex]) >+ if (size <= kMaxSizeToUseSmallBufferPool && >+ memoryTypeIndex == >+ renderer->getVertexConversionBufferMemoryTypeIndex(vk::MemoryHostVisibility::Visible)) > { >- vk::BufferMemoryAllocator &bufferMemoryAllocator = renderer->getBufferMemoryAllocator(); >+ if (!mSmallBufferPool) >+ { >+ const vk::Allocator &allocator = renderer->getAllocator(); >+ VkBufferUsageFlags usageFlags = GetDefaultBufferUsageFlags(renderer); > >- VkBufferUsageFlags usageFlags = GetDefaultBufferUsageFlags(renderer); >+ VkMemoryPropertyFlags memoryPropertyFlags; >+ allocator.getMemoryTypeProperties(memoryTypeIndex, &memoryPropertyFlags); >+ >+ std::unique_ptr<vk::BufferPool> pool = std::make_unique<vk::BufferPool>(); >+ pool->initWithFlags(renderer, vma::VirtualBlockCreateFlagBits::BUDDY, usageFlags, 0, >+ memoryTypeIndex, memoryPropertyFlags); >+ mSmallBufferPool = std::move(pool); >+ } >+ return mSmallBufferPool.get(); >+ } >+ else if (!mDefaultBufferPools[memoryTypeIndex]) >+ { >+ const vk::Allocator &allocator = renderer->getAllocator(); >+ VkBufferUsageFlags usageFlags = GetDefaultBufferUsageFlags(renderer); > > VkMemoryPropertyFlags memoryPropertyFlags; >- bufferMemoryAllocator.getMemoryTypeProperties(renderer, memoryTypeIndex, >- &memoryPropertyFlags); >+ allocator.getMemoryTypeProperties(memoryTypeIndex, &memoryPropertyFlags); > > std::unique_ptr<vk::BufferPool> pool = std::make_unique<vk::BufferPool>(); > pool->initWithFlags(renderer, vma::VirtualBlockCreateFlagBits::GENERAL, usageFlags, 0, >@@ -440,6 +467,10 @@ void ShareGroupVk::pruneDefaultBufferPools(RendererVk *renderer) > pool->pruneEmptyBuffers(renderer); > } > } >+ if (mSmallBufferPool) >+ { >+ mSmallBufferPool->pruneEmptyBuffers(renderer); >+ } > } > > bool ShareGroupVk::isDueForBufferPoolPrune() >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.h >index 700702faa9ad8908a4323bef0cb2f6146944772c..2df318c4138ec7bdc83c676e58035983f80406e5 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/DisplayVk.h >@@ -45,7 +45,9 @@ class ShareGroupVk : public ShareGroupImpl > mResourceUseLists.emplace_back(std::move(resourceUseList)); > } > >- vk::BufferPool *getDefaultBufferPool(RendererVk *renderer, uint32_t memoryTypeIndex); >+ vk::BufferPool *getDefaultBufferPool(RendererVk *renderer, >+ VkDeviceSize size, >+ uint32_t memoryTypeIndex); > void pruneDefaultBufferPools(RendererVk *renderer); > bool isDueForBufferPoolPrune(); > >@@ -65,6 +67,11 @@ class ShareGroupVk : public ShareGroupImpl > > // The per shared group buffer pools that all buffers should sub-allocate from. > vk::BufferPoolPointerArray mDefaultBufferPools; >+ >+ // The pool dedicated for small allocations that uses faster buddy algorithm >+ std::unique_ptr<vk::BufferPool> mSmallBufferPool; >+ static constexpr VkDeviceSize kMaxSizeToUseSmallBufferPool = 256; >+ > // The system time when last pruneEmptyBuffer gets called. > double mLastPruneTime; > }; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.cpp >index a6cca45b7339e248538ab0c4dfd864619631c940..fd3b7444b5a2d7c8f91787f74a46437bdec1fad4 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.cpp >@@ -32,13 +32,6 @@ namespace rx > > namespace > { >-constexpr size_t kMinReadPixelsBufferSize = 128000; >- >-// Alignment value to accommodate the largest known, for now, uncompressed Vulkan format >-// VK_FORMAT_R64G64B64A64_SFLOAT, while supporting 3-component types such as >-// VK_FORMAT_R16G16B16_SFLOAT. >-constexpr size_t kReadPixelsBufferAlignment = 32 * 3; >- > // Clear values are only used when loadOp=Clear is set in clearWithRenderPassOp. When starting a > // new render pass, the clear value is set to an unlikely value (bright pink) to stand out better > // in case of a bug. >@@ -283,14 +276,12 @@ vk::FramebufferNonResolveAttachmentMask MakeUnresolveAttachmentMask(const vk::Re > { > vk::FramebufferNonResolveAttachmentMask unresolveMask( > desc.getColorUnresolveAttachmentMask().bits()); >- if (desc.hasDepthUnresolveAttachment()) >+ if (desc.hasDepthUnresolveAttachment() || desc.hasStencilUnresolveAttachment()) > { >+ // This mask only needs to know if the depth/stencil attachment needs to be unresolved, and >+ // is agnostic of the aspect. > unresolveMask.set(vk::kUnpackedDepthIndex); > } >- if (desc.hasStencilUnresolveAttachment()) >- { >- unresolveMask.set(vk::kUnpackedStencilIndex); >- } > return unresolveMask; > } > >@@ -343,10 +334,7 @@ FramebufferVk::FramebufferVk(RendererVk *renderer, > mFramebuffer(nullptr), > mActiveColorComponentMasksForClear(0), > mReadOnlyDepthFeedbackLoopMode(false) >-{ >- mReadPixelBuffer.init(renderer, VK_BUFFER_USAGE_TRANSFER_DST_BIT, kReadPixelsBufferAlignment, >- kMinReadPixelsBufferSize, true, vk::DynamicBufferPolicy::OneShotUse); >-} >+{} > > FramebufferVk::~FramebufferVk() = default; > >@@ -355,7 +343,6 @@ void FramebufferVk::destroy(const gl::Context *context) > ContextVk *contextVk = vk::GetImpl(context); > RendererVk *rendererVk = contextVk->getRenderer(); > >- mReadPixelBuffer.release(rendererVk); > mFramebufferCache.clear(contextVk); > mFramebufferCache.destroy(rendererVk); > mFramebuffer = nullptr; >@@ -562,7 +549,8 @@ angle::Result FramebufferVk::clearImpl(const gl::Context *context, > ANGLE_VK_PERF_WARNING( > contextVk, GL_DEBUG_SEVERITY_LOW, > "Clear effectively discarding previous draw call results. Suggest earlier Clear " >- "followed by masked color or depth/stencil draw calls instead"); >+ "followed by masked color or depth/stencil draw calls instead, or " >+ "glInvalidateFramebuffer to discard data instead"); > > ASSERT(!preferDrawOverClearAttachments); > >@@ -787,7 +775,6 @@ angle::Result FramebufferVk::readPixels(const gl::Context *context, > ANGLE_TRY(readPixelsImpl(contextVk, params.area, params, getReadPixelsAspectFlags(format), > getReadPixelsRenderTarget(format), > static_cast<uint8_t *>(pixels) + outputSkipBytes)); >- mReadPixelBuffer.releaseInFlightBuffers(contextVk); > return angle::Result::Continue; > } > >@@ -872,7 +859,7 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk, > access.onImageTransferRead(imageAspectMask, srcImage); > access.onImageTransferWrite(drawRenderTarget->getLevelIndex(), 1, > drawRenderTarget->getLayerIndex(), 1, imageAspectMask, dstImage); >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkImageBlit blit = {}; >@@ -1418,8 +1405,9 @@ angle::Result FramebufferVk::resolveColorWithSubpass(ContextVk *contextVk, > ANGLE_TRY(drawRenderTarget->getImageView(contextVk, &resolveImageView)); > vk::Framebuffer *newSrcFramebuffer = nullptr; > ANGLE_TRY(srcFramebufferVk->getFramebuffer(contextVk, &newSrcFramebuffer, resolveImageView)); >- // 2. Update the CommandBufferHelper with the new framebuffer and render pass >- vk::CommandBufferHelper &commandBufferHelper = contextVk->getStartedRenderPassCommands(); >+ // 2. Update the RenderPassCommandBufferHelper with the new framebuffer and render pass >+ vk::RenderPassCommandBufferHelper &commandBufferHelper = >+ contextVk->getStartedRenderPassCommands(); > commandBufferHelper.updateRenderPassForResolve(contextVk, newSrcFramebuffer, > srcFramebufferVk->getRenderPassDesc()); > >@@ -1451,7 +1439,7 @@ angle::Result FramebufferVk::resolveColorWithCommand(ContextVk *contextVk, > &dstImage); > } > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkImageResolve resolveRegion = {}; >@@ -2342,7 +2330,7 @@ void FramebufferVk::redeferClears(ContextVk *contextVk) > } > > angle::Result FramebufferVk::clearWithCommand(ContextVk *contextVk, >- vk::CommandBufferHelper *renderpassCommands, >+ vk::RenderPassCommandBufferHelper *renderpassCommands, > const gl::Rectangle &scissoredRenderArea) > { > // Clear is not affected by viewport, so ContextVk::updateScissor may have decided on a smaller >@@ -2393,11 +2381,11 @@ angle::Result FramebufferVk::clearWithCommand(ContextVk *contextVk, > updateRenderPassReadOnlyDepthMode(contextVk, renderpassCommands); > } > >- VkClearRect rect = {}; >- rect.rect.extent.width = scissoredRenderArea.width; >- rect.rect.extent.height = scissoredRenderArea.height; >- rect.layerCount = mCurrentFramebufferDesc.getLayerCount(); >- vk::CommandBuffer *renderPassCommandBuffer = &renderpassCommands->getCommandBuffer(); >+ VkClearRect rect = {}; >+ rect.rect.extent.width = scissoredRenderArea.width; >+ rect.rect.extent.height = scissoredRenderArea.height; >+ rect.layerCount = mCurrentFramebufferDesc.getLayerCount(); >+ vk::RenderPassCommandBuffer *renderPassCommandBuffer = &renderpassCommands->getCommandBuffer(); > > renderPassCommandBuffer->clearAttachments(static_cast<uint32_t>(attachments.size()), > attachments.data(), 1, &rect); >@@ -2415,7 +2403,7 @@ angle::Result FramebufferVk::getSamplePosition(const gl::Context *context, > > angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk, > const gl::Rectangle &scissoredRenderArea, >- vk::CommandBuffer **commandBufferOut, >+ vk::RenderPassCommandBuffer **commandBufferOut, > bool *renderPassDescChangedOut) > { > ANGLE_TRY(contextVk->flushCommandsAndEndRenderPass(RenderPassClosureReason::NewRenderPass)); >@@ -2704,7 +2692,7 @@ angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk, > ANGLE_TRY(contextVk->getUtils().unresolve(contextVk, this, params)); > > // The unresolve subpass has only one draw call. >- contextVk->startNextSubpass(); >+ ANGLE_TRY(contextVk->startNextSubpass()); > } > > if (unresolveChanged || anyUnresolve) >@@ -2738,8 +2726,7 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk, > gl::LevelIndex levelGL = renderTarget->getLevelIndex(); > uint32_t layer = renderTarget->getLayerIndex(); > return renderTarget->getImageForCopy().readPixels(contextVk, area, packPixelsParams, >- copyAspectFlags, levelGL, layer, pixels, >- &mReadPixelBuffer); >+ copyAspectFlags, levelGL, layer, pixels); > } > > gl::Extents FramebufferVk::getReadImageExtents() const >@@ -2831,7 +2818,7 @@ angle::Result FramebufferVk::flushDeferredClears(ContextVk *contextVk) > } > > void FramebufferVk::updateRenderPassReadOnlyDepthMode(ContextVk *contextVk, >- vk::CommandBufferHelper *renderPass) >+ vk::RenderPassCommandBufferHelper *renderPass) > { > bool readOnlyDepthStencilMode = > getDepthStencilRenderTarget() && !getDepthStencilRenderTarget()->hasResolveAttachment() && >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.h >index d9d45444dbc244c6848469aec287f5b7d85e8356..135a77f16bfc5be566c2559b3e438c5ebf4954ba 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/FramebufferVk.h >@@ -138,7 +138,7 @@ class FramebufferVk : public FramebufferImpl > > angle::Result startNewRenderPass(ContextVk *contextVk, > const gl::Rectangle &scissoredRenderArea, >- vk::CommandBuffer **commandBufferOut, >+ vk::RenderPassCommandBuffer **commandBufferOut, > bool *renderPassDescChangedOut); > > GLint getSamples() const; >@@ -157,7 +157,7 @@ class FramebufferVk : public FramebufferImpl > } > bool isReadOnlyDepthFeedbackLoopMode() const { return mReadOnlyDepthFeedbackLoopMode; } > void updateRenderPassReadOnlyDepthMode(ContextVk *contextVk, >- vk::CommandBufferHelper *renderPass); >+ vk::RenderPassCommandBufferHelper *renderPass); > > void onSwitchProgramFramebufferFetch(ContextVk *contextVk, bool programUsesFramebufferFetch); > >@@ -211,7 +211,7 @@ class FramebufferVk : public FramebufferImpl > const VkClearDepthStencilValue &clearDepthStencilValue); > void redeferClears(ContextVk *contextVk); > angle::Result clearWithCommand(ContextVk *contextVk, >- vk::CommandBufferHelper *renderpassCommands, >+ vk::RenderPassCommandBufferHelper *renderpassCommands, > const gl::Rectangle &scissoredRenderArea); > void updateActiveColorMasks(size_t colorIndex, bool r, bool g, bool b, bool a); > void updateRenderPassDesc(ContextVk *contextVk); >@@ -251,7 +251,6 @@ class FramebufferVk : public FramebufferImpl > // channel is masked out, we check against the Framebuffer Attachments (RenderTargets) to see > // if the masked out channel is present in any of the attachments. > gl::BlendStateExt::ColorMaskStorage::Type mActiveColorComponentMasksForClear; >- vk::DynamicBuffer mReadPixelBuffer; > > // When we draw to the framebuffer, and the real format has an alpha channel but the format of > // the framebuffer does not, we need to mask out the alpha channel. This DrawBufferMask will >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ImageVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ImageVk.cpp >index 62103d796cce114735d7ba0a13b9345c5ab9e47c..35bdf30ea963f43e49c72e6653909d0abdbb3606 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ImageVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ImageVk.cpp >@@ -37,7 +37,7 @@ void ImageVk::onDestroy(const egl::Display *display) > // TODO: We need to handle the case that EGLImage used in two context that aren't shared. > // https://issuetracker.google.com/169868803 > mImage->releaseImage(renderer); >- mImage->releaseStagingBuffer(renderer); >+ mImage->releaseStagedUpdates(renderer); > SafeDelete(mImage); > } > else if (egl::IsExternalImageTarget(mState.target)) >@@ -82,7 +82,6 @@ egl::Error ImageVk::initialize(const egl::Display *display) > } > else > { >- RendererVk *renderer = nullptr; > if (egl::IsRenderbufferTarget(mState.target)) > { > RenderbufferVk *renderbufferVk = >@@ -90,7 +89,6 @@ egl::Error ImageVk::initialize(const egl::Display *display) > mImage = renderbufferVk->getImage(); > > ASSERT(mContext != nullptr); >- renderer = vk::GetImpl(mContext)->getRenderer(); > } > else if (egl::IsExternalImageTarget(mState.target)) > { >@@ -99,7 +97,6 @@ egl::Error ImageVk::initialize(const egl::Display *display) > mImage = externalImageSibling->getImage(); > > ASSERT(mContext == nullptr); >- renderer = vk::GetImpl(display)->getRenderer(); > } > else > { >@@ -107,17 +104,7 @@ egl::Error ImageVk::initialize(const egl::Display *display) > return egl::EglBadAccess(); > } > >- // start with some reasonable alignment that's safe for the case where intendedFormatID is >- // FormatID::NONE >- size_t alignment = vk::GetValidImageCopyBufferAlignment(mImage->getIntendedFormatID(), >- mImage->getActualFormatID()); >- >- // Make sure a staging buffer is ready to use to upload data >- mImage->initStagingBuffer(renderer, alignment, vk::kStagingBufferFlags, >- vk::kStagingBufferSize); >- >- mOwnsImage = false; >- >+ mOwnsImage = false; > mImageTextureType = gl::TextureType::_2D; > mImageLevel = gl::LevelIndex(0); > mImageLayer = 0; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/OverlayVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/OverlayVk.cpp >index 4dfdeb97c983359ba96a7d293255fea6f8a698d1..9ce7717f1d5c85f997fd000fded3ba106706ff72 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/OverlayVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/OverlayVk.cpp >@@ -39,14 +39,27 @@ angle::Result OverlayVk::init(const gl::Context *context, bool *successOut) > rendererVk->getPhysicalDeviceSubgroupProperties(); > uint32_t subgroupSize = subgroupProperties.subgroupSize; > >- // Currently, only subgroup sizes 32 and 64 are supported. >- if (subgroupSize != 32 && subgroupSize != 64) >+ // Currently, only subgroup sizes 16, 32 and 64 are supported >+ if (subgroupSize != 32 && subgroupSize != 64 && subgroupSize != 16) > { > return angle::Result::Continue; > } > >- mSubgroupSize[0] = 8; >- mSubgroupSize[1] = subgroupSize / 8; >+ if (subgroupSize == 32 || subgroupSize == 64) >+ { >+ mSubgroupSize[0] = 8; >+ mSubgroupSize[1] = subgroupSize / 8; >+ } >+ else if (subgroupSize == 16) >+ { >+ mSubgroupSize[0] = 4; >+ mSubgroupSize[1] = 4; >+ } >+ else >+ { >+ // unsupported subgroupSize >+ return angle::Result::Continue; >+ } > > constexpr VkSubgroupFeatureFlags kSubgroupBallotOperations = > VK_SUBGROUP_FEATURE_BASIC_BIT | VK_SUBGROUP_FEATURE_BALLOT_BIT; >@@ -132,7 +145,7 @@ angle::Result OverlayVk::createFont(ContextVk *contextVk) > access.onBufferTransferRead(&fontDataBuffer.get()); > access.onImageTransferWrite(gl::LevelIndex(0), 1, 0, gl::overlay::kFontCount, > VK_IMAGE_ASPECT_COLOR_BIT, &mFontImage); >- vk::CommandBuffer *fontDataUpload; >+ vk::OutsideRenderPassCommandBuffer *fontDataUpload; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &fontDataUpload)); > > VkBufferImageCopy copy = {}; >@@ -201,10 +214,8 @@ angle::Result OverlayVk::cullWidgets(ContextVk *contextVk) > &mCulledWidgetsView, vk::LevelIndex(0), 1)); > > UtilsVk::OverlayCullParameters params; >- params.subgroupSize[0] = mSubgroupSize[0]; >- params.subgroupSize[1] = mSubgroupSize[1]; >- params.supportsSubgroupBallot = mSupportsSubgroupBallot; >- params.supportsSubgroupArithmetic = mSupportsSubgroupArithmetic; >+ params.subgroupSize[0] = mSubgroupSize[0]; >+ params.subgroupSize[1] = mSubgroupSize[1]; > > return contextVk->getUtils().cullOverlayWidgets(contextVk, &enabledWidgetsBuffer.get(), > &mCulledWidgets, &mCulledWidgetsView, params); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp >index 10f763c59eee9c6d5ab1f2e5f50e296e944dab23..7347e4ce5e47d3a9a66e0ddaab5dcb37e8d8f95a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp >@@ -132,7 +132,7 @@ angle::Result ShaderInfo::initShaders(const gl::ShaderBitSet &linkedShaderStages > const gl::ShaderMap<const angle::spirv::Blob *> &spirvBlobs, > const ShaderInterfaceVariableInfoMap &variableInfoMap) > { >- ASSERT(!valid()); >+ clear(); > > for (const gl::ShaderType shaderType : gl::AllShaderTypes()) > { >@@ -149,7 +149,14 @@ angle::Result ShaderInfo::initShaders(const gl::ShaderBitSet &linkedShaderStages > return angle::Result::Continue; > } > >-void ShaderInfo::release(ContextVk *contextVk) >+void ShaderInfo::initShaderFromProgram(gl::ShaderType shaderType, >+ const ShaderInfo &programShaderInfo) >+{ >+ mSpirvBlobs[shaderType] = programShaderInfo.mSpirvBlobs[shaderType]; >+ mIsInitialized = true; >+} >+ >+void ShaderInfo::clear() > { > for (angle::spirv::Blob &spirvBlob : mSpirvBlobs) > { >@@ -160,6 +167,8 @@ void ShaderInfo::release(ContextVk *contextVk) > > void ShaderInfo::load(gl::BinaryInputStream *stream) > { >+ clear(); >+ > // Read in shader codes for all shader types > for (const gl::ShaderType shaderType : gl::AllShaderTypes()) > { >@@ -251,11 +260,15 @@ ProgramExecutableVk::ProgramExecutableVk() > mNumDefaultUniformDescriptors(0), > mImmutableSamplersMaxDescriptorCount(1), > mUniformBufferDescriptorType(VK_DESCRIPTOR_TYPE_MAX_ENUM), >- mProgram(nullptr), >- mProgramPipeline(nullptr), >+ mDynamicUniformDescriptorOffsets{}, > mPerfCounters{}, > mCumulativePerfCounters{} >-{} >+{ >+ for (std::shared_ptr<DefaultUniformBlock> &defaultBlock : mDefaultUniformBlocks) >+ { >+ defaultBlock = std::make_shared<DefaultUniformBlock>(); >+ } >+} > > ProgramExecutableVk::~ProgramExecutableVk() > { >@@ -305,7 +318,9 @@ void ProgramExecutableVk::reset(ContextVk *contextVk) > contextVk->onProgramExecutableReset(this); > } > >-std::unique_ptr<rx::LinkEvent> ProgramExecutableVk::load(gl::BinaryInputStream *stream) >+std::unique_ptr<rx::LinkEvent> ProgramExecutableVk::load(ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ gl::BinaryInputStream *stream) > { > clearVariableInfoMap(); > >@@ -340,7 +355,37 @@ std::unique_ptr<rx::LinkEvent> ProgramExecutableVk::load(gl::BinaryInputStream * > } > } > >- return std::make_unique<LinkEventDone>(angle::Result::Continue); >+ mOriginalShaderInfo.load(stream); >+ >+ // Deserializes the uniformLayout data of mDefaultUniformBlocks >+ for (gl::ShaderType shaderType : gl::AllShaderTypes()) >+ { >+ const size_t uniformCount = stream->readInt<size_t>(); >+ for (unsigned int uniformIndex = 0; uniformIndex < uniformCount; ++uniformIndex) >+ { >+ sh::BlockMemberInfo blockInfo; >+ gl::LoadBlockMemberInfo(stream, &blockInfo); >+ mDefaultUniformBlocks[shaderType]->uniformLayout.push_back(blockInfo); >+ } >+ } >+ >+ gl::ShaderMap<size_t> requiredBufferSize; >+ requiredBufferSize.fill(0); >+ // Deserializes required uniform block memory sizes >+ for (gl::ShaderType shaderType : gl::AllShaderTypes()) >+ { >+ requiredBufferSize[shaderType] = stream->readInt<size_t>(); >+ } >+ >+ // Initialize and resize the mDefaultUniformBlocks' memory >+ angle::Result status = resizeUniformBlockMemory(contextVk, glExecutable, requiredBufferSize); >+ if (status != angle::Result::Continue) >+ { >+ return std::make_unique<LinkEventDone>(status); >+ } >+ >+ status = createPipelineLayout(contextVk, glExecutable, nullptr); >+ return std::make_unique<LinkEventDone>(status); > } > > void ProgramExecutableVk::save(gl::BinaryOutputStream *stream) >@@ -375,57 +420,32 @@ void ProgramExecutableVk::save(gl::BinaryOutputStream *stream) > stream->writeBool(info.isDuplicate); > } > } >-} > >-void ProgramExecutableVk::clearVariableInfoMap() >-{ >- mVariableInfoMap.clear(); >-} >+ mOriginalShaderInfo.save(stream); > >-ProgramVk *ProgramExecutableVk::getShaderProgram(const gl::State &glState, >- gl::ShaderType shaderType) const >-{ >- if (mProgram) >+ // Serializes the uniformLayout data of mDefaultUniformBlocks >+ for (gl::ShaderType shaderType : gl::AllShaderTypes()) > { >- const gl::ProgramExecutable &glExecutable = mProgram->getState().getExecutable(); >- if (glExecutable.hasLinkedShaderStage(shaderType)) >+ const size_t uniformCount = mDefaultUniformBlocks[shaderType]->uniformLayout.size(); >+ stream->writeInt(uniformCount); >+ for (unsigned int uniformIndex = 0; uniformIndex < uniformCount; ++uniformIndex) > { >- return mProgram; >+ sh::BlockMemberInfo &blockInfo = >+ mDefaultUniformBlocks[shaderType]->uniformLayout[uniformIndex]; >+ gl::WriteBlockMemberInfo(stream, blockInfo); > } > } >- else if (mProgramPipeline) >- { >- return mProgramPipeline->getShaderProgram(shaderType); >- } > >- return nullptr; >-} >- >-// TODO: http://anglebug.com/3570: Move/Copy all of the necessary information into >-// the ProgramExecutable, so this function can be removed. >-void ProgramExecutableVk::fillProgramStateMap( >- const ContextVk *contextVk, >- gl::ShaderMap<const gl::ProgramState *> *programStatesOut) >-{ >- ASSERT(mProgram || mProgramPipeline); >- if (mProgram) >- { >- mProgram->fillProgramStateMap(programStatesOut); >- } >- else if (mProgramPipeline) >+ // Serializes required uniform block memory sizes >+ for (gl::ShaderType shaderType : gl::AllShaderTypes()) > { >- mProgramPipeline->fillProgramStateMap(programStatesOut); >+ stream->writeInt(mDefaultUniformBlocks[shaderType]->uniformData.size()); > } > } > >-const gl::ProgramExecutable &ProgramExecutableVk::getGlExecutable() >+void ProgramExecutableVk::clearVariableInfoMap() > { >- ASSERT(mProgram || mProgramPipeline); >- if (mProgram) >- { >- return mProgram->getState().getExecutable(); >- } >- return mProgramPipeline->getState().getExecutable(); >+ mVariableInfoMap.clear(); > } > > uint32_t GetInterfaceBlockArraySize(const std::vector<gl::InterfaceBlock> &blocks, >@@ -567,6 +587,11 @@ void ProgramExecutableVk::addAtomicCounterBufferDescriptorSetDesc( > > std::string blockName(sh::vk::kAtomicCountersBlockName); > >+ if (!mVariableInfoMap.contains(shaderType, blockName)) >+ { >+ return; >+ } >+ > const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName); > if (info.isDuplicate || !info.activeStages[shaderType]) > { >@@ -673,18 +698,18 @@ void ProgramExecutableVk::addInputAttachmentDescriptorSetDesc( > > void ProgramExecutableVk::addTextureDescriptorSetDesc( > ContextVk *contextVk, >- const gl::ProgramState &programState, >+ const gl::ProgramExecutable &executable, > const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures, > vk::DescriptorSetLayoutDesc *descOut) > { >- const std::vector<gl::SamplerBinding> &samplerBindings = programState.getSamplerBindings(); >- const std::vector<gl::LinkedUniform> &uniforms = programState.getUniforms(); >+ const std::vector<gl::SamplerBinding> &samplerBindings = executable.getSamplerBindings(); >+ const std::vector<gl::LinkedUniform> &uniforms = executable.getUniforms(); > > for (uint32_t textureIndex = 0; textureIndex < samplerBindings.size(); ++textureIndex) > { > const gl::SamplerBinding &samplerBinding = samplerBindings[textureIndex]; > >- uint32_t uniformIndex = programState.getUniformIndexFromSamplerIndex(textureIndex); >+ uint32_t uniformIndex = executable.getUniformIndexFromSamplerIndex(textureIndex); > const gl::LinkedUniform &samplerUniform = uniforms[uniformIndex]; > > const std::string samplerName = GlslangGetMappedSamplerName(samplerUniform.name); >@@ -705,7 +730,7 @@ void ProgramExecutableVk::addTextureDescriptorSetDesc( > arraySize *= outerArraySize; > } > >- for (const gl::ShaderType shaderType : programState.getExecutable().getLinkedShaderStages()) >+ for (const gl::ShaderType shaderType : executable.getLinkedShaderStages()) > { > if (!samplerUniform.isActive(shaderType)) > { >@@ -832,15 +857,16 @@ void WriteBufferDescriptorSetBinding(const vk::BufferHelper &buffer, > ASSERT(writeInfoOut->pBufferInfo[0].buffer != VK_NULL_HANDLE); > } > >-void ProgramExecutableVk::updateEarlyFragmentTestsOptimization(ContextVk *contextVk) >+void ProgramExecutableVk::updateEarlyFragmentTestsOptimization( >+ ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable) > { > const gl::State &glState = contextVk->getState(); > > mTransformOptions.removeEarlyFragmentTestsOptimization = false; > if (!glState.canEnableEarlyFragmentTestsOptimization()) > { >- ProgramVk *programVk = getShaderProgram(glState, gl::ShaderType::Fragment); >- if (programVk && programVk->getState().hasEarlyFragmentTestsOptimization()) >+ if (glExecutable.usesEarlyFragmentTestsOptimization()) > { > mTransformOptions.removeEarlyFragmentTestsOptimization = true; > } >@@ -871,15 +897,14 @@ angle::Result ProgramExecutableVk::getGraphicsPipeline(ContextVk *contextVk, > const gl::ShaderBitSet linkedShaderStages = glExecutable->getLinkedShaderStages(); > const gl::ShaderType lastPreFragmentStage = gl::GetLastPreFragmentStage(linkedShaderStages); > >+ const bool isTransformFeedbackProgram = >+ !glExecutable->getLinkedTransformFeedbackVaryings().empty(); >+ > for (const gl::ShaderType shaderType : linkedShaderStages) > { >- ProgramVk *programVk = getShaderProgram(glState, shaderType); >- if (programVk) >- { >- ANGLE_TRY(programVk->initGraphicsShaderProgram( >- contextVk, shaderType, shaderType == lastPreFragmentStage, mTransformOptions, >- &programInfo, mVariableInfoMap)); >- } >+ ANGLE_TRY(initGraphicsShaderProgram( >+ contextVk, shaderType, shaderType == lastPreFragmentStage, isTransformFeedbackProgram, >+ mTransformOptions, &programInfo, mVariableInfoMap)); > } > > vk::ShaderProgramHelper *shaderProgram = programInfo.getShaderProgram(); >@@ -919,12 +944,9 @@ angle::Result ProgramExecutableVk::getComputePipeline(ContextVk *contextVk, > const gl::ProgramExecutable *glExecutable = glState.getProgramExecutable(); > ASSERT(glExecutable && glExecutable->hasLinkedShaderStage(gl::ShaderType::Compute)); > >- ProgramVk *programVk = getShaderProgram(glState, gl::ShaderType::Compute); >- ASSERT(programVk); >- ProgramInfo &programInfo = getComputeProgramInfo(); >- ANGLE_TRY(programVk->initComputeProgram(contextVk, &programInfo, mVariableInfoMap)); >+ ANGLE_TRY(initComputeProgram(contextVk, &mComputeProgramInfo, mVariableInfoMap)); > >- vk::ShaderProgramHelper *shaderProgram = programInfo.getShaderProgram(); >+ vk::ShaderProgramHelper *shaderProgram = mComputeProgramInfo.getShaderProgram(); > ASSERT(shaderProgram); > return shaderProgram->getComputePipeline(contextVk, getPipelineLayout(), pipelineOut); > } >@@ -983,8 +1005,6 @@ angle::Result ProgramExecutableVk::createPipelineLayout( > { > gl::TransformFeedback *transformFeedback = contextVk->getState().getCurrentTransformFeedback(); > const gl::ShaderBitSet &linkedShaderStages = glExecutable.getLinkedShaderStages(); >- gl::ShaderMap<const gl::ProgramState *> programStates; >- fillProgramStateMap(contextVk, &programStates); > > reset(contextVk); > >@@ -1010,14 +1030,11 @@ angle::Result ProgramExecutableVk::createPipelineLayout( > } > > gl::ShaderType linkedTransformFeedbackStage = glExecutable.getLinkedTransformFeedbackStage(); >- bool hasXfbVaryings = >- linkedTransformFeedbackStage != gl::ShaderType::InvalidEnum && >- !programStates[linkedTransformFeedbackStage]->getLinkedTransformFeedbackVaryings().empty(); >+ bool hasXfbVaryings = linkedTransformFeedbackStage != gl::ShaderType::InvalidEnum && >+ !glExecutable.getLinkedTransformFeedbackVaryings().empty(); > if (transformFeedback && hasXfbVaryings) > { >- const gl::ProgramExecutable &executable = >- programStates[linkedTransformFeedbackStage]->getExecutable(); >- size_t xfbBufferCount = executable.getTransformFeedbackBufferCount(); >+ size_t xfbBufferCount = glExecutable.getTransformFeedbackBufferCount(); > TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback); > transformFeedbackVk->updateDescriptorSetLayout(contextVk, mVariableInfoMap, xfbBufferCount, > &uniformsAndXfbSetDesc); >@@ -1034,10 +1051,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( > uint32_t numActiveUniformBufferDescriptors = 0; > for (const gl::ShaderType shaderType : linkedShaderStages) > { >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >- >- const std::vector<gl::InterfaceBlock> &blocks = programState->getUniformBlocks(); >+ const std::vector<gl::InterfaceBlock> &blocks = glExecutable.getUniformBlocks(); > for (uint32_t bufferIndex = 0; bufferIndex < blocks.size();) > { > const gl::InterfaceBlock &block = blocks[bufferIndex]; >@@ -1069,24 +1083,18 @@ angle::Result ProgramExecutableVk::createPipelineLayout( > > for (const gl::ShaderType shaderType : linkedShaderStages) > { >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >- >- addInterfaceBlockDescriptorSetDesc(programState->getUniformBlocks(), shaderType, >+ addInterfaceBlockDescriptorSetDesc(glExecutable.getUniformBlocks(), shaderType, > mUniformBufferDescriptorType, &resourcesSetDesc); >- addInterfaceBlockDescriptorSetDesc(programState->getShaderStorageBlocks(), shaderType, >+ addInterfaceBlockDescriptorSetDesc(glExecutable.getShaderStorageBlocks(), shaderType, > kStorageBufferDescriptorType, &resourcesSetDesc); >- addAtomicCounterBufferDescriptorSetDesc(programState->getAtomicCounterBuffers(), shaderType, >+ addAtomicCounterBufferDescriptorSetDesc(glExecutable.getAtomicCounterBuffers(), shaderType, > &resourcesSetDesc); > } > > for (const gl::ShaderType shaderType : linkedShaderStages) > { >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >- addImageDescriptorSetDesc(programState->getExecutable(), &resourcesSetDesc); >- addInputAttachmentDescriptorSetDesc(programState->getExecutable(), shaderType, >- &resourcesSetDesc); >+ addImageDescriptorSetDesc(glExecutable, &resourcesSetDesc); >+ addInputAttachmentDescriptorSetDesc(glExecutable, shaderType, &resourcesSetDesc); > } > > ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( >@@ -1094,13 +1102,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( > > // Textures: > vk::DescriptorSetLayoutDesc texturesSetDesc; >- >- for (const gl::ShaderType shaderType : linkedShaderStages) >- { >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >- addTextureDescriptorSetDesc(contextVk, *programState, activeTextures, &texturesSetDesc); >- } >+ addTextureDescriptorSetDesc(contextVk, glExecutable, activeTextures, &texturesSetDesc); > > ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( > contextVk, texturesSetDesc, &mDescriptorSetLayouts[DescriptorSetIndex::Texture])); >@@ -1336,14 +1338,14 @@ angle::Result ProgramExecutableVk::updateBuffersDescriptorSet( > > angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( > ContextVk *contextVk, >- const gl::ProgramState &programState, >+ const gl::ProgramExecutable &executable, > const gl::ShaderType shaderType, > const vk::ShaderBuffersDescriptorDesc &shaderBuffersDesc, > bool cacheHit) > { > const gl::State &glState = contextVk->getState(); > const std::vector<gl::AtomicCounterBuffer> &atomicCounterBuffers = >- programState.getAtomicCounterBuffers(); >+ executable.getAtomicCounterBuffers(); > > if (atomicCounterBuffers.empty() || cacheHit) > { >@@ -1351,6 +1353,12 @@ angle::Result ProgramExecutableVk::updateAtomicCounterBuffersDescriptorSet( > } > > std::string blockName(sh::vk::kAtomicCountersBlockName); >+ >+ if (!mVariableInfoMap.contains(shaderType, blockName)) >+ { >+ return angle::Result::Continue; >+ } >+ > const ShaderInterfaceVariableInfo &info = mVariableInfoMap.get(shaderType, blockName); > if (info.isDuplicate || !info.activeStages[shaderType]) > { >@@ -1467,7 +1475,7 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( > // Texture buffers use buffer views, so they are especially handled. > if (imageBinding.textureType == gl::TextureType::Buffer) > { >- // Handle format reinterpration by looking for a view with the format specified in >+ // Handle format reinterpretation by looking for a view with the format specified in > // the shader (if any, instead of the format specified to glTexBuffer). > const vk::Format *format = nullptr; > if (imageUniform.imageUnitFormat != GL_NONE) >@@ -1551,8 +1559,7 @@ angle::Result ProgramExecutableVk::updateImagesDescriptorSet( > angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet( > ContextVk *contextVk, > FramebufferVk *framebufferVk, >- const vk::ShaderBuffersDescriptorDesc &shaderBuffersDesc, >- vk::CommandBufferHelper *commandBufferHelper) >+ const vk::ShaderBuffersDescriptorDesc &shaderBuffersDesc) > { > const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable(); > ASSERT(executable); >@@ -1577,25 +1584,19 @@ angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet( > > bool cacheHit = mDescriptorSets[DescriptorSetIndex::ShaderResource] != VK_NULL_HANDLE; > >- gl::ShaderMap<const gl::ProgramState *> programStates; >- fillProgramStateMap(contextVk, &programStates); >- > for (const gl::ShaderType shaderType : executable->getLinkedShaderStages()) > { >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >- > ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, shaderBuffersDesc, >- programState->getUniformBlocks(), >+ executable->getUniformBlocks(), > mUniformBufferDescriptorType, cacheHit)); > ANGLE_TRY(updateBuffersDescriptorSet(contextVk, shaderType, shaderBuffersDesc, >- programState->getShaderStorageBlocks(), >+ executable->getShaderStorageBlocks(), > kStorageBufferDescriptorType, cacheHit)); >- ANGLE_TRY(updateAtomicCounterBuffersDescriptorSet(contextVk, *programState, shaderType, >+ ANGLE_TRY(updateAtomicCounterBuffersDescriptorSet(contextVk, *executable, shaderType, > shaderBuffersDesc, cacheHit)); >- ANGLE_TRY(updateImagesDescriptorSet(contextVk, programState->getExecutable(), shaderType)); >- ANGLE_TRY(updateInputAttachmentDescriptorSet(programState->getExecutable(), shaderType, >- contextVk, framebufferVk)); >+ ANGLE_TRY(updateImagesDescriptorSet(contextVk, *executable, shaderType)); >+ ANGLE_TRY( >+ updateInputAttachmentDescriptorSet(*executable, shaderType, contextVk, framebufferVk)); > } > > return angle::Result::Continue; >@@ -1663,13 +1664,11 @@ angle::Result ProgramExecutableVk::updateInputAttachmentDescriptorSet( > } > > angle::Result ProgramExecutableVk::updateTransformFeedbackDescriptorSet( >- const gl::ProgramState &programState, >- gl::ShaderMap<DefaultUniformBlock> &defaultUniformBlocks, >- vk::BufferHelper *defaultUniformBuffer, > ContextVk *contextVk, >+ const gl::ProgramExecutable &executable, >+ vk::BufferHelper *defaultUniformBuffer, > const vk::UniformsAndXfbDescriptorDesc &xfbBufferDesc) > { >- const gl::ProgramExecutable &executable = programState.getExecutable(); > ASSERT(executable.hasTransformFeedbackOutput()); > > bool newDescriptorSetAllocated; >@@ -1680,22 +1679,21 @@ angle::Result ProgramExecutableVk::updateTransformFeedbackDescriptorSet( > { > for (const gl::ShaderType shaderType : executable.getLinkedShaderStages()) > { >- updateDefaultUniformsDescriptorSet(shaderType, defaultUniformBlocks[shaderType], >+ updateDefaultUniformsDescriptorSet(shaderType, *mDefaultUniformBlocks[shaderType], > defaultUniformBuffer, contextVk); > } >- updateTransformFeedbackDescriptorSetImpl(programState, contextVk); >+ updateTransformFeedbackDescriptorSetImpl(contextVk, executable); > } > > return angle::Result::Continue; > } > > void ProgramExecutableVk::updateTransformFeedbackDescriptorSetImpl( >- const gl::ProgramState &programState, >- ContextVk *contextVk) >+ ContextVk *contextVk, >+ const gl::ProgramExecutable &executable) > { > const gl::State &glState = contextVk->getState(); > gl::TransformFeedback *transformFeedback = glState.getCurrentTransformFeedback(); >- const gl::ProgramExecutable &executable = programState.getExecutable(); > > if (!executable.hasTransformFeedbackOutput()) > { >@@ -1718,7 +1716,7 @@ void ProgramExecutableVk::updateTransformFeedbackDescriptorSetImpl( > } > > TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(glState.getCurrentTransformFeedback()); >- transformFeedbackVk->updateDescriptorSet(contextVk, programState, mVariableInfoMap, >+ transformFeedbackVk->updateDescriptorSet(contextVk, executable, mVariableInfoMap, > mDescriptorSets[DescriptorSetIndex::UniformsAndXfb]); > } > >@@ -1748,21 +1746,16 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet( > const gl::ActiveTextureArray<vk::TextureUnit> &activeTextures = contextVk->getActiveTextures(); > bool emulateSeamfulCubeMapSampling = contextVk->emulateSeamfulCubeMapSampling(); > >- gl::ShaderMap<const gl::ProgramState *> programStates; >- fillProgramStateMap(contextVk, &programStates); >- > for (const gl::ShaderType shaderType : executable->getLinkedShaderStages()) > { > angle::HashMap<std::string, uint32_t> mappedSamplerNameToArrayOffset; >- const gl::ProgramState *programState = programStates[shaderType]; >- ASSERT(programState); >- for (uint32_t textureIndex = 0; textureIndex < programState->getSamplerBindings().size(); >+ for (uint32_t textureIndex = 0; textureIndex < executable->getSamplerBindings().size(); > ++textureIndex) > { > const gl::SamplerBinding &samplerBinding = >- programState->getSamplerBindings()[textureIndex]; >- uint32_t uniformIndex = programState->getUniformIndexFromSamplerIndex(textureIndex); >- const gl::LinkedUniform &samplerUniform = programState->getUniforms()[uniformIndex]; >+ executable->getSamplerBindings()[textureIndex]; >+ uint32_t uniformIndex = executable->getUniformIndexFromSamplerIndex(textureIndex); >+ const gl::LinkedUniform &samplerUniform = executable->getUniforms()[uniformIndex]; > std::string mappedSamplerName = GlslangGetMappedSamplerName(samplerUniform.name); > > if (!samplerUniform.isActive(shaderType)) >@@ -1841,6 +1834,8 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet( > TextureVk *textureVk = unit.texture; > const vk::SamplerHelper &samplerHelper = *unit.sampler; > >+ ASSERT(textureVk); >+ > vk::ImageHelper &image = textureVk->getImage(); > > imageInfos[arrayElement].sampler = samplerHelper.get().getHandle(); >@@ -1884,8 +1879,9 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet( > return angle::Result::Continue; > } > >+template <typename CommandBufferT> > angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk, >- vk::CommandBuffer *commandBuffer, >+ CommandBufferT *commandBuffer, > PipelineType pipelineType) > { > // Can probably use better dirty bits here. >@@ -1970,6 +1966,15 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk, > return angle::Result::Continue; > } > >+template angle::Result ProgramExecutableVk::updateDescriptorSets<vk::priv::SecondaryCommandBuffer>( >+ ContextVk *contextVk, >+ vk::priv::SecondaryCommandBuffer *commandBuffer, >+ PipelineType pipelineType); >+template angle::Result ProgramExecutableVk::updateDescriptorSets<vk::VulkanSecondaryCommandBuffer>( >+ ContextVk *contextVk, >+ vk::VulkanSecondaryCommandBuffer *commandBuffer, >+ PipelineType pipelineType); >+ > // Requires that trace is enabled to see the output, which is supported with is_debug=true > void ProgramExecutableVk::outputCumulativePerfCounters() > { >@@ -2034,4 +2039,160 @@ void ProgramExecutableVk::accumulateCacheStats(VulkanCacheType cacheType, > mPerfCounters.descriptorSetCacheMisses[dsIndex] += > static_cast<uint32_t>(cacheStats.getMissCount()); > } >+ >+void ProgramExecutableVk::setAllDefaultUniformsDirty(const gl::ProgramExecutable &executable) >+{ >+ mDefaultUniformBlocksDirty.reset(); >+ for (gl::ShaderType shaderType : executable.getLinkedShaderStages()) >+ { >+ if (!mDefaultUniformBlocks[shaderType]->uniformData.empty()) >+ { >+ mDefaultUniformBlocksDirty.set(shaderType); >+ } >+ } >+} >+ >+angle::Result ProgramExecutableVk::updateUniforms(ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ vk::DynamicBuffer *defaultUniformStorage) >+{ >+ ASSERT(hasDirtyUniforms()); >+ >+ uint8_t *bufferData = nullptr; >+ VkDeviceSize bufferOffset = 0; >+ uint32_t offsetIndex = 0; >+ bool anyNewBufferAllocated = false; >+ gl::ShaderMap<VkDeviceSize> offsets = {}; // offset to the beginning of bufferData >+ size_t requiredSpace; >+ >+ // We usually only update uniform data for shader stages that are actually dirty. But when the >+ // buffer for uniform data have switched, because all shader stages are using the same buffer, >+ // we then must update uniform data for all shader stages to keep all shader stages' uniform >+ // data in the same buffer. >+ requiredSpace = calcUniformUpdateRequiredSpace(contextVk, glExecutable, &offsets); >+ ASSERT(requiredSpace > 0); >+ >+ // Allocate space from dynamicBuffer. Always try to allocate from the current buffer first. >+ // If that failed, we deal with fall out and try again. >+ if (!defaultUniformStorage->allocateFromCurrentBuffer(requiredSpace, &bufferData, >+ &bufferOffset)) >+ { >+ setAllDefaultUniformsDirty(glExecutable); >+ >+ requiredSpace = calcUniformUpdateRequiredSpace(contextVk, glExecutable, &offsets); >+ ANGLE_TRY(defaultUniformStorage->allocate(contextVk, requiredSpace, &bufferData, nullptr, >+ &bufferOffset, &anyNewBufferAllocated)); >+ } >+ >+ for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >+ { >+ if (mDefaultUniformBlocksDirty[shaderType]) >+ { >+ const angle::MemoryBuffer &uniformData = mDefaultUniformBlocks[shaderType]->uniformData; >+ memcpy(&bufferData[offsets[shaderType]], uniformData.data(), uniformData.size()); >+ mDynamicUniformDescriptorOffsets[offsetIndex] = >+ static_cast<uint32_t>(bufferOffset + offsets[shaderType]); >+ mDefaultUniformBlocksDirty.reset(shaderType); >+ } >+ ++offsetIndex; >+ } >+ ANGLE_TRY(defaultUniformStorage->flush(contextVk)); >+ >+ // Because the uniform buffers are per context, we can't rely on dynamicBuffer's allocate >+ // function to tell us if you have got a new buffer or not. Other program's use of the buffer >+ // might already pushed dynamicBuffer to a new buffer. We record which buffer (represented by >+ // the unique BufferSerial number) we were using with the current descriptor set and then we >+ // use that recorded BufferSerial compare to the current uniform buffer to quickly detect if >+ // there is a buffer switch or not. We need to retrieve from the descriptor set cache or >+ // allocate a new descriptor set whenever there is uniform buffer switch. >+ vk::BufferHelper *defaultUniformBuffer = defaultUniformStorage->getCurrentBuffer(); >+ if (mCurrentDefaultUniformBufferSerial != defaultUniformBuffer->getBufferSerial()) >+ { >+ // We need to reinitialize the descriptor sets if we newly allocated buffers since we can't >+ // modify the descriptor sets once initialized. >+ vk::UniformsAndXfbDescriptorDesc defaultUniformsDesc; >+ vk::UniformsAndXfbDescriptorDesc *uniformsAndXfbBufferDesc; >+ >+ if (glExecutable.hasTransformFeedbackOutput()) >+ { >+ TransformFeedbackVk *transformFeedbackVk = >+ vk::GetImpl(contextVk->getState().getCurrentTransformFeedback()); >+ uniformsAndXfbBufferDesc = &transformFeedbackVk->getTransformFeedbackDesc(); >+ uniformsAndXfbBufferDesc->updateDefaultUniformBuffer( >+ defaultUniformBuffer->getBufferSerial()); >+ } >+ else >+ { >+ defaultUniformsDesc.updateDefaultUniformBuffer(defaultUniformBuffer->getBufferSerial()); >+ uniformsAndXfbBufferDesc = &defaultUniformsDesc; >+ } >+ >+ bool newDescriptorSetAllocated; >+ ANGLE_TRY(allocUniformAndXfbDescriptorSet(contextVk, *uniformsAndXfbBufferDesc, >+ &newDescriptorSetAllocated)); >+ >+ if (newDescriptorSetAllocated) >+ { >+ for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >+ { >+ updateDefaultUniformsDescriptorSet(shaderType, *mDefaultUniformBlocks[shaderType], >+ defaultUniformBuffer, contextVk); >+ updateTransformFeedbackDescriptorSetImpl(contextVk, glExecutable); >+ } >+ } >+ } >+ >+ return angle::Result::Continue; >+} >+ >+size_t ProgramExecutableVk::calcUniformUpdateRequiredSpace( >+ ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ gl::ShaderMap<VkDeviceSize> *uniformOffsets) const >+{ >+ size_t requiredSpace = 0; >+ for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >+ { >+ if (mDefaultUniformBlocksDirty[shaderType]) >+ { >+ (*uniformOffsets)[shaderType] = requiredSpace; >+ requiredSpace += getDefaultUniformAlignedSize(contextVk, shaderType); >+ } >+ } >+ return requiredSpace; >+} >+ >+void ProgramExecutableVk::onProgramBind(const gl::ProgramExecutable &glExecutable) >+{ >+ // Because all programs share default uniform buffers, when we switch programs, we have to >+ // re-update all uniform data. We could do more tracking to avoid update if the context's >+ // current uniform buffer is still the same buffer we last time used and buffer has not been >+ // recycled. But statistics gathered on gfxbench shows that app always update uniform data on >+ // program bind anyway, so not really worth it to add more tracking logic here. >+ setAllDefaultUniformsDirty(glExecutable); >+} >+ >+angle::Result ProgramExecutableVk::resizeUniformBlockMemory( >+ ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ const gl::ShaderMap<size_t> &requiredBufferSize) >+{ >+ for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >+ { >+ if (requiredBufferSize[shaderType] > 0) >+ { >+ if (!mDefaultUniformBlocks[shaderType]->uniformData.resize( >+ requiredBufferSize[shaderType])) >+ { >+ ANGLE_VK_CHECK(contextVk, false, VK_ERROR_OUT_OF_HOST_MEMORY); >+ } >+ >+ // Initialize uniform buffer memory to zero by default. >+ mDefaultUniformBlocks[shaderType]->uniformData.fill(0); >+ mDefaultUniformBlocksDirty.set(shaderType); >+ } >+ } >+ >+ return angle::Result::Continue; >+} > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h >index 398150ede58605dbc36a2da2dd8611a1d6082dcf..5af548f092beac529532a13c4afd2014adbde832 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramExecutableVk.h >@@ -15,6 +15,7 @@ > #include "common/utilities.h" > #include "libANGLE/Context.h" > #include "libANGLE/InfoLog.h" >+#include "libANGLE/renderer/ShaderInterfaceVariableInfoMap.h" > #include "libANGLE/renderer/glslang_wrapper_utils.h" > #include "libANGLE/renderer/vulkan/ContextVk.h" > #include "libANGLE/renderer/vulkan/vk_cache_utils.h" >@@ -32,7 +33,8 @@ class ShaderInfo final : angle::NonCopyable > angle::Result initShaders(const gl::ShaderBitSet &linkedShaderStages, > const gl::ShaderMap<const angle::spirv::Blob *> &spirvBlobs, > const ShaderInterfaceVariableInfoMap &variableInfoMap); >- void release(ContextVk *contextVk); >+ void initShaderFromProgram(gl::ShaderType shaderType, const ShaderInfo &programShaderInfo); >+ void clear(); > > ANGLE_INLINE bool valid() const { return mIsInitialized; } > >@@ -112,6 +114,8 @@ struct ProgramExecutablePerfCounters > DescriptorSetCountList descriptorSetCacheMisses; > }; > >+using DefaultUniformBlockMap = gl::ShaderMap<std::shared_ptr<DefaultUniformBlock>>; >+ > class ProgramExecutableVk > { > public: >@@ -121,16 +125,12 @@ class ProgramExecutableVk > void reset(ContextVk *contextVk); > > void save(gl::BinaryOutputStream *stream); >- std::unique_ptr<rx::LinkEvent> load(gl::BinaryInputStream *stream); >+ std::unique_ptr<rx::LinkEvent> load(ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ gl::BinaryInputStream *stream); > > void clearVariableInfoMap(); > >- ProgramVk *getShaderProgram(const gl::State &glState, gl::ShaderType shaderType) const; >- >- void fillProgramStateMap(const ContextVk *contextVk, >- gl::ShaderMap<const gl::ProgramState *> *programStatesOut); >- const gl::ProgramExecutable &getGlExecutable(); >- > ProgramInfo &getGraphicsDefaultProgramInfo() { return mGraphicsProgramInfos[0]; } > ProgramInfo &getGraphicsProgramInfo(ProgramTransformOptions option) > { >@@ -161,35 +161,24 @@ class ProgramExecutableVk > angle::Result updateShaderResourcesDescriptorSet( > ContextVk *contextVk, > FramebufferVk *framebufferVk, >- const vk::ShaderBuffersDescriptorDesc &shaderBuffersDesc, >- vk::CommandBufferHelper *commandBufferHelper); >+ const vk::ShaderBuffersDescriptorDesc &shaderBuffersDesc); > angle::Result updateTransformFeedbackDescriptorSet( >- const gl::ProgramState &programState, >- gl::ShaderMap<DefaultUniformBlock> &defaultUniformBlocks, >- vk::BufferHelper *defaultUniformBuffer, > ContextVk *contextVk, >+ const gl::ProgramExecutable &executable, >+ vk::BufferHelper *defaultUniformBuffer, > const vk::UniformsAndXfbDescriptorDesc &xfbBufferDesc); > angle::Result updateInputAttachmentDescriptorSet(const gl::ProgramExecutable &executable, > const gl::ShaderType shaderType, > ContextVk *contextVk, > FramebufferVk *framebufferVk); > >+ template <typename CommandBufferT> > angle::Result updateDescriptorSets(ContextVk *contextVk, >- vk::CommandBuffer *commandBuffer, >+ CommandBufferT *commandBuffer, > PipelineType pipelineType); > >- void updateEarlyFragmentTestsOptimization(ContextVk *contextVk); >- >- void setProgram(ProgramVk *program) >- { >- ASSERT(!mProgram && !mProgramPipeline); >- mProgram = program; >- } >- void setProgramPipeline(ProgramPipelineVk *pipeline) >- { >- ASSERT(!mProgram && !mProgramPipeline); >- mProgramPipeline = pipeline; >- } >+ void updateEarlyFragmentTestsOptimization(ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable); > > bool usesDynamicUniformBufferDescriptors() const > { >@@ -207,6 +196,27 @@ class ProgramExecutableVk > void accumulateCacheStats(VulkanCacheType cacheType, const CacheStats &cacheStats); > ProgramExecutablePerfCounters getAndResetObjectPerfCounters(); > >+ size_t getDefaultUniformAlignedSize(vk::Context *context, const gl::ShaderType shaderType) const >+ { >+ RendererVk *renderer = context->getRenderer(); >+ size_t alignment = static_cast<size_t>( >+ renderer->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment); >+ return roundUp(mDefaultUniformBlocks[shaderType]->uniformData.size(), alignment); >+ } >+ >+ std::shared_ptr<DefaultUniformBlock> &getSharedDefaultUniformBlock(gl::ShaderType shaderType) >+ { >+ return mDefaultUniformBlocks[shaderType]; >+ } >+ >+ bool hasDirtyUniforms() const { return mDefaultUniformBlocksDirty.any(); } >+ >+ void setAllDefaultUniformsDirty(const gl::ProgramExecutable &executable); >+ angle::Result updateUniforms(ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ vk::DynamicBuffer *defaultUniformStorage); >+ void onProgramBind(const gl::ProgramExecutable &glExecutable); >+ > private: > friend class ProgramVk; > friend class ProgramPipelineVk; >@@ -235,7 +245,7 @@ class ProgramExecutableVk > const gl::ShaderType shaderType, > vk::DescriptorSetLayoutDesc *descOut); > void addTextureDescriptorSetDesc(ContextVk *contextVk, >- const gl::ProgramState &programState, >+ const gl::ProgramExecutable &executable, > const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures, > vk::DescriptorSetLayoutDesc *descOut); > >@@ -244,8 +254,8 @@ class ProgramExecutableVk > const DefaultUniformBlock &defaultUniformBlock, > vk::BufferHelper *defaultUniformBuffer, > ContextVk *contextVk); >- void updateTransformFeedbackDescriptorSetImpl(const gl::ProgramState &programState, >- ContextVk *contextVk); >+ void updateTransformFeedbackDescriptorSetImpl(ContextVk *contextVk, >+ const gl::ProgramExecutable &executable); > angle::Result getOrAllocateShaderResourcesDescriptorSet( > ContextVk *contextVk, > const vk::ShaderBuffersDescriptorDesc *shaderBuffersDesc, >@@ -259,7 +269,7 @@ class ProgramExecutableVk > bool cacheHit); > angle::Result updateAtomicCounterBuffersDescriptorSet( > ContextVk *contextVk, >- const gl::ProgramState &programState, >+ const gl::ProgramExecutable &executable, > const gl::ShaderType shaderType, > const vk::ShaderBuffersDescriptorDesc &shaderBuffersDesc, > bool cacheHit); >@@ -273,6 +283,60 @@ class ProgramExecutableVk > > void outputCumulativePerfCounters(); > >+ size_t calcUniformUpdateRequiredSpace(ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ gl::ShaderMap<VkDeviceSize> *uniformOffsets) const; >+ >+ ANGLE_INLINE angle::Result initProgram(ContextVk *contextVk, >+ const gl::ShaderType shaderType, >+ bool isLastPreFragmentStage, >+ bool isTransformFeedbackProgram, >+ ProgramTransformOptions optionBits, >+ ProgramInfo *programInfo, >+ const ShaderInterfaceVariableInfoMap &variableInfoMap) >+ { >+ ASSERT(mOriginalShaderInfo.valid()); >+ >+ // Create the program pipeline. This is done lazily and once per combination of >+ // specialization constants. >+ if (!programInfo->valid(shaderType)) >+ { >+ ANGLE_TRY(programInfo->initProgram(contextVk, shaderType, isLastPreFragmentStage, >+ isTransformFeedbackProgram, mOriginalShaderInfo, >+ optionBits, variableInfoMap)); >+ } >+ ASSERT(programInfo->valid(shaderType)); >+ >+ return angle::Result::Continue; >+ } >+ >+ ANGLE_INLINE angle::Result initGraphicsShaderProgram( >+ ContextVk *contextVk, >+ const gl::ShaderType shaderType, >+ bool isLastPreFragmentStage, >+ bool isTransformFeedbackProgram, >+ ProgramTransformOptions optionBits, >+ ProgramInfo *programInfo, >+ const ShaderInterfaceVariableInfoMap &variableInfoMap) >+ { >+ return initProgram(contextVk, shaderType, isLastPreFragmentStage, >+ isTransformFeedbackProgram, optionBits, programInfo, variableInfoMap); >+ } >+ >+ ANGLE_INLINE angle::Result initComputeProgram( >+ ContextVk *contextVk, >+ ProgramInfo *programInfo, >+ const ShaderInterfaceVariableInfoMap &variableInfoMap) >+ { >+ ProgramTransformOptions optionBits = {}; >+ return initProgram(contextVk, gl::ShaderType::Compute, false, false, optionBits, >+ programInfo, variableInfoMap); >+ } >+ >+ angle::Result resizeUniformBlockMemory(ContextVk *contextVk, >+ const gl::ProgramExecutable &glExecutable, >+ const gl::ShaderMap<size_t> &requiredBufferSize); >+ > // Descriptor sets for uniform blocks and textures for this program. > vk::DescriptorSetArray<VkDescriptorSet> mDescriptorSets; > vk::DescriptorSetArray<VkDescriptorSet> mEmptyDescriptorSets; >@@ -318,8 +382,10 @@ class ProgramExecutableVk > > ProgramTransformOptions mTransformOptions; > >- ProgramVk *mProgram; >- ProgramPipelineVk *mProgramPipeline; >+ DefaultUniformBlockMap mDefaultUniformBlocks; >+ gl::ShaderBitSet mDefaultUniformBlocksDirty; >+ >+ ShaderInfo mOriginalShaderInfo; > > ProgramExecutablePerfCounters mPerfCounters; > ProgramExecutablePerfCounters mCumulativePerfCounters; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp >index 65ff25a0318a5c063ae711752a7c483e05577c0d..446c051f189f427d5d078910ec080fb6adf05e27 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp >@@ -17,9 +17,7 @@ namespace rx > > ProgramPipelineVk::ProgramPipelineVk(const gl::ProgramPipelineState &state) > : ProgramPipelineImpl(state) >-{ >- mExecutable.setProgramPipeline(this); >-} >+{} > > ProgramPipelineVk::~ProgramPipelineVk() {} > >@@ -34,23 +32,6 @@ void ProgramPipelineVk::reset(ContextVk *contextVk) > mExecutable.reset(contextVk); > } > >-// TODO: http://anglebug.com/3570: Move/Copy all of the necessary information into >-// the ProgramExecutable, so this function can be removed. >-void ProgramPipelineVk::fillProgramStateMap( >- gl::ShaderMap<const gl::ProgramState *> *programStatesOut) >-{ >- for (gl::ShaderType shaderType : gl::AllShaderTypes()) >- { >- (*programStatesOut)[shaderType] = nullptr; >- >- ProgramVk *programVk = getShaderProgram(shaderType); >- if (programVk) >- { >- (*programStatesOut)[shaderType] = &programVk->getState(); >- } >- } >-} >- > angle::Result ProgramPipelineVk::link(const gl::Context *glContext, > const gl::ProgramMergedVaryings &mergedVaryings, > const gl::ProgramVaryingPacking &varyingPacking) >@@ -89,6 +70,8 @@ angle::Result ProgramPipelineVk::link(const gl::Context *glContext, > } > } > >+ mExecutable.mOriginalShaderInfo.clear(); >+ > gl::ShaderType frontShaderType = gl::ShaderType::InvalidEnum; > UniformBindingIndexMap uniformBindingIndexMap; > for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >@@ -105,162 +88,29 @@ angle::Result ProgramPipelineVk::link(const gl::Context *glContext, > &glslangProgramInterfaceInfo, &uniformBindingIndexMap, > &mExecutable.mVariableInfoMap); > frontShaderType = shaderType; >- } >- } >- >- if (contextVk->getFeatures().enablePrecisionQualifiers.enabled) >- { >- mExecutable.resolvePrecisionMismatch(mergedVaryings); >- } >- >- return mExecutable.createPipelineLayout(contextVk, mState.getExecutable(), nullptr); >-} >- >-size_t ProgramPipelineVk::calcUniformUpdateRequiredSpace( >- ContextVk *contextVk, >- gl::ShaderMap<VkDeviceSize> *uniformOffsets) const >-{ >- size_t requiredSpace = 0; >- for (const gl::ShaderType shaderType : mState.getExecutable().getLinkedShaderStages()) >- { >- ProgramVk *programVk = getShaderProgram(shaderType); >- ASSERT(programVk); >- if (programVk->isShaderUniformDirty(shaderType)) >- { >- (*uniformOffsets)[shaderType] = requiredSpace; >- requiredSpace += programVk->getDefaultUniformAlignedSize(contextVk, shaderType); >- } >- } >- return requiredSpace; >-} >- >-angle::Result ProgramPipelineVk::updateUniforms(ContextVk *contextVk) >-{ >- const gl::ProgramExecutable &glExecutable = mState.getExecutable(); >- vk::DynamicBuffer *defaultUniformStorage = contextVk->getDefaultUniformStorage(); >- uint8_t *bufferData = nullptr; >- VkDeviceSize bufferOffset = 0; >- uint32_t offsetIndex = 0; >- bool anyNewBufferAllocated = false; >- gl::ShaderMap<VkDeviceSize> offsets; // offset to the beginning of bufferData >- size_t requiredSpace; >- >- // We usually only update uniform data for shader stages that are actually dirty. But when the >- // buffer for uniform data have switched, because all shader stages are using the same buffer, >- // we then must update uniform data for all shader stages to keep all shader stages' uniform >- // data in the same buffer. >- requiredSpace = calcUniformUpdateRequiredSpace(contextVk, &offsets); >- ASSERT(requiredSpace > 0); >- >- // Allocate space from dynamicBuffer. Always try to allocate from the current buffer first. >- // If that failed, we deal with fall out and try again. >- if (!defaultUniformStorage->allocateFromCurrentBuffer(requiredSpace, &bufferData, >- &bufferOffset)) >- { >- setAllDefaultUniformsDirty(); > >- requiredSpace = calcUniformUpdateRequiredSpace(contextVk, &offsets); >- ANGLE_TRY(defaultUniformStorage->allocate(contextVk, requiredSpace, &bufferData, nullptr, >- &bufferOffset, &anyNewBufferAllocated)); >- } >- >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- ProgramVk *programVk = getShaderProgram(shaderType); >- ASSERT(programVk); >- if (programVk->isShaderUniformDirty(shaderType)) >- { >- const angle::MemoryBuffer &uniformData = >- programVk->getDefaultUniformBlocks()[shaderType].uniformData; >- memcpy(&bufferData[offsets[shaderType]], uniformData.data(), uniformData.size()); >- mExecutable.mDynamicUniformDescriptorOffsets[offsetIndex] = >- static_cast<uint32_t>(bufferOffset + offsets[shaderType]); >- programVk->clearShaderUniformDirtyBit(shaderType); >- } >- ++offsetIndex; >- } >- ANGLE_TRY(defaultUniformStorage->flush(contextVk)); >- >- // Because the uniform buffers are per context, we can't rely on dynamicBuffer's allocate >- // function to tell us if you have got a new buffer or not. Other program's use of the buffer >- // might already pushed dynamicBuffer to a new buffer. We record which buffer (represented by >- // the unique BufferSerial number) we were using with the current descriptor set and then we >- // use that recorded BufferSerial compare to the current uniform buffer to quickly detect if >- // there is a buffer switch or not. We need to retrieve from the descriptor set cache or >- // allocate a new descriptor set whenever there is uniform buffer switch. >- vk::BufferHelper *defaultUniformBuffer = defaultUniformStorage->getCurrentBuffer(); >- if (mExecutable.getCurrentDefaultUniformBufferSerial() != >- defaultUniformBuffer->getBufferSerial()) >- { >- // We need to reinitialize the descriptor sets if we newly allocated buffers since we can't >- // modify the descriptor sets once initialized. >- vk::UniformsAndXfbDescriptorDesc defaultUniformsDesc; >- vk::UniformsAndXfbDescriptorDesc *uniformsAndXfbBufferDesc; >+ ProgramVk *programVk = vk::GetImpl(glProgram); >+ ProgramExecutableVk &programExecutableVk = programVk->getExecutable(); >+ mExecutable.mDefaultUniformBlocks[shaderType] = >+ programExecutableVk.getSharedDefaultUniformBlock(shaderType); > >- if (glExecutable.hasTransformFeedbackOutput()) >- { >- TransformFeedbackVk *transformFeedbackVk = >- vk::GetImpl(contextVk->getState().getCurrentTransformFeedback()); >- uniformsAndXfbBufferDesc = &transformFeedbackVk->getTransformFeedbackDesc(); >- uniformsAndXfbBufferDesc->updateDefaultUniformBuffer( >- defaultUniformBuffer->getBufferSerial()); >- } >- else >- { >- defaultUniformsDesc.updateDefaultUniformBuffer(defaultUniformBuffer->getBufferSerial()); >- uniformsAndXfbBufferDesc = &defaultUniformsDesc; >- } >- >- bool newDescriptorSetAllocated; >- ANGLE_TRY(mExecutable.allocUniformAndXfbDescriptorSet(contextVk, *uniformsAndXfbBufferDesc, >- &newDescriptorSetAllocated)); >- >- if (newDescriptorSetAllocated) >- { >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- ProgramVk *programVk = getShaderProgram(shaderType); >- mExecutable.updateDefaultUniformsDescriptorSet( >- shaderType, programVk->getDefaultUniformBlocks()[shaderType], >- defaultUniformBuffer, contextVk); >- mExecutable.updateTransformFeedbackDescriptorSetImpl(programVk->getState(), >- contextVk); >- } >+ mExecutable.mOriginalShaderInfo.initShaderFromProgram( >+ shaderType, programExecutableVk.mOriginalShaderInfo); > } > } > >- return angle::Result::Continue; >-} >+ mExecutable.setAllDefaultUniformsDirty(glExecutable); > >-bool ProgramPipelineVk::hasDirtyUniforms() const >-{ >- for (const gl::ShaderType shaderType : gl::AllShaderTypes()) >+ if (contextVk->getFeatures().enablePrecisionQualifiers.enabled) > { >- const ProgramVk *program = getShaderProgram(shaderType); >- if (program && program->hasDirtyUniforms()) >- { >- return true; >- } >+ mExecutable.resolvePrecisionMismatch(mergedVaryings); > } > >- return false; >-} >- >-void ProgramPipelineVk::setAllDefaultUniformsDirty() >-{ >- const gl::ProgramExecutable &glExecutable = mState.getExecutable(); >- >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- ProgramVk *programVk = getShaderProgram(shaderType); >- ASSERT(programVk); >- programVk->setShaderUniformDirtyBit(shaderType); >- } >+ return mExecutable.createPipelineLayout(contextVk, mState.getExecutable(), nullptr); > } > >-void ProgramPipelineVk::onProgramBind() >+void ProgramPipelineVk::onProgramUniformUpdate(gl::ShaderType shaderType) > { >- setAllDefaultUniformsDirty(); >+ mExecutable.mDefaultUniformBlocksDirty.set(shaderType); > } >- > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.h >index ab7239382249e2b97f9dc77422c69fbdf8c9952d..7975b35d7cc50b5b0dc142aaf77d13060a373898 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramPipelineVk.h >@@ -37,22 +37,13 @@ class ProgramPipelineVk : public ProgramPipelineImpl > return SafeGetImplAs<ProgramVk>(program); > } > >- void fillProgramStateMap(gl::ShaderMap<const gl::ProgramState *> *programStatesOut); >- > angle::Result link(const gl::Context *glContext, > const gl::ProgramMergedVaryings &mergedVaryings, > const gl::ProgramVaryingPacking &varyingPacking) override; > >- angle::Result updateUniforms(ContextVk *contextVk); >- >- void setAllDefaultUniformsDirty(); >- bool hasDirtyUniforms() const; >- void onProgramBind(); >+ void onProgramUniformUpdate(gl::ShaderType shaderType) override; > > private: >- size_t calcUniformUpdateRequiredSpace(ContextVk *contextVk, >- gl::ShaderMap<VkDeviceSize> *uniformOffsets) const; >- > ProgramExecutableVk mExecutable; > }; > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.cpp >index 0fc7d5ec0838ebe727b2318af18f9ffa52e38683..a57b4686c9ef1210d1437540f17925ded7308a4d 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.cpp >@@ -141,7 +141,6 @@ class Std140BlockLayoutEncoderFactory : public gl::CustomBlockLayoutEncoderFacto > ProgramVk::ProgramVk(const gl::ProgramState &state) : ProgramImpl(state) > { > GlslangWrapperVk::ResetGlslangProgramInterfaceInfo(&mGlslangProgramInterfaceInfo); >- mExecutable.setProgram(this); > } > > ProgramVk::~ProgramVk() = default; >@@ -154,8 +153,6 @@ void ProgramVk::destroy(const gl::Context *context) > > void ProgramVk::reset(ContextVk *contextVk) > { >- mOriginalShaderInfo.release(contextVk); >- > GlslangWrapperVk::ResetGlslangProgramInterfaceInfo(&mGlslangProgramInterfaceInfo); > > mExecutable.reset(contextVk); >@@ -166,66 +163,15 @@ std::unique_ptr<rx::LinkEvent> ProgramVk::load(const gl::Context *context, > gl::InfoLog &infoLog) > { > ContextVk *contextVk = vk::GetImpl(context); >- gl::ShaderMap<size_t> requiredBufferSize; >- requiredBufferSize.fill(0); > > reset(contextVk); > >- mOriginalShaderInfo.load(stream); >- mExecutable.load(stream); >- >- // Deserializes the uniformLayout data of mDefaultUniformBlocks >- for (gl::ShaderType shaderType : gl::AllShaderTypes()) >- { >- const size_t uniformCount = stream->readInt<size_t>(); >- for (unsigned int uniformIndex = 0; uniformIndex < uniformCount; ++uniformIndex) >- { >- sh::BlockMemberInfo blockInfo; >- gl::LoadBlockMemberInfo(stream, &blockInfo); >- mDefaultUniformBlocks[shaderType].uniformLayout.push_back(blockInfo); >- } >- } >- >- // Deserializes required uniform block memory sizes >- for (gl::ShaderType shaderType : gl::AllShaderTypes()) >- { >- requiredBufferSize[shaderType] = stream->readInt<size_t>(); >- } >- >- // Initialize and resize the mDefaultUniformBlocks' memory >- angle::Result status = resizeUniformBlockMemory(contextVk, requiredBufferSize); >- if (status != angle::Result::Continue) >- { >- return std::make_unique<LinkEventDone>(status); >- } >- >- status = mExecutable.createPipelineLayout(contextVk, mState.getExecutable(), nullptr); >- return std::make_unique<LinkEventDone>(status); >+ return mExecutable.load(contextVk, mState.getExecutable(), stream); > } > > void ProgramVk::save(const gl::Context *context, gl::BinaryOutputStream *stream) > { >- mOriginalShaderInfo.save(stream); > mExecutable.save(stream); >- >- // Serializes the uniformLayout data of mDefaultUniformBlocks >- for (gl::ShaderType shaderType : gl::AllShaderTypes()) >- { >- const size_t uniformCount = mDefaultUniformBlocks[shaderType].uniformLayout.size(); >- stream->writeInt(uniformCount); >- for (unsigned int uniformIndex = 0; uniformIndex < uniformCount; ++uniformIndex) >- { >- sh::BlockMemberInfo &blockInfo = >- mDefaultUniformBlocks[shaderType].uniformLayout[uniformIndex]; >- gl::WriteBlockMemberInfo(stream, blockInfo); >- } >- } >- >- // Serializes required uniform block memory sizes >- for (gl::ShaderType shaderType : gl::AllShaderTypes()) >- { >- stream->writeInt(mDefaultUniformBlocks[shaderType].uniformData.size()); >- } > } > > void ProgramVk::setBinaryRetrievableHint(bool retrievable) >@@ -238,20 +184,6 @@ void ProgramVk::setSeparable(bool separable) > // Nothing to do here yet. > } > >-// TODO: http://anglebug.com/3570: Move/Copy all of the necessary information into >-// the ProgramExecutable, so this function can be removed. >-void ProgramVk::fillProgramStateMap(gl::ShaderMap<const gl::ProgramState *> *programStatesOut) >-{ >- for (gl::ShaderType shaderType : gl::AllShaderTypes()) >- { >- (*programStatesOut)[shaderType] = nullptr; >- if (mState.getExecutable().hasLinkedShaderStage(shaderType)) >- { >- (*programStatesOut)[shaderType] = &mState; >- } >- } >-} >- > std::unique_ptr<LinkEvent> ProgramVk::link(const gl::Context *context, > const gl::ProgramLinkedResources &resources, > gl::InfoLog &infoLog, >@@ -274,7 +206,7 @@ std::unique_ptr<LinkEvent> ProgramVk::link(const gl::Context *context, > &mExecutable.mVariableInfoMap); > > // Compile the shaders. >- angle::Result status = mOriginalShaderInfo.initShaders( >+ angle::Result status = mExecutable.mOriginalShaderInfo.initShaders( > mState.getExecutable().getLinkedShaderStages(), spirvBlobs, mExecutable.mVariableInfoMap); > if (status != angle::Result::Continue) > { >@@ -319,7 +251,8 @@ angle::Result ProgramVk::initDefaultUniformBlocks(const gl::Context *glContext) > initDefaultUniformLayoutMapping(layoutMap); > > // All uniform initializations are complete, now resize the buffers accordingly and return >- return resizeUniformBlockMemory(contextVk, requiredBufferSize); >+ return mExecutable.resizeUniformBlockMemory(contextVk, mState.getExecutable(), >+ requiredBufferSize); > } > > void ProgramVk::generateUniformLayoutMapping(gl::ShaderMap<sh::BlockLayoutMap> &layoutMap, >@@ -382,35 +315,12 @@ void ProgramVk::initDefaultUniformLayoutMapping(gl::ShaderMap<sh::BlockLayoutMap > > for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) > { >- mDefaultUniformBlocks[shaderType].uniformLayout.push_back(layoutInfo[shaderType]); >+ mExecutable.mDefaultUniformBlocks[shaderType]->uniformLayout.push_back( >+ layoutInfo[shaderType]); > } > } > } > >-angle::Result ProgramVk::resizeUniformBlockMemory(ContextVk *contextVk, >- gl::ShaderMap<size_t> &requiredBufferSize) >-{ >- const gl::ProgramExecutable &glExecutable = mState.getExecutable(); >- >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- if (requiredBufferSize[shaderType] > 0) >- { >- if (!mDefaultUniformBlocks[shaderType].uniformData.resize( >- requiredBufferSize[shaderType])) >- { >- ANGLE_VK_CHECK(contextVk, false, VK_ERROR_OUT_OF_HOST_MEMORY); >- } >- >- // Initialize uniform buffer memory to zero by default. >- mDefaultUniformBlocks[shaderType].uniformData.fill(0); >- mDefaultUniformBlocksDirty.set(shaderType); >- } >- } >- >- return angle::Result::Continue; >-} >- > GLboolean ProgramVk::validate(const gl::Caps &caps, gl::InfoLog *infoLog) > { > // No-op. The spec is very vague about the behavior of validation. >@@ -430,7 +340,7 @@ void ProgramVk::setUniformImpl(GLint location, GLsizei count, const T *v, GLenum > { > for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) > { >- DefaultUniformBlock &uniformBlock = mDefaultUniformBlocks[shaderType]; >+ DefaultUniformBlock &uniformBlock = *mExecutable.mDefaultUniformBlocks[shaderType]; > const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location]; > > // Assume an offset of -1 means the block is unused. >@@ -442,14 +352,14 @@ void ProgramVk::setUniformImpl(GLint location, GLsizei count, const T *v, GLenum > const GLint componentCount = linkedUniform.typeInfo->componentCount; > UpdateDefaultUniformBlock(count, locationInfo.arrayIndex, componentCount, v, layoutInfo, > &uniformBlock.uniformData); >- mDefaultUniformBlocksDirty.set(shaderType); >+ mExecutable.mDefaultUniformBlocksDirty.set(shaderType); > } > } > else > { > for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) > { >- DefaultUniformBlock &uniformBlock = mDefaultUniformBlocks[shaderType]; >+ DefaultUniformBlock &uniformBlock = *mExecutable.mDefaultUniformBlocks[shaderType]; > const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location]; > > // Assume an offset of -1 means the block is unused. >@@ -477,7 +387,7 @@ void ProgramVk::setUniformImpl(GLint location, GLsizei count, const T *v, GLenum > } > } > >- mDefaultUniformBlocksDirty.set(shaderType); >+ mExecutable.mDefaultUniformBlocksDirty.set(shaderType); > } > } > } >@@ -493,7 +403,7 @@ void ProgramVk::getUniformImpl(GLint location, T *v, GLenum entryPointType) cons > const gl::ShaderType shaderType = linkedUniform.getFirstShaderTypeWhereActive(); > ASSERT(shaderType != gl::ShaderType::InvalidEnum); > >- const DefaultUniformBlock &uniformBlock = mDefaultUniformBlocks[shaderType]; >+ const DefaultUniformBlock &uniformBlock = *mExecutable.mDefaultUniformBlocks[shaderType]; > const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location]; > > ASSERT(linkedUniform.typeInfo->componentType == entryPointType || >@@ -593,7 +503,7 @@ void ProgramVk::setUniformMatrixfv(GLint location, > > for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) > { >- DefaultUniformBlock &uniformBlock = mDefaultUniformBlocks[shaderType]; >+ DefaultUniformBlock &uniformBlock = *mExecutable.mDefaultUniformBlocks[shaderType]; > const sh::BlockMemberInfo &layoutInfo = uniformBlock.uniformLayout[location]; > > // Assume an offset of -1 means the block is unused. >@@ -606,7 +516,7 @@ void ProgramVk::setUniformMatrixfv(GLint location, > locationInfo.arrayIndex, linkedUniform.getArraySizeProduct(), count, transpose, value, > uniformBlock.uniformData.data() + layoutInfo.offset); > >- mDefaultUniformBlocksDirty.set(shaderType); >+ mExecutable.mDefaultUniformBlocksDirty.set(shaderType); > } > } > >@@ -696,134 +606,4 @@ void ProgramVk::getUniformuiv(const gl::Context *context, GLint location, GLuint > { > getUniformImpl(location, params, GL_UNSIGNED_INT); > } >- >-size_t ProgramVk::calcUniformUpdateRequiredSpace(ContextVk *contextVk, >- const gl::ProgramExecutable &glExecutable, >- gl::ShaderMap<VkDeviceSize> &uniformOffsets) const >-{ >- size_t requiredSpace = 0; >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- if (mDefaultUniformBlocksDirty[shaderType]) >- { >- uniformOffsets[shaderType] = requiredSpace; >- requiredSpace += getDefaultUniformAlignedSize(contextVk, shaderType); >- } >- } >- return requiredSpace; >-} >- >-angle::Result ProgramVk::updateUniforms(ContextVk *contextVk) >-{ >- ASSERT(hasDirtyUniforms()); >- >- bool anyNewBufferAllocated = false; >- uint8_t *bufferData = nullptr; >- VkDeviceSize bufferOffset = 0; >- uint32_t offsetIndex = 0; >- const gl::ProgramExecutable &glExecutable = mState.getExecutable(); >- gl::ShaderMap<VkDeviceSize> offsets; // offset to the beginning of bufferData >- size_t requiredSpace; >- >- // We usually only update uniform data for shader stages that are actually dirty. But when the >- // buffer for uniform data have switched, because all shader stages are using the same buffer, >- // we then must update uniform data for all shader stages to keep all shader stages' uniform >- // data in the same buffer. >- requiredSpace = calcUniformUpdateRequiredSpace(contextVk, glExecutable, offsets); >- ASSERT(requiredSpace > 0); >- >- // Allocate space from dynamicBuffer. Always try to allocate from the current buffer first. >- // If that failed, we deal with fall out and try again. >- vk::DynamicBuffer *defaultUniformStorage = contextVk->getDefaultUniformStorage(); >- if (!defaultUniformStorage->allocateFromCurrentBuffer(requiredSpace, &bufferData, >- &bufferOffset)) >- { >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- if (!mDefaultUniformBlocks[shaderType].uniformData.empty()) >- { >- mDefaultUniformBlocksDirty.set(shaderType); >- } >- } >- >- requiredSpace = calcUniformUpdateRequiredSpace(contextVk, glExecutable, offsets); >- ANGLE_TRY(defaultUniformStorage->allocate(contextVk, requiredSpace, &bufferData, nullptr, >- &bufferOffset, &anyNewBufferAllocated)); >- } >- >- // Update buffer memory by immediate mapping. This immediate update only works once. >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- if (mDefaultUniformBlocksDirty[shaderType]) >- { >- const angle::MemoryBuffer &uniformData = mDefaultUniformBlocks[shaderType].uniformData; >- memcpy(&bufferData[offsets[shaderType]], uniformData.data(), uniformData.size()); >- mExecutable.mDynamicUniformDescriptorOffsets[offsetIndex] = >- static_cast<uint32_t>(bufferOffset + offsets[shaderType]); >- mDefaultUniformBlocksDirty.reset(shaderType); >- } >- ++offsetIndex; >- } >- ANGLE_TRY(defaultUniformStorage->flush(contextVk)); >- >- vk::BufferHelper *defaultUniformBuffer = defaultUniformStorage->getCurrentBuffer(); >- if (mExecutable.getCurrentDefaultUniformBufferSerial() != >- defaultUniformBuffer->getBufferSerial()) >- { >- // We need to reinitialize the descriptor sets if we newly allocated buffers since we can't >- // modify the descriptor sets once initialized. >- vk::UniformsAndXfbDescriptorDesc defaultUniformsDesc; >- vk::UniformsAndXfbDescriptorDesc *uniformsAndXfbBufferDesc; >- >- if (glExecutable.hasTransformFeedbackOutput()) >- { >- const gl::State &glState = contextVk->getState(); >- TransformFeedbackVk *transformFeedbackVk = >- vk::GetImpl(glState.getCurrentTransformFeedback()); >- uniformsAndXfbBufferDesc = &transformFeedbackVk->getTransformFeedbackDesc(); >- uniformsAndXfbBufferDesc->updateDefaultUniformBuffer( >- defaultUniformBuffer->getBufferSerial()); >- } >- else >- { >- defaultUniformsDesc.updateDefaultUniformBuffer(defaultUniformBuffer->getBufferSerial()); >- uniformsAndXfbBufferDesc = &defaultUniformsDesc; >- } >- >- bool newDescriptorSetAllocated; >- ANGLE_TRY(mExecutable.allocUniformAndXfbDescriptorSet(contextVk, *uniformsAndXfbBufferDesc, >- &newDescriptorSetAllocated)); >- if (newDescriptorSetAllocated) >- { >- // Update the descriptor set with the bufferInfo >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- mExecutable.updateDefaultUniformsDescriptorSet( >- shaderType, mDefaultUniformBlocks[shaderType], defaultUniformBuffer, contextVk); >- } >- mExecutable.updateTransformFeedbackDescriptorSetImpl(mState, contextVk); >- } >- } >- >- return angle::Result::Continue; >-} >- >-void ProgramVk::setAllDefaultUniformsDirty() >-{ >- const gl::ProgramExecutable &glExecutable = mState.getExecutable(); >- for (const gl::ShaderType shaderType : glExecutable.getLinkedShaderStages()) >- { >- setShaderUniformDirtyBit(shaderType); >- } >-} >- >-void ProgramVk::onProgramBind() >-{ >- // Because all programs share default uniform buffers, when we switch programs, we have to >- // re-update all uniform data. We could do more tracking to avoid update if the context's >- // current uniform buffer is still the same buffer we last time used and buffer has not been >- // recycled. But statistics gathered on gfxbench shows that app always update uniform data on >- // program bind anyway, so not really worth it to add more tracking logic here. >- setAllDefaultUniformsDirty(); >-} > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.h >index b1d028e3b897edb181541dc3edf0f5bd81b84a7f..bb364f48f2932cbf13dd948e623240db83127bf2 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ProgramVk.h >@@ -23,11 +23,6 @@ > > namespace rx > { >-ANGLE_INLINE bool UseLineRaster(const ContextVk *contextVk, gl::PrimitiveMode mode) >-{ >- return contextVk->getFeatures().basicGLLineRasterization.enabled && gl::IsLineMode(mode); >-} >- > class ProgramVk : public ProgramImpl > { > public: >@@ -42,8 +37,6 @@ class ProgramVk : public ProgramImpl > void setBinaryRetrievableHint(bool retrievable) override; > void setSeparable(bool separable) override; > >- void fillProgramStateMap(gl::ShaderMap<const gl::ProgramState *> *programStatesOut); >- > std::unique_ptr<LinkEvent> link(const gl::Context *context, > const gl::ProgramLinkedResources &resources, > gl::InfoLog &infoLog, >@@ -103,65 +96,25 @@ class ProgramVk : public ProgramImpl > void getUniformiv(const gl::Context *context, GLint location, GLint *params) const override; > void getUniformuiv(const gl::Context *context, GLint location, GLuint *params) const override; > >- angle::Result updateUniforms(ContextVk *contextVk); >- >- void setAllDefaultUniformsDirty(); >- bool hasDirtyUniforms() const { return mDefaultUniformBlocksDirty.any(); } >- bool isShaderUniformDirty(gl::ShaderType shaderType) const >+ bool areShaderUniformsDirty(gl::ShaderType shaderType) const > { >- return mDefaultUniformBlocksDirty[shaderType]; >+ return mExecutable.mDefaultUniformBlocksDirty[shaderType]; > } > void setShaderUniformDirtyBit(gl::ShaderType shaderType) > { >- if (!mDefaultUniformBlocks[shaderType].uniformData.empty()) >+ if (!mExecutable.mDefaultUniformBlocks[shaderType]->uniformData.empty()) > { >- mDefaultUniformBlocksDirty.set(shaderType); >+ mExecutable.mDefaultUniformBlocksDirty.set(shaderType); > } > } > void clearShaderUniformDirtyBit(gl::ShaderType shaderType) > { >- mDefaultUniformBlocksDirty.reset(shaderType); >+ mExecutable.mDefaultUniformBlocksDirty.reset(shaderType); > } >- void onProgramBind(); > > const ProgramExecutableVk &getExecutable() const { return mExecutable; } > ProgramExecutableVk &getExecutable() { return mExecutable; } > >- gl::ShaderMap<DefaultUniformBlock> &getDefaultUniformBlocks() { return mDefaultUniformBlocks; } >- size_t getDefaultUniformAlignedSize(ContextVk *contextVk, const gl::ShaderType shaderType) const >- { >- RendererVk *renderer = contextVk->getRenderer(); >- size_t alignment = static_cast<size_t>( >- renderer->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment); >- return roundUp(mDefaultUniformBlocks[shaderType].uniformData.size(), alignment); >- } >- >- size_t calcUniformUpdateRequiredSpace(ContextVk *contextVk, >- const gl::ProgramExecutable &glExecutable, >- gl::ShaderMap<VkDeviceSize> &uniformOffsets) const; >- >- ANGLE_INLINE angle::Result initGraphicsShaderProgram( >- ContextVk *contextVk, >- const gl::ShaderType shaderType, >- bool isLastPreFragmentStage, >- ProgramTransformOptions optionBits, >- ProgramInfo *programInfo, >- const ShaderInterfaceVariableInfoMap &variableInfoMap) >- { >- return initProgram(contextVk, shaderType, isLastPreFragmentStage, optionBits, programInfo, >- variableInfoMap); >- } >- >- ANGLE_INLINE angle::Result initComputeProgram( >- ContextVk *contextVk, >- ProgramInfo *programInfo, >- const ShaderInterfaceVariableInfoMap &variableInfoMap) >- { >- ProgramTransformOptions optionBits = {}; >- return initProgram(contextVk, gl::ShaderType::Compute, false, optionBits, programInfo, >- variableInfoMap); >- } >- > const GlslangProgramInterfaceInfo &getGlslangProgramInterfaceInfo() > { > return mGlslangProgramInterfaceInfo; >@@ -179,8 +132,6 @@ class ProgramVk : public ProgramImpl > void generateUniformLayoutMapping(gl::ShaderMap<sh::BlockLayoutMap> &layoutMap, > gl::ShaderMap<size_t> &requiredBufferSize); > void initDefaultUniformLayoutMapping(gl::ShaderMap<sh::BlockLayoutMap> &layoutMap); >- angle::Result resizeUniformBlockMemory(ContextVk *contextVk, >- gl::ShaderMap<size_t> &requiredBufferSize); > > template <class T> > void getUniformImpl(GLint location, T *v, GLenum entryPointType) const; >@@ -189,36 +140,7 @@ class ProgramVk : public ProgramImpl > void setUniformImpl(GLint location, GLsizei count, const T *v, GLenum entryPointType); > void linkResources(const gl::ProgramLinkedResources &resources); > >- ANGLE_INLINE angle::Result initProgram(ContextVk *contextVk, >- const gl::ShaderType shaderType, >- bool isLastPreFragmentStage, >- ProgramTransformOptions optionBits, >- ProgramInfo *programInfo, >- const ShaderInterfaceVariableInfoMap &variableInfoMap) >- { >- ASSERT(mOriginalShaderInfo.valid()); >- >- // Create the program pipeline. This is done lazily and once per combination of >- // specialization constants. >- if (!programInfo->valid(shaderType)) >- { >- const bool isTransformFeedbackProgram = >- !mState.getLinkedTransformFeedbackVaryings().empty(); >- ANGLE_TRY(programInfo->initProgram(contextVk, shaderType, isLastPreFragmentStage, >- isTransformFeedbackProgram, mOriginalShaderInfo, >- optionBits, variableInfoMap)); >- } >- ASSERT(programInfo->valid(shaderType)); >- >- return angle::Result::Continue; >- } >- >- gl::ShaderMap<DefaultUniformBlock> mDefaultUniformBlocks; >- gl::ShaderBitSet mDefaultUniformBlocksDirty; >- > // We keep the SPIR-V code to use for draw call pipeline creation. >- ShaderInfo mOriginalShaderInfo; >- > GlslangProgramInterfaceInfo mGlslangProgramInterfaceInfo; > > ProgramExecutableVk mExecutable; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/README.md b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/README.md >index 684be1fe44a5326ba4de146b6253c37a8b1132af..b515c01df9c30f4ca6db6022268ffa444fbf3d3e 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/README.md >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/README.md >@@ -63,7 +63,7 @@ In this example we'll be recording a buffer copy command: > access.onBufferTransferRead(srcBuffer); > > // Get a pointer to a secondary command buffer for command recording. >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > // Record the copy command into the secondary buffer. We're done! >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp >index 75439f27c3176567da77e32b9de2fcc57a6363cc..840cabe899e05bdf23b3609c4a25986adaac8251 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp >@@ -83,12 +83,7 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, > const bool isDepthStencilFormat = textureFormat.hasDepthOrStencilBits(); > ASSERT(textureFormat.redBits > 0 || isDepthStencilFormat); > >- // TODO(syoussefi): Currently not supported for depth/stencil images if >- // VK_KHR_depth_stencil_resolve is not supported. Chromium only uses this for depth/stencil >- // buffers and doesn't attempt to read from it. http://anglebug.com/5065 >- const bool isRenderToTexture = >- mode == gl::MultisamplingMode::MultisampledRenderToTexture && >- (!isDepthStencilFormat || renderer->getFeatures().supportsDepthStencilResolve.enabled); >+ const bool isRenderToTexture = mode == gl::MultisamplingMode::MultisampledRenderToTexture; > const bool hasRenderToTextureEXT = > renderer->getFeatures().supportsMultisampledRenderToSingleSampled.enabled; > >@@ -179,7 +174,7 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex > uint32_t rendererQueueFamilyIndex = contextVk->getRenderer()->getQueueFamilyIndex(); > if (mImage->isQueueChangeNeccesary(rendererQueueFamilyIndex)) > { >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > mImage->changeLayoutAndQueue(contextVk, aspect, vk::ImageLayout::ColorAttachment, > rendererQueueFamilyIndex, commandBuffer); >@@ -283,7 +278,7 @@ void RenderbufferVk::releaseImage(ContextVk *contextVk) > if (mImage && mOwnsImage) > { > mImage->releaseImageFromShareContexts(renderer, contextVk); >- mImage->releaseStagingBuffer(renderer); >+ mImage->releaseStagedUpdates(renderer); > } > else > { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.cpp >index d8effe7143d40f674486de80bf3a6eb199995063..1d0a9fc766065e6c595ef3c812f2f9bb2f219fc6 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.cpp >@@ -176,6 +176,20 @@ constexpr const char *kSkippedMessages[] = { > "UNASSIGNED-CoreValidation-Shader-InterfaceTypeMismatch", > // http://anglebug.com/6514 > "vkEnumeratePhysicalDevices: One or more layers modified physical devices", >+ // When using Vulkan secondary command buffers, the command buffer is begun with the current >+ // framebuffer specified in pInheritanceInfo::framebuffer. If the framebuffer is multisampled >+ // and is resolved, an optimization would change the framebuffer to add the resolve target and >+ // use a subpass resolve operation instead. The following error complains that the framebuffer >+ // used to start the render pass and the one specified in pInheritanceInfo::framebuffer must be >+ // equal, which is not true in that case. In practice, this is benign, as the part of the >+ // framebuffer that's accessed by the command buffer is identically laid out. >+ // http://anglebug.com/6811 >+ "VUID-vkCmdExecuteCommands-pCommandBuffers-00099", >+ // VMA is used to allocate buffer memory, and it's not checking the result of >+ // vkGetBufferMemoryRequirements against the heap size before attempting to make an allocation. >+ // This leads to a validation error that is benign as the subsequent allocation will fail anyway >+ // (i.e. an OOM will be generated by Vulkan instead of ANGLE to the same effect). >+ "VUID-vkAllocateMemory-pAllocateInfo-01713", > }; > > struct SkippedSyncvalMessage >@@ -398,8 +412,7 @@ constexpr SkippedSyncvalMessage kSkippedSyncvalMessages[] = { > "SYNC_IMAGE_LAYOUT_TRANSITION", > "", false}, > // From various tests. The validation layer does not calculate the exact vertexCounts that's >- // been >- // accessed. http://anglebug.com/6725 >+ // been accessed. http://anglebug.com/6725 > {"SYNC-HAZARD-READ_AFTER_WRITE", "vkCmdDrawIndexed: Hazard READ_AFTER_WRITE for vertex", > "usage: SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ", false}, > {"SYNC-HAZARD-READ_AFTER_WRITE", "vkCmdDrawIndexedIndirect: Hazard READ_AFTER_WRITE for vertex", >@@ -412,6 +425,11 @@ constexpr SkippedSyncvalMessage kSkippedSyncvalMessages[] = { > "Access info (usage: SYNC_VERTEX_SHADER_SHADER_STORAGE_WRITE, prior_usage: " > "SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ", > false}, >+ {"SYNC-HAZARD-WRITE_AFTER_READ", >+ "vkCmdCopyImageToBuffer(): Hazard WRITE_AFTER_READ for dstBuffer VkBuffer", >+ "Access info (usage: SYNC_COPY_TRANSFER_WRITE, prior_usage: " >+ "SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ", >+ false}, > {"SYNC-HAZARD-WRITE_AFTER_READ", "vkCmdDispatch: Hazard WRITE_AFTER_READ for VkBuffer", > "Access info (usage: SYNC_COMPUTE_SHADER_SHADER_STORAGE_WRITE, prior_usage: " > "SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ", >@@ -998,6 +1016,12 @@ RendererVk::RendererVk() > mDefaultUniformBufferSize(kPreferredDefaultUniformBufferSize), > mDevice(VK_NULL_HANDLE), > mDeviceLost(false), >+ mCoherentStagingBufferMemoryTypeIndex(kInvalidMemoryTypeIndex), >+ mNonCoherentStagingBufferMemoryTypeIndex(kInvalidMemoryTypeIndex), >+ mStagingBufferAlignment(1), >+ mHostVisibleVertexConversionBufferMemoryTypeIndex(kInvalidMemoryTypeIndex), >+ mDeviceLocalVertexConversionBufferMemoryTypeIndex(kInvalidMemoryTypeIndex), >+ mVertexConversionBufferAlignment(1), > mPipelineCacheVkUpdateTimeout(kPipelineCacheVkUpdatePeriod), > mPipelineCacheDirty(false), > mPipelineCacheInitialized(false), >@@ -1065,9 +1089,9 @@ void RendererVk::onDestroy(vk::Context *context) > mYuvConversionCache.destroy(this); > mVkFormatDescriptorCountMap.clear(); > >- mCommandBufferRecycler.onDestroy(); >+ mOutsideRenderPassCommandBufferRecycler.onDestroy(); >+ mRenderPassCommandBufferRecycler.onDestroy(); > >- mBufferMemoryAllocator.destroy(this); > mAllocator.destroy(); > > sh::FinalizeGlslang(); >@@ -1288,7 +1312,7 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, > applicationInfo.engineVersion = 1; > > auto enumerateInstanceVersion = reinterpret_cast<PFN_vkEnumerateInstanceVersion>( >- vkGetInstanceProcAddr(mInstance, "vkEnumerateInstanceVersion")); >+ vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion")); > if (!enumerateInstanceVersion) > { > mApiVersion = VK_API_VERSION_1_0; >@@ -1467,8 +1491,69 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, > mAllocator.init(mPhysicalDevice, mDevice, mInstance, applicationInfo.apiVersion, > preferredLargeHeapBlockSize)); > >- // Create buffer memory allocator >- ANGLE_VK_TRY(displayVk, mBufferMemoryAllocator.initialize(this, preferredLargeHeapBlockSize)); >+ ANGLE_VK_CHECK(displayVk, mMemoryProperties.getMemoryTypeCount() > 0, >+ VK_ERROR_INITIALIZATION_FAILED); >+ // Initialize staging buffer memory type index and alignment. >+ // These buffers will only be used as transfer sources or transfer targets. >+ constexpr VkImageUsageFlags kUsageFlags = >+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; >+ >+ VkBufferCreateInfo createInfo = {}; >+ createInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; >+ createInfo.flags = 0; >+ createInfo.size = 4096; >+ createInfo.usage = kUsageFlags; >+ createInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; >+ createInfo.queueFamilyIndexCount = 0; >+ createInfo.pQueueFamilyIndices = nullptr; >+ >+ VkMemoryPropertyFlags requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; >+ bool persistentlyMapped = mFeatures.persistentlyMappedBuffers.enabled; >+ >+ // Coherent staging buffer >+ VkMemoryPropertyFlags preferredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; >+ ANGLE_VK_TRY(displayVk, mAllocator.findMemoryTypeIndexForBufferInfo( >+ createInfo, requiredFlags, preferredFlags, persistentlyMapped, >+ &mCoherentStagingBufferMemoryTypeIndex)); >+ ASSERT(mCoherentStagingBufferMemoryTypeIndex != kInvalidMemoryTypeIndex); >+ >+ // Non-coherent staging buffer >+ ANGLE_VK_TRY(displayVk, mAllocator.findMemoryTypeIndexForBufferInfo( >+ createInfo, requiredFlags, 0, persistentlyMapped, >+ &mNonCoherentStagingBufferMemoryTypeIndex)); >+ ASSERT(mNonCoherentStagingBufferMemoryTypeIndex != kInvalidMemoryTypeIndex); >+ >+ // Alignment >+ mStagingBufferAlignment = >+ static_cast<size_t>(mPhysicalDeviceProperties.limits.minMemoryMapAlignment); >+ ASSERT(gl::isPow2(mPhysicalDeviceProperties.limits.nonCoherentAtomSize)); >+ ASSERT(gl::isPow2(mPhysicalDeviceProperties.limits.optimalBufferCopyOffsetAlignment)); >+ mStagingBufferAlignment = std::max( >+ mStagingBufferAlignment, >+ static_cast<size_t>(mPhysicalDeviceProperties.limits.optimalBufferCopyOffsetAlignment)); >+ mStagingBufferAlignment = >+ std::max(mStagingBufferAlignment, >+ static_cast<size_t>(mPhysicalDeviceProperties.limits.nonCoherentAtomSize)); >+ ASSERT(gl::isPow2(mStagingBufferAlignment)); >+ >+ // Device local vertex conversion buffer >+ createInfo.usage = vk::kVertexBufferUsageFlags; >+ requiredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; >+ preferredFlags = 0; >+ ANGLE_VK_TRY(displayVk, mAllocator.findMemoryTypeIndexForBufferInfo( >+ createInfo, requiredFlags, preferredFlags, persistentlyMapped, >+ &mDeviceLocalVertexConversionBufferMemoryTypeIndex)); >+ ASSERT(mDeviceLocalVertexConversionBufferMemoryTypeIndex != kInvalidMemoryTypeIndex); >+ >+ // Host visible and non-coherent vertex conversion buffer, which is the same as non-coherent >+ // staging buffer >+ mHostVisibleVertexConversionBufferMemoryTypeIndex = mNonCoherentStagingBufferMemoryTypeIndex; >+ // We may use compute shader to do conversion, so we must meet >+ // minStorageBufferOffsetAlignment requirement as well. >+ mVertexConversionBufferAlignment = std::max( >+ vk::kVertexBufferAlignment, >+ static_cast<size_t>(mPhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment)); >+ ASSERT(gl::isPow2(mVertexConversionBufferAlignment)); > > { > ANGLE_TRACE_EVENT0("gpu.angle,startup", "GlslangWarmup"); >@@ -2023,7 +2108,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF > // Used to support EXT_blend_func_extended > mEnabledFeatures.features.dualSrcBlend = mPhysicalDeviceFeatures.dualSrcBlend; > >- if (!vk::CommandBuffer::ExecutesInline()) >+ if (!vk::OutsideRenderPassCommandBuffer::ExecutesInline() || >+ !vk::RenderPassCommandBuffer::ExecutesInline()) > { > mEnabledFeatures.features.inheritedQueries = mPhysicalDeviceFeatures.inheritedQueries; > } >@@ -2063,7 +2149,7 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF > vk::AddToPNextChain(&mEnabledFeatures, &mTransformFeedbackFeatures); > } > >- if (getFeatures().supportsCustomBorderColorEXT.enabled) >+ if (getFeatures().supportsCustomBorderColor.enabled) > { > mEnabledDeviceExtensions.push_back(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME); > vk::AddToPNextChain(&mEnabledFeatures, &mCustomBorderColorFeatures); >@@ -2542,11 +2628,12 @@ void RendererVk::initFeatures(DisplayVk *displayVk, > constexpr uint32_t kPixel4DriverWithWorkingSpecConstSupport = 0x80201000; > > bool isAMD = IsAMD(mPhysicalDeviceProperties.vendorID); >+ bool isARM = IsARM(mPhysicalDeviceProperties.vendorID); > bool isIntel = IsIntel(mPhysicalDeviceProperties.vendorID); > bool isNvidia = IsNvidia(mPhysicalDeviceProperties.vendorID); >- bool isQualcomm = IsQualcomm(mPhysicalDeviceProperties.vendorID); >- bool isARM = IsARM(mPhysicalDeviceProperties.vendorID); > bool isPowerVR = IsPowerVR(mPhysicalDeviceProperties.vendorID); >+ bool isQualcomm = IsQualcomm(mPhysicalDeviceProperties.vendorID); >+ bool isSamsung = IsSamsung(mPhysicalDeviceProperties.vendorID); > bool isSwiftShader = > IsSwiftshader(mPhysicalDeviceProperties.vendorID, mPhysicalDeviceProperties.deviceID); > >@@ -2728,7 +2815,7 @@ void RendererVk::initFeatures(DisplayVk *displayVk, > // TODO: http://anglebug.com/5927 - drop dependency on customBorderColorWithoutFormat. > // TODO: http://anglebug.com/6200 - re-enable on SwS when possible > ANGLE_FEATURE_CONDITION( >- &mFeatures, supportsCustomBorderColorEXT, >+ &mFeatures, supportsCustomBorderColor, > mCustomBorderColorFeatures.customBorderColors == VK_TRUE && > mCustomBorderColorFeatures.customBorderColorWithoutFormat == VK_TRUE && !isSwiftShader); > >@@ -2741,12 +2828,12 @@ void RendererVk::initFeatures(DisplayVk *displayVk, > IsAndroid() && isQualcomm); > > ANGLE_FEATURE_CONDITION(&mFeatures, perFrameWindowSizeQuery, >- isIntel || (IsWindows() && isAMD) || IsFuchsia()); >+ isIntel || (IsWindows() && isAMD) || IsFuchsia() || isSamsung); > > // Disabled on AMD/windows due to buggy behavior. > ANGLE_FEATURE_CONDITION(&mFeatures, disallowSeamfulCubeMapEmulation, IsWindows() && isAMD); > >- ANGLE_FEATURE_CONDITION(&mFeatures, padBuffersToMaxVertexAttribStride, isAMD); >+ ANGLE_FEATURE_CONDITION(&mFeatures, padBuffersToMaxVertexAttribStride, isAMD || isSamsung); > mMaxVertexAttribStride = std::min(static_cast<uint32_t>(gl::limits::kMaxVertexAttribStride), > mPhysicalDeviceProperties.limits.maxVertexInputBindingStride); > >@@ -2803,7 +2890,7 @@ void RendererVk::initFeatures(DisplayVk *displayVk, > // - Desktop GPUs > // - SwiftShader > ANGLE_FEATURE_CONDITION(&mFeatures, preferAggregateBarrierCalls, >- isNvidia || isAMD || isIntel || isSwiftShader); >+ isNvidia || isAMD || isIntel || isSwiftShader || isSamsung); > > // Currently disabled by default: http://anglebug.com/4324 > ANGLE_FEATURE_CONDITION(&mFeatures, asyncCommandQueue, false); >@@ -2833,9 +2920,9 @@ void RendererVk::initFeatures(DisplayVk *displayVk, > // - AMD/Windows: Unfortunately the trybots use ancient AMD cards and drivers. > const uint32_t maxComputeWorkGroupInvocations = > mPhysicalDeviceProperties.limits.maxComputeWorkGroupInvocations; >- ANGLE_FEATURE_CONDITION( >- &mFeatures, allowGenerateMipmapWithCompute, >- maxComputeWorkGroupInvocations >= 256 && (isNvidia || (isAMD && !IsWindows()))); >+ ANGLE_FEATURE_CONDITION(&mFeatures, allowGenerateMipmapWithCompute, >+ maxComputeWorkGroupInvocations >= 256 && >+ (isNvidia || ((isAMD || isSamsung) && !IsWindows()))); > > bool isAdreno540 = mPhysicalDeviceProperties.deviceID == angle::kDeviceID_Adreno540; > ANGLE_FEATURE_CONDITION(&mFeatures, forceMaxUniformBufferSize16KB, isQualcomm && isAdreno540); >@@ -2854,9 +2941,13 @@ void RendererVk::initFeatures(DisplayVk *displayVk, > // > // Note that emulation of GL_EXT_multisampled_render_to_texture is only really useful on tiling > // hardware, but is exposed on desktop platforms purely to increase testing coverage. >+ const bool supportsIndependentDepthStencilResolve = >+ mFeatures.supportsDepthStencilResolve.enabled && >+ mDepthStencilResolveProperties.independentResolveNone == VK_TRUE; > ANGLE_FEATURE_CONDITION(&mFeatures, enableMultisampledRenderToTexture, > mFeatures.supportsMultisampledRenderToSingleSampled.enabled || >- (!isSwiftShader && !(IsWindows() && (isIntel || isAMD)))); >+ (supportsIndependentDepthStencilResolve && !isSwiftShader && >+ !(IsWindows() && (isIntel || isAMD)))); > > // Currently we enable cube map arrays based on the imageCubeArray Vk feature. > // TODO: Check device caps for full cube map array support. http://anglebug.com/5143 >@@ -2922,17 +3013,33 @@ void RendererVk::initFeatures(DisplayVk *displayVk, > // natively anyway. > ANGLE_FEATURE_CONDITION(&mFeatures, overrideSurfaceFormatRGB8toRGBA8, true); > >+ // http://anglebug.com/6872 >+ // On ARM hardware, framebuffer-fetch-like behavior on Vulkan is already coherent, so we can >+ // expose the coherent version of the GL extension despite unofficial Vulkan support. >+ ANGLE_FEATURE_CONDITION(&mFeatures, supportsShaderFramebufferFetch, IsAndroid() && isARM); >+ >+ // Important games are not checking supported extensions properly, and are confusing the >+ // GL_EXT_shader_framebuffer_fetch_non_coherent as the GL_EXT_shader_framebuffer_fetch >+ // extension. Therefore, don't enable the extension on Arm and Qualcomm by default. >+ // https://issuetracker.google.com/issues/186643966 >+ ANGLE_FEATURE_CONDITION(&mFeatures, supportsShaderFramebufferFetchNonCoherent, >+ IsAndroid() && !(isARM || isQualcomm)); >+ >+ // Support EGL_KHR_lock_surface3 extension. >+ ANGLE_FEATURE_CONDITION(&mFeatures, supportsLockSurfaceExtension, IsAndroid()); >+ > angle::PlatformMethods *platform = ANGLEPlatformCurrent(); > platform->overrideFeaturesVk(platform, &mFeatures); > > ApplyFeatureOverrides(&mFeatures, displayVk->getState()); > > // Disable async command queue when using Vulkan secondary command buffers temporarily to avoid >- // threading hazards with ContextVk::mCommandPool. Note that this is done even if the feature >+ // threading hazards with ContextVk::mCommandPools. Note that this is done even if the feature > // is enabled through an override. > // TODO: Investigate whether async command queue is useful with Vulkan secondary command buffers > // and enable the feature. http://anglebug.com/6811 >- if (!vk::CommandBuffer::ExecutesInline()) >+ if (!vk::OutsideRenderPassCommandBuffer::ExecutesInline() || >+ !vk::RenderPassCommandBuffer::ExecutesInline()) > { > mFeatures.asyncCommandQueue.enabled = false; > } >@@ -3281,20 +3388,21 @@ bool RendererVk::haveSameFormatFeatureBits(angle::FormatID formatID1, > > angle::Result RendererVk::cleanupGarbage(Serial lastCompletedQueueSerial) > { >+ vk::SharedGarbageList remainingGarbage; > std::lock_guard<std::mutex> lock(mGarbageMutex); >- >- for (auto garbageIter = mSharedGarbage.begin(); garbageIter != mSharedGarbage.end();) >+ while (!mSharedGarbage.empty()) > { >- // Possibly 'counter' should be always zero when we add the object to garbage. >- vk::SharedGarbage &garbage = *garbageIter; >- if (garbage.destroyIfComplete(this, lastCompletedQueueSerial)) >- { >- garbageIter = mSharedGarbage.erase(garbageIter); >- } >- else >+ vk::SharedGarbage &garbage = mSharedGarbage.front(); >+ if (!garbage.destroyIfComplete(this, lastCompletedQueueSerial)) > { >- garbageIter++; >+ remainingGarbage.push(std::move(garbage)); > } >+ mSharedGarbage.pop(); >+ } >+ >+ if (!remainingGarbage.empty()) >+ { >+ mSharedGarbage = std::move(remainingGarbage); > } > > return angle::Result::Continue; >@@ -3347,7 +3455,8 @@ void RendererVk::setGlobalDebugAnnotator() > // functions exist, and if the kEnableDebugMarkersVarName environment variable is set. > if (vkCmdBeginDebugUtilsLabelEXT) > { >- std::string enabled = angle::GetEnvironmentVarOrAndroidProperty( >+ // Use the GetAndSet variant to improve future lookup times >+ std::string enabled = angle::GetAndSetEnvironmentVarOrUnCachedAndroidProperty( > kEnableDebugMarkersVarName, kEnableDebugMarkersPropertyName); > if (!enabled.empty() && enabled.compare("0") != 0) > { >@@ -3436,20 +3545,24 @@ angle::Result RendererVk::submitFrame(vk::Context *context, > const vk::Semaphore *signalSemaphore, > std::vector<vk::ResourceUseList> &&resourceUseLists, > vk::GarbageList &¤tGarbage, >- vk::CommandPool *commandPool, >+ vk::SecondaryCommandPools *commandPools, > Serial *submitSerialOut) > { > std::lock_guard<std::mutex> commandQueueLock(mCommandQueueMutex); > >+ vk::SecondaryCommandBufferList commandBuffersToReset = { >+ std::move(mOutsideRenderPassCommandBufferRecycler.releaseCommandBuffersToReset()), >+ std::move(mRenderPassCommandBufferRecycler.releaseCommandBuffersToReset()), >+ }; >+ > if (isAsyncCommandQueueEnabled()) > { > *submitSerialOut = mCommandProcessor.reserveSubmitSerial(); > > ANGLE_TRY(mCommandProcessor.submitFrame( > context, hasProtectedContent, contextPriority, waitSemaphores, waitSemaphoreStageMasks, >- signalSemaphore, std::move(currentGarbage), >- std::move(mCommandBufferRecycler.getCommandBuffersToReset()), commandPool, >- *submitSerialOut)); >+ signalSemaphore, std::move(currentGarbage), std::move(commandBuffersToReset), >+ commandPools, *submitSerialOut)); > } > else > { >@@ -3457,9 +3570,8 @@ angle::Result RendererVk::submitFrame(vk::Context *context, > > ANGLE_TRY(mCommandQueue.submitFrame( > context, hasProtectedContent, contextPriority, waitSemaphores, waitSemaphoreStageMasks, >- signalSemaphore, std::move(currentGarbage), >- std::move(mCommandBufferRecycler.getCommandBuffersToReset()), commandPool, >- *submitSerialOut)); >+ signalSemaphore, std::move(currentGarbage), std::move(commandBuffersToReset), >+ commandPools, *submitSerialOut)); > } > > waitSemaphores.clear(); >@@ -3557,10 +3669,11 @@ angle::Result RendererVk::checkCompletedCommands(vk::Context *context) > return angle::Result::Continue; > } > >-angle::Result RendererVk::flushRenderPassCommands(vk::Context *context, >- bool hasProtectedContent, >- const vk::RenderPass &renderPass, >- vk::CommandBufferHelper **renderPassCommands) >+angle::Result RendererVk::flushRenderPassCommands( >+ vk::Context *context, >+ bool hasProtectedContent, >+ const vk::RenderPass &renderPass, >+ vk::RenderPassCommandBufferHelper **renderPassCommands) > { > ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::flushRenderPassCommands"); > >@@ -3579,9 +3692,10 @@ angle::Result RendererVk::flushRenderPassCommands(vk::Context *context, > return angle::Result::Continue; > } > >-angle::Result RendererVk::flushOutsideRPCommands(vk::Context *context, >- bool hasProtectedContent, >- vk::CommandBufferHelper **outsideRPCommands) >+angle::Result RendererVk::flushOutsideRPCommands( >+ vk::Context *context, >+ bool hasProtectedContent, >+ vk::OutsideRenderPassCommandBufferHelper **outsideRPCommands) > { > ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::flushOutsideRPCommands"); > >@@ -3624,23 +3738,44 @@ VkResult RendererVk::queuePresent(vk::Context *context, > return result; > } > >-angle::Result RendererVk::getCommandBufferHelper(vk::Context *context, >- bool hasRenderPass, >- vk::CommandPool *commandPool, >- vk::CommandBufferHelper **commandBufferHelperOut) >+angle::Result RendererVk::getOutsideRenderPassCommandBufferHelper( >+ vk::Context *context, >+ vk::CommandPool *commandPool, >+ vk::OutsideRenderPassCommandBufferHelper **commandBufferHelperOut) > { >- ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::getCommandBufferHelper"); >+ ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::getOutsideRenderPassCommandBufferHelper"); > std::unique_lock<std::mutex> lock(mCommandBufferRecyclerMutex); >- return mCommandBufferRecycler.getCommandBufferHelper(context, hasRenderPass, commandPool, >- commandBufferHelperOut); >+ return mOutsideRenderPassCommandBufferRecycler.getCommandBufferHelper(context, commandPool, >+ commandBufferHelperOut); > } > >-void RendererVk::recycleCommandBufferHelper(VkDevice device, >- vk::CommandBufferHelper **commandBuffer) >+angle::Result RendererVk::getRenderPassCommandBufferHelper( >+ vk::Context *context, >+ vk::CommandPool *commandPool, >+ vk::RenderPassCommandBufferHelper **commandBufferHelperOut) > { >- ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::recycleCommandBufferHelper"); >+ ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::getRenderPassCommandBufferHelper"); >+ std::unique_lock<std::mutex> lock(mCommandBufferRecyclerMutex); >+ return mRenderPassCommandBufferRecycler.getCommandBufferHelper(context, commandPool, >+ commandBufferHelperOut); >+} >+ >+void RendererVk::recycleOutsideRenderPassCommandBufferHelper( >+ VkDevice device, >+ vk::OutsideRenderPassCommandBufferHelper **commandBuffer) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::recycleOutsideRenderPassCommandBufferHelper"); >+ std::lock_guard<std::mutex> lock(mCommandBufferRecyclerMutex); >+ mOutsideRenderPassCommandBufferRecycler.recycleCommandBufferHelper(device, commandBuffer); >+} >+ >+void RendererVk::recycleRenderPassCommandBufferHelper( >+ VkDevice device, >+ vk::RenderPassCommandBufferHelper **commandBuffer) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "RendererVk::recycleRenderPassCommandBufferHelper"); > std::lock_guard<std::mutex> lock(mCommandBufferRecyclerMutex); >- mCommandBufferRecycler.recycleCommandBufferHelper(device, commandBuffer); >+ mRenderPassCommandBufferRecycler.recycleCommandBufferHelper(device, commandBuffer); > } > > void RendererVk::logCacheStats() const >@@ -3862,58 +3997,5 @@ void MemoryReport::logMemoryReportStats() const > << " (max=" << std::setw(10) << importedMemoryMax << ")"; > } > } >- >-// BufferMemoryAllocator implementation. >-BufferMemoryAllocator::BufferMemoryAllocator() {} >- >-BufferMemoryAllocator::~BufferMemoryAllocator() {} >- >-VkResult BufferMemoryAllocator::initialize(RendererVk *renderer, >- VkDeviceSize preferredLargeHeapBlockSize) >-{ >- ASSERT(renderer->getAllocator().valid()); >- return VK_SUCCESS; >-} >- >-void BufferMemoryAllocator::destroy(RendererVk *renderer) {} >- >-VkResult BufferMemoryAllocator::createBuffer(RendererVk *renderer, >- const VkBufferCreateInfo &bufferCreateInfo, >- VkMemoryPropertyFlags requiredFlags, >- VkMemoryPropertyFlags preferredFlags, >- bool persistentlyMappedBuffers, >- uint32_t *memoryTypeIndexOut, >- Buffer *bufferOut, >- Allocation *allocationOut) >-{ >- ASSERT(bufferOut && !bufferOut->valid()); >- ASSERT(allocationOut && !allocationOut->valid()); >- const Allocator &allocator = renderer->getAllocator(); >- return vma::CreateBuffer(allocator.getHandle(), &bufferCreateInfo, requiredFlags, >- preferredFlags, persistentlyMappedBuffers, memoryTypeIndexOut, >- &bufferOut->mHandle, &allocationOut->mHandle); >-} >- >-void BufferMemoryAllocator::getMemoryTypeProperties(RendererVk *renderer, >- uint32_t memoryTypeIndex, >- VkMemoryPropertyFlags *flagsOut) const >-{ >- const Allocator &allocator = renderer->getAllocator(); >- vma::GetMemoryTypeProperties(allocator.getHandle(), memoryTypeIndex, flagsOut); >-} >- >-VkResult BufferMemoryAllocator::findMemoryTypeIndexForBufferInfo( >- RendererVk *renderer, >- const VkBufferCreateInfo &bufferCreateInfo, >- VkMemoryPropertyFlags requiredFlags, >- VkMemoryPropertyFlags preferredFlags, >- bool persistentlyMappedBuffers, >- uint32_t *memoryTypeIndexOut) const >-{ >- const Allocator &allocator = renderer->getAllocator(); >- return vma::FindMemoryTypeIndexForBufferInfo(allocator.getHandle(), &bufferCreateInfo, >- requiredFlags, preferredFlags, >- persistentlyMappedBuffers, memoryTypeIndexOut); >-} > } // namespace vk > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.h >index 8bed6f99cb6cc28700c811dc10a22a967dc82699..5c9b5ffa217816b5392bb846fcd9cc6b787e0618 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/RendererVk.h >@@ -82,38 +82,6 @@ class MemoryReport final : angle::NonCopyable > VkDeviceSize mMaxTotalImportedMemory; > angle::HashMap<uint64_t, int> mUniqueIDCounts; > }; >- >-class BufferMemoryAllocator : angle::NonCopyable >-{ >- public: >- BufferMemoryAllocator(); >- ~BufferMemoryAllocator(); >- >- VkResult initialize(RendererVk *renderer, VkDeviceSize preferredLargeHeapBlockSize); >- void destroy(RendererVk *renderer); >- >- // Initializes the buffer handle and memory allocation. >- VkResult createBuffer(RendererVk *renderer, >- const VkBufferCreateInfo &bufferCreateInfo, >- VkMemoryPropertyFlags requiredFlags, >- VkMemoryPropertyFlags preferredFlags, >- bool persistentlyMapped, >- uint32_t *memoryTypeIndexOut, >- Buffer *bufferOut, >- Allocation *allocationOut); >- >- void getMemoryTypeProperties(RendererVk *renderer, >- uint32_t memoryTypeIndex, >- VkMemoryPropertyFlags *flagsOut) const; >- VkResult findMemoryTypeIndexForBufferInfo(RendererVk *renderer, >- const VkBufferCreateInfo &bufferCreateInfo, >- VkMemoryPropertyFlags requiredFlags, >- VkMemoryPropertyFlags preferredFlags, >- bool persistentlyMappedBuffers, >- uint32_t *memoryTypeIndexOut) const; >- >- private: >-}; > } // namespace vk > > // Supports one semaphore from current surface, and one semaphore passed to >@@ -195,7 +163,6 @@ class RendererVk : angle::NonCopyable > const VkPhysicalDeviceFeatures2KHR &getEnabledFeatures() const { return mEnabledFeatures; } > VkDevice getDevice() const { return mDevice; } > >- vk::BufferMemoryAllocator &getBufferMemoryAllocator() { return mBufferMemoryAllocator; } > const vk::Allocator &getAllocator() const { return mAllocator; } > > angle::Result selectPresentQueueForSurface(DisplayVk *displayVk, >@@ -238,6 +205,7 @@ class RendererVk : angle::NonCopyable > } > uint32_t getDefaultUniformBufferSize() const { return mDefaultUniformBufferSize; } > >+ angle::vk::ICD getEnabledICD() const { return mEnabledICD; } > bool isMockICDEnabled() const { return mEnabledICD == angle::vk::ICD::Mock; } > > // Query the format properties for select bits (linearTilingFeatures, optimalTilingFeatures and >@@ -297,9 +265,14 @@ class RendererVk : angle::NonCopyable > bool hasProtectedContent, > vk::PrimaryCommandBuffer *commandBufferOut); > >- void resetSecondaryCommandBuffer(vk::CommandBuffer &&commandBuffer) >+ void resetOutsideRenderPassCommandBuffer(vk::OutsideRenderPassCommandBuffer &&commandBuffer) >+ { >+ mOutsideRenderPassCommandBufferRecycler.resetCommandBuffer(std::move(commandBuffer)); >+ } >+ >+ void resetRenderPassCommandBuffer(vk::RenderPassCommandBuffer &&commandBuffer) > { >- mCommandBufferRecycler.resetCommandBufferHelper(std::move(commandBuffer)); >+ mRenderPassCommandBufferRecycler.resetCommandBuffer(std::move(commandBuffer)); > } > > // Fire off a single command buffer immediately with default priority. >@@ -340,7 +313,7 @@ class RendererVk : angle::NonCopyable > if (!garbage.destroyIfComplete(this, getLastCompletedQueueSerial())) > { > std::lock_guard<std::mutex> lock(mGarbageMutex); >- mSharedGarbage.push_back(std::move(garbage)); >+ mSharedGarbage.push(std::move(garbage)); > } > } > } >@@ -432,7 +405,7 @@ class RendererVk : angle::NonCopyable > const vk::Semaphore *signalSemaphore, > std::vector<vk::ResourceUseList> &&resourceUseLists, > vk::GarbageList &¤tGarbage, >- vk::CommandPool *commandPool, >+ vk::SecondaryCommandPools *commandPools, > Serial *submitSerialOut); > > void handleDeviceLost(); >@@ -447,20 +420,30 @@ class RendererVk : angle::NonCopyable > angle::Result flushRenderPassCommands(vk::Context *context, > bool hasProtectedContent, > const vk::RenderPass &renderPass, >- vk::CommandBufferHelper **renderPassCommands); >- angle::Result flushOutsideRPCommands(vk::Context *context, >- bool hasProtectedContent, >- vk::CommandBufferHelper **outsideRPCommands); >+ vk::RenderPassCommandBufferHelper **renderPassCommands); >+ angle::Result flushOutsideRPCommands( >+ vk::Context *context, >+ bool hasProtectedContent, >+ vk::OutsideRenderPassCommandBufferHelper **outsideRPCommands); > > VkResult queuePresent(vk::Context *context, > egl::ContextPriority priority, > const VkPresentInfoKHR &presentInfo); > >- angle::Result getCommandBufferHelper(vk::Context *context, >- bool hasRenderPass, >- vk::CommandPool *commandPool, >- vk::CommandBufferHelper **commandBufferHelperOut); >- void recycleCommandBufferHelper(VkDevice device, vk::CommandBufferHelper **commandBuffer); >+ angle::Result getOutsideRenderPassCommandBufferHelper( >+ vk::Context *context, >+ vk::CommandPool *commandPool, >+ vk::OutsideRenderPassCommandBufferHelper **commandBufferHelperOut); >+ angle::Result getRenderPassCommandBufferHelper( >+ vk::Context *context, >+ vk::CommandPool *commandPool, >+ vk::RenderPassCommandBufferHelper **commandBufferHelperOut); >+ >+ void recycleOutsideRenderPassCommandBufferHelper( >+ VkDevice device, >+ vk::OutsideRenderPassCommandBufferHelper **commandBuffer); >+ void recycleRenderPassCommandBufferHelper(VkDevice device, >+ vk::RenderPassCommandBufferHelper **commandBuffer); > > // Process GPU memory reports > void processMemoryReportCallback(const VkDeviceMemoryReportCallbackDataEXT &callbackData) >@@ -508,6 +491,22 @@ class RendererVk : angle::NonCopyable > > VkDeviceSize getPreferedBufferBlockSize(uint32_t memoryTypeIndex) const; > >+ uint32_t getStagingBufferMemoryTypeIndex(vk::MemoryCoherency coherency) const >+ { >+ return coherency == vk::MemoryCoherency::Coherent >+ ? mCoherentStagingBufferMemoryTypeIndex >+ : mNonCoherentStagingBufferMemoryTypeIndex; >+ } >+ size_t getStagingBufferAlignment() const { return mStagingBufferAlignment; } >+ >+ uint32_t getVertexConversionBufferMemoryTypeIndex(vk::MemoryHostVisibility hostVisibility) const >+ { >+ return hostVisibility == vk::MemoryHostVisibility::Visible >+ ? mHostVisibleVertexConversionBufferMemoryTypeIndex >+ : mDeviceLocalVertexConversionBufferMemoryTypeIndex; >+ } >+ size_t getVertexConversionBufferAlignment() const { return mVertexConversionBufferAlignment; } >+ > private: > angle::Result initializeDevice(DisplayVk *displayVk, uint32_t queueFamilyIndex); > void ensureCapsInitialized() const; >@@ -597,6 +596,15 @@ class RendererVk : angle::NonCopyable > vk::MemoryProperties mMemoryProperties; > vk::FormatTable mFormatTable; > >+ // The cached memory type index for staging buffer that is host visible. >+ uint32_t mCoherentStagingBufferMemoryTypeIndex; >+ uint32_t mNonCoherentStagingBufferMemoryTypeIndex; >+ size_t mStagingBufferAlignment; >+ >+ uint32_t mHostVisibleVertexConversionBufferMemoryTypeIndex; >+ uint32_t mDeviceLocalVertexConversionBufferMemoryTypeIndex; >+ size_t mVertexConversionBufferAlignment; >+ > // All access to the pipeline cache is done through EGL objects so it is thread safe to not use > // a lock. > std::mutex mPipelineCacheMutex; >@@ -638,9 +646,12 @@ class RendererVk : angle::NonCopyable > > // Command buffer pool management. > std::mutex mCommandBufferRecyclerMutex; >- vk::CommandBufferRecycler mCommandBufferRecycler; >+ vk::CommandBufferRecycler<vk::OutsideRenderPassCommandBuffer, >+ vk::OutsideRenderPassCommandBufferHelper> >+ mOutsideRenderPassCommandBufferRecycler; >+ vk::CommandBufferRecycler<vk::RenderPassCommandBuffer, vk::RenderPassCommandBufferHelper> >+ mRenderPassCommandBufferRecycler; > >- vk::BufferMemoryAllocator mBufferMemoryAllocator; > vk::Allocator mAllocator; > SamplerCache mSamplerCache; > SamplerYcbcrConversionCache mYuvConversionCache; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.cpp >index 455fdc76790e4803a00e1b422c6f72f2d3bcf229..1fd89eb1ce8f7687e6d98df296fc702e30d3b5bc 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.cpp >@@ -93,8 +93,7 @@ ReadWriteResource::ReadWriteResource() > > ReadWriteResource::ReadWriteResource(ReadWriteResource &&other) : ReadWriteResource() > { >- mReadOnlyUse = std::move(other.mReadOnlyUse); >- mReadWriteUse = std::move(other.mReadWriteUse); >+ *this = std::move(other); > } > > ReadWriteResource::~ReadWriteResource() >@@ -103,6 +102,13 @@ ReadWriteResource::~ReadWriteResource() > mReadWriteUse.release(); > } > >+ReadWriteResource &ReadWriteResource::operator=(ReadWriteResource &&other) >+{ >+ mReadOnlyUse = std::move(other.mReadOnlyUse); >+ mReadWriteUse = std::move(other.mReadWriteUse); >+ return *this; >+} >+ > angle::Result ReadWriteResource::finishRunningCommands(ContextVk *contextVk) > { > ASSERT(!mReadOnlyUse.usedInRecordedCommands()); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.h >index 8dfb7b7e00e6d903c1d754fe6454d979c9e013bd..39d66d1b82b5f7a1b0277d74fc8e6c1b0b8b84b4 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/ResourceVk.h >@@ -12,6 +12,8 @@ > > #include "libANGLE/renderer/vulkan/vk_utils.h" > >+#include <queue> >+ > namespace rx > { > namespace vk >@@ -129,7 +131,7 @@ class SharedGarbage > std::vector<GarbageObject> mGarbage; > }; > >-using SharedGarbageList = std::vector<SharedGarbage>; >+using SharedGarbageList = std::queue<SharedGarbage>; > > // Mixin to abstract away the resource use tracking. > class ResourceUseList final : angle::NonCopyable >@@ -250,6 +252,7 @@ class ReadWriteResource : public angle::NonCopyable > protected: > ReadWriteResource(); > ReadWriteResource(ReadWriteResource &&other); >+ ReadWriteResource &operator=(ReadWriteResource &&other); > > // Track any use of the object. Always updated on every retain call. > SharedResourceUse mReadOnlyUse; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp >index b1fd734a39681184288ebb29e1829ea1616f832f..ba83e7530acb163c6d121cd43eb7677f4cb94879 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SemaphoreVk.cpp >@@ -81,7 +81,7 @@ angle::Result SemaphoreVk::wait(gl::Context *context, > BufferVk *bufferVk = vk::GetImpl(buffer); > vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > > // Queue ownership transfer. >@@ -101,7 +101,7 @@ angle::Result SemaphoreVk::wait(gl::Context *context, > vk::ImageHelper &image = textureVk->getImage(); > vk::ImageLayout layout = vk::GetImageLayoutFromGLImageLayout(textureBarrier.layout); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > > // Image should not be accessed while unowned. Emulated formats may have staged updates >@@ -136,7 +136,7 @@ angle::Result SemaphoreVk::signal(gl::Context *context, > vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); > > ANGLE_TRY(contextVk->onBufferReleaseToExternal(bufferHelper)); >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > > // Queue ownership transfer. >@@ -166,7 +166,7 @@ angle::Result SemaphoreVk::signal(gl::Context *context, > ANGLE_TRY(textureVk->ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); > > ANGLE_TRY(contextVk->onImageReleaseToExternal(image)); >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > > // Queue ownership transfer and layout transition. >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.cpp >index 5453513c472e1d035eaa634f4986220cbd589f10..2e4e62910c38e416b02a0708edb09e7ee4a20950 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.cpp >@@ -125,15 +125,22 @@ angle::Result InitImageHelper(DisplayVk *displayVk, > vk::ImageHelper *imageHelper) > { > const angle::Format &textureFormat = vkFormat.getActualRenderableImageFormat(); >- bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0; >- const VkImageUsageFlags usage = isDepthOrStencilFormat ? kSurfaceVkDepthStencilImageUsageFlags >- : kSurfaceVkColorImageUsageFlags; >+ bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0; >+ VkImageUsageFlags usage = isDepthOrStencilFormat ? kSurfaceVkDepthStencilImageUsageFlags >+ : kSurfaceVkColorImageUsageFlags; >+ >+ RendererVk *rendererVk = displayVk->getRenderer(); >+ // If shaders may be fetching from this, we need this image to be an input >+ if (rendererVk->getFeatures().supportsShaderFramebufferFetch.enabled || >+ rendererVk->getFeatures().supportsShaderFramebufferFetchNonCoherent.enabled) >+ { >+ usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; >+ } > > VkExtent3D extents = {std::max(static_cast<uint32_t>(width), 1u), > std::max(static_cast<uint32_t>(height), 1u), 1u}; > > angle::FormatID renderableFormatId = vkFormat.getActualRenderableImageFormatID(); >- RendererVk *rendererVk = displayVk->getRenderer(); > // For devices that don't support creating swapchain images with RGB8, emulate with RGBA8. > if (rendererVk->getFeatures().overrideSurfaceFormatRGB8toRGBA8.enabled && > renderableFormatId == angle::FormatID::R8G8B8_UNORM) >@@ -242,6 +249,95 @@ angle::Result DoesSurfaceSupportFormat(DisplayVk *displayVk, > } > } > } >+ return angle::Result::Continue; >+} >+ >+angle::Result LockSurfaceImpl(DisplayVk *displayVk, >+ vk::ImageHelper *image, >+ vk::BufferHelper &lockBufferHelper, >+ EGLint width, >+ EGLint height, >+ EGLint usageHint, >+ bool preservePixels, >+ uint8_t **bufferPtrOut, >+ EGLint *bufferPitchOut) >+{ >+ const gl::InternalFormat &internalFormat = >+ gl::GetSizedInternalFormatInfo(image->getActualFormat().glInternalFormat); >+ GLuint rowStride = image->getActualFormat().pixelBytes * width; >+ VkDeviceSize bufferSize = >+ (static_cast<VkDeviceSize>(rowStride) * static_cast<VkDeviceSize>(height)); >+ >+ if (!lockBufferHelper.valid() || (lockBufferHelper.getSize() != bufferSize)) >+ { >+ lockBufferHelper.destroy(displayVk->getRenderer()); >+ >+ VkBufferCreateInfo bufferCreateInfo = {}; >+ bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; >+ bufferCreateInfo.pNext = nullptr; >+ bufferCreateInfo.flags = 0; >+ bufferCreateInfo.size = bufferSize; >+ bufferCreateInfo.usage = >+ (VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); >+ bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; >+ bufferCreateInfo.queueFamilyIndexCount = 0; >+ bufferCreateInfo.pQueueFamilyIndices = 0; >+ >+ VkMemoryPropertyFlags memoryFlags = >+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; >+ >+ ANGLE_TRY(lockBufferHelper.init(displayVk, bufferCreateInfo, memoryFlags)); >+ >+ uint8_t *bufferPtr = nullptr; >+ ANGLE_TRY(lockBufferHelper.map(displayVk, &bufferPtr)); >+ } >+ >+ if (lockBufferHelper.valid()) >+ { >+ if (preservePixels) >+ { >+ gl::LevelIndex sourceLevelGL(0); >+ const VkClearColorValue *clearColor; >+ if (image->removeStagedClearUpdatesAndReturnColor(sourceLevelGL, &clearColor)) >+ { >+ ASSERT(!image->hasStagedUpdatesForSubresource(sourceLevelGL, 0, 1)); >+ angle::Color<uint8_t> color((uint8_t)(clearColor->float32[0] * 255.0), >+ (uint8_t)(clearColor->float32[1] * 255.0), >+ (uint8_t)(clearColor->float32[2] * 255.0), >+ (uint8_t)(clearColor->float32[3] * 255.0)); >+ lockBufferHelper.fillWithColor(color, internalFormat); >+ } >+ else >+ { >+ gl::Box sourceArea(0, 0, 0, width, height, 1); >+ ANGLE_TRY(image->copySurfaceImageToBuffer(displayVk, sourceLevelGL, 1, 0, >+ sourceArea, &lockBufferHelper)); >+ } >+ } >+ >+ *bufferPitchOut = rowStride; >+ *bufferPtrOut = lockBufferHelper.getMappedMemory(); >+ } >+ return angle::Result::Continue; >+} >+ >+angle::Result UnlockSurfaceImpl(DisplayVk *displayVk, >+ vk::ImageHelper *image, >+ vk::BufferHelper &lockBufferHelper, >+ EGLint width, >+ EGLint height, >+ bool preservePixels) >+{ >+ if (preservePixels) >+ { >+ ASSERT(image->valid()); >+ >+ gl::Box destArea(0, 0, 0, width, height, 1); >+ gl::LevelIndex destLevelGL(0); >+ >+ ANGLE_TRY(image->copyBufferToSurfaceImage(displayVk, destLevelGL, 1, 0, destArea, >+ &lockBufferHelper)); >+ } > > return angle::Result::Continue; > } >@@ -324,7 +420,7 @@ void OffscreenSurfaceVk::AttachmentImage::destroy(const egl::Display *display) > RendererVk *renderer = displayVk->getRenderer(); > // Front end must ensure all usage has been submitted. > image.releaseImage(renderer); >- image.releaseStagingBuffer(renderer); >+ image.releaseStagedUpdates(renderer); > imageViews.release(renderer); > } > >@@ -389,6 +485,11 @@ void OffscreenSurfaceVk::destroy(const egl::Display *display) > { > mColorAttachment.destroy(display); > mDepthStencilAttachment.destroy(display); >+ >+ if (mLockBufferHelper.valid()) >+ { >+ mLockBufferHelper.destroy(vk::GetImpl(display)->getRenderer()); >+ } > } > > FramebufferImpl *OffscreenSurfaceVk::createDefaultFramebuffer(const gl::Context *context, >@@ -492,6 +593,39 @@ vk::ImageHelper *OffscreenSurfaceVk::getColorAttachmentImage() > return &mColorAttachment.image; > } > >+egl::Error OffscreenSurfaceVk::lockSurface(const egl::Display *display, >+ EGLint usageHint, >+ bool preservePixels, >+ uint8_t **bufferPtrOut, >+ EGLint *bufferPitchOut) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "OffscreenSurfaceVk::lockSurface"); >+ >+ vk::ImageHelper *image = &mColorAttachment.image; >+ ASSERT(image->valid()); >+ >+ angle::Result result = >+ LockSurfaceImpl(vk::GetImpl(display), image, mLockBufferHelper, getWidth(), getHeight(), >+ usageHint, preservePixels, bufferPtrOut, bufferPitchOut); >+ return angle::ToEGL(result, vk::GetImpl(display), EGL_BAD_ACCESS); >+} >+ >+egl::Error OffscreenSurfaceVk::unlockSurface(const egl::Display *display, bool preservePixels) >+{ >+ vk::ImageHelper *image = &mColorAttachment.image; >+ ASSERT(image->valid()); >+ ASSERT(mLockBufferHelper.valid()); >+ >+ return angle::ToEGL(UnlockSurfaceImpl(vk::GetImpl(display), image, mLockBufferHelper, >+ getWidth(), getHeight(), preservePixels), >+ vk::GetImpl(display), EGL_BAD_ACCESS); >+} >+ >+EGLint OffscreenSurfaceVk::origin() const >+{ >+ return EGL_UPPER_LEFT_KHR; >+} >+ > namespace impl > { > SwapchainCleanupData::SwapchainCleanupData() = default; >@@ -598,6 +732,11 @@ void WindowSurfaceVk::destroy(const egl::Display *display) > // flush the pipe. > (void)renderer->finish(displayVk, mState.hasProtectedContent()); > >+ if (mLockBufferHelper.valid()) >+ { >+ mLockBufferHelper.destroy(renderer); >+ } >+ > destroySwapChainImages(displayVk); > > if (mSwapchain) >@@ -1105,6 +1244,13 @@ angle::Result WindowSurfaceVk::createSwapChain(vk::Context *context, > // We need transfer src for reading back from the backbuffer. > VkImageUsageFlags imageUsageFlags = kSurfaceVkColorImageUsageFlags; > >+ // If shaders may be fetching from this, we need this image to be an input >+ if (renderer->getFeatures().supportsShaderFramebufferFetch.enabled || >+ renderer->getFeatures().supportsShaderFramebufferFetchNonCoherent.enabled) >+ { >+ imageUsageFlags |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; >+ } >+ > // We need storage image for compute writes (debug overlay output). > if (kEnableOverlay) > { >@@ -1315,14 +1461,14 @@ void WindowSurfaceVk::releaseSwapchainImages(ContextVk *contextVk) > if (mDepthStencilImage.valid()) > { > mDepthStencilImage.releaseImageFromShareContexts(renderer, contextVk); >- mDepthStencilImage.releaseStagingBuffer(renderer); >+ mDepthStencilImage.releaseStagedUpdates(renderer); > mDepthStencilImageViews.release(renderer); > } > > if (mColorImageMS.valid()) > { > mColorImageMS.releaseImageFromShareContexts(renderer, contextVk); >- mColorImageMS.releaseStagingBuffer(renderer); >+ mColorImageMS.releaseStagedUpdates(renderer); > mColorImageMSViews.release(renderer); > contextVk->addGarbage(&mFramebufferMS); > } >@@ -1391,6 +1537,28 @@ FramebufferImpl *WindowSurfaceVk::createDefaultFramebuffer(const gl::Context *co > return FramebufferVk::CreateDefaultFBO(renderer, state, this); > } > >+egl::Error WindowSurfaceVk::prepareSwap(const gl::Context *context) >+{ >+ DisplayVk *displayVk = vk::GetImpl(context->getDisplay()); >+ angle::Result result = prepareSwapImpl(context); >+ return angle::ToEGL(result, displayVk, EGL_BAD_SURFACE); >+} >+ >+angle::Result WindowSurfaceVk::prepareSwapImpl(const gl::Context *context) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "WindowSurfaceVk::prepareSwap"); >+ ContextVk *contextVk = vk::GetImpl(context); >+ if (mNeedToAcquireNextSwapchainImage) >+ { >+ // Acquire the next image (previously deferred). The image may not have been already >+ // acquired if there was no rendering done at all to the default framebuffer in this frame, >+ // for example if all rendering was done to FBOs. >+ ANGLE_VK_TRACE_EVENT_AND_MARKER(contextVk, "Acquire Swap Image Before Swap"); >+ ANGLE_TRY(doDeferredAcquireNextImage(context, false)); >+ } >+ return angle::Result::Continue; >+} >+ > egl::Error WindowSurfaceVk::swapWithDamage(const gl::Context *context, > const EGLint *rects, > EGLint n_rects) >@@ -1477,7 +1645,7 @@ angle::Result WindowSurfaceVk::present(ContextVk *contextVk, > // ImageLayout::Present bellow. > contextVk->finalizeImageLayout(&image.image); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > > if (mColorImageMS.valid()) >@@ -1601,15 +1769,6 @@ angle::Result WindowSurfaceVk::swapImpl(const gl::Context *context, > > ContextVk *contextVk = vk::GetImpl(context); > >- if (mNeedToAcquireNextSwapchainImage) >- { >- // Acquire the next image (previously deferred). The image may not have been already >- // acquired if there was no rendering done at all to the default framebuffer in this frame, >- // for example if all rendering was done to FBOs. >- ANGLE_VK_TRACE_EVENT_AND_MARKER(contextVk, "Acquire Swap Image Before Swap"); >- ANGLE_TRY(doDeferredAcquireNextImage(context, false)); >- } >- > bool presentOutOfDate = false; > ANGLE_TRY(present(contextVk, rects, n_rects, pNextChain, &presentOutOfDate)); > >@@ -1626,6 +1785,10 @@ angle::Result WindowSurfaceVk::swapImpl(const gl::Context *context, > ANGLE_TRY(doDeferredAcquireNextImage(context, presentOutOfDate)); > } > >+ RendererVk *renderer = contextVk->getRenderer(); >+ DisplayVk *displayVk = vk::GetImpl(context->getDisplay()); >+ ANGLE_TRY(renderer->syncPipelineCacheVk(displayVk, context)); >+ > return angle::Result::Continue; > } > >@@ -1647,7 +1810,6 @@ angle::Result WindowSurfaceVk::doDeferredAcquireNextImage(const gl::Context *con > bool presentOutOfDate) > { > ContextVk *contextVk = vk::GetImpl(context); >- DisplayVk *displayVk = vk::GetImpl(context->getDisplay()); > > // TODO(jmadill): Expose in CommandQueueInterface, or manage in CommandQueue. b/172704839 > if (contextVk->getRenderer()->isAsyncCommandQueueEnabled()) >@@ -1682,17 +1844,15 @@ angle::Result WindowSurfaceVk::doDeferredAcquireNextImage(const gl::Context *con > } > > // Invalidate the color image if the swap behavior is EGL_BUFFER_DESTROYED. >- // Also invalidate the multi-sample color image. >- // In swapImpl(), optimizeRenderPassForPresent() does this for depth/stencil content. >+ // Also invalidate the multi-sample color image and depth/stencil content. > if (mState.swapBehavior == EGL_BUFFER_DESTROYED) > { > mSwapchainImages[mCurrentSwapchainImageIndex].image.invalidateSubresourceContent( > contextVk, gl::LevelIndex(0), 0, 1); > } > mColorImageMS.invalidateSubresourceContent(contextVk, gl::LevelIndex(0), 0, 1); >- >- RendererVk *renderer = contextVk->getRenderer(); >- ANGLE_TRY(renderer->syncPipelineCacheVk(displayVk, context)); >+ mDepthStencilImage.invalidateSubresourceContent(contextVk, gl::LevelIndex(0), 0, 1); >+ mDepthStencilImage.invalidateSubresourceStencilContent(contextVk, gl::LevelIndex(0), 0, 1); > > return angle::Result::Continue; > } >@@ -2163,4 +2323,45 @@ egl::Error WindowSurfaceVk::setRenderBuffer(EGLint renderBuffer) > return egl::NoError(); > } > >+egl::Error WindowSurfaceVk::lockSurface(const egl::Display *display, >+ EGLint usageHint, >+ bool preservePixels, >+ uint8_t **bufferPtrOut, >+ EGLint *bufferPitchOut) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "WindowSurfaceVk::lockSurface"); >+ >+ vk::ImageHelper *image = &mSwapchainImages[mCurrentSwapchainImageIndex].image; >+ if (!image->valid()) >+ { >+ if (acquireNextSwapchainImage(vk::GetImpl(display)) != VK_SUCCESS) >+ { >+ return egl::EglBadAccess(); >+ } >+ } >+ image = &mSwapchainImages[mCurrentSwapchainImageIndex].image; >+ ASSERT(image->valid()); >+ >+ angle::Result result = >+ LockSurfaceImpl(vk::GetImpl(display), image, mLockBufferHelper, getWidth(), getHeight(), >+ usageHint, preservePixels, bufferPtrOut, bufferPitchOut); >+ return angle::ToEGL(result, vk::GetImpl(display), EGL_BAD_ACCESS); >+} >+ >+egl::Error WindowSurfaceVk::unlockSurface(const egl::Display *display, bool preservePixels) >+{ >+ vk::ImageHelper *image = &mSwapchainImages[mCurrentSwapchainImageIndex].image; >+ ASSERT(image->valid()); >+ ASSERT(mLockBufferHelper.valid()); >+ >+ return angle::ToEGL(UnlockSurfaceImpl(vk::GetImpl(display), image, mLockBufferHelper, >+ getWidth(), getHeight(), preservePixels), >+ vk::GetImpl(display), EGL_BAD_ACCESS); >+} >+ >+EGLint WindowSurfaceVk::origin() const >+{ >+ return EGL_UPPER_LEFT_KHR; >+} >+ > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.h >index 69cecd317d52bba314e7e35da486ed1a8f831910..beba1294e552e346df4a0b0ba4552e34aeeefe3a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SurfaceVk.h >@@ -78,6 +78,14 @@ class OffscreenSurfaceVk : public SurfaceVk > > vk::ImageHelper *getColorAttachmentImage(); > >+ egl::Error lockSurface(const egl::Display *display, >+ EGLint usageHint, >+ bool preservePixels, >+ uint8_t **bufferPtrOut, >+ EGLint *bufferPitchOut) override; >+ egl::Error unlockSurface(const egl::Display *display, bool preservePixels) override; >+ EGLint origin() const override; >+ > protected: > struct AttachmentImage final : angle::NonCopyable > { >@@ -106,6 +114,9 @@ class OffscreenSurfaceVk : public SurfaceVk > > AttachmentImage mColorAttachment; > AttachmentImage mDepthStencilAttachment; >+ >+ // EGL_KHR_lock_surface3 >+ vk::BufferHelper mLockBufferHelper; > }; > > // Data structures used in WindowSurfaceVk >@@ -182,6 +193,7 @@ class WindowSurfaceVk : public SurfaceVk > FramebufferAttachmentRenderTarget **rtOut) override; > FramebufferImpl *createDefaultFramebuffer(const gl::Context *context, > const gl::FramebufferState &state) override; >+ egl::Error prepareSwap(const gl::Context *context) override; > egl::Error swap(const gl::Context *context) override; > egl::Error swapWithDamage(const gl::Context *context, > const EGLint *rects, >@@ -247,7 +259,16 @@ class WindowSurfaceVk : public SurfaceVk > return (mSwapchainPresentMode == VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR); > } > >+ egl::Error lockSurface(const egl::Display *display, >+ EGLint usageHint, >+ bool preservePixels, >+ uint8_t **bufferPtrOut, >+ EGLint *bufferPitchOut) override; >+ egl::Error unlockSurface(const egl::Display *display, bool preservePixels) override; >+ EGLint origin() const override; >+ > protected: >+ angle::Result prepareSwapImpl(const gl::Context *context); > angle::Result swapImpl(const gl::Context *context, > const EGLint *rects, > EGLint n_rects, >@@ -374,6 +395,9 @@ class WindowSurfaceVk : public SurfaceVk > > // EGL_EXT_buffer_age: Track frame count. > uint64_t mFrameCount; >+ >+ // EGL_KHR_lock_surface3 >+ vk::BufferHelper mLockBufferHelper; > }; > > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SyncVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SyncVk.cpp >index 2045639000c3cd650f2b0db83ec04a56e7ccad9e..e2045105681d9761afae3e2f9f48a23a32523f77 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SyncVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/SyncVk.cpp >@@ -143,7 +143,7 @@ angle::Result SyncHelper::serverWait(ContextVk *contextVk) > // Every resource already tracks its usage and issues the appropriate barriers, so there's > // really nothing to do here. An execution barrier is issued to strictly satisfy what the > // application asked for. >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > commandBuffer->pipelineBarrier(VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, > VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 0, >@@ -318,9 +318,6 @@ angle::Result SyncHelperNativeFence::serverWait(ContextVk *contextVk) > importFdInfo.fd = dup(mNativeFenceFd); > ANGLE_VK_TRY(contextVk, waitSemaphore.get().importFd(device, importFdInfo)); > >- // Flush current work, block after current pending commands. >- ANGLE_TRY(contextVk->flushImpl(nullptr, RenderPassClosureReason::SyncObjectServerWait)); >- > // Add semaphore to next submit job. > contextVk->addWaitSemaphore(waitSemaphore.get().getHandle(), > VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.cpp >index c0c13ef4baf0986da16409a950c80eb96e03a3a7..e99ffc051f6b7540c3fadddabaf1dc2785fa7b8b 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.cpp >@@ -292,7 +292,6 @@ TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer) > mImageLayerOffset(0), > mImageLevelOffset(0), > mImage(nullptr), >- mStagingBufferInitialSize(vk::kStagingBufferSize), > mImageUsageFlags(0), > mImageCreateFlags(0), > mImageObserverBinding(this, kTextureImageSubjectIndex), >@@ -474,14 +473,13 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context, > { > ContextVk *contextVk = vk::GetImpl(context); > >- // Use context's staging buffer for immutable textures and flush out updates >- // immediately. >- vk::DynamicBuffer *stagingBuffer = nullptr; >+ // When possible flush out updates immediately. >+ bool shouldFlush = false; > if (!mOwnsImage || mState.getImmutableFormat() || > (!shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()), > vkFormat.getActualImageFormatID(getRequiredImageAccess())))) > { >- stagingBuffer = contextVk->getStagingBuffer(); >+ shouldFlush = true; > } > > if (unpackBuffer) >@@ -543,9 +541,8 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context, > ANGLE_TRY(mImage->stageSubresourceUpdateImpl( > contextVk, getNativeImageIndex(index), > gl::Extents(area.width, area.height, area.depth), >- gl::Offset(area.x, area.y, area.z), formatInfo, unpack, stagingBuffer, type, source, >- vkFormat, getRequiredImageAccess(), inputRowPitch, inputDepthPitch, >- inputSkipBytes)); >+ gl::Offset(area.x, area.y, area.z), formatInfo, unpack, type, source, vkFormat, >+ getRequiredImageAccess(), inputRowPitch, inputDepthPitch, inputSkipBytes)); > > ANGLE_TRY(unpackBufferVk->unmapImpl(contextVk)); > } >@@ -554,12 +551,12 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context, > { > ANGLE_TRY(mImage->stageSubresourceUpdate( > contextVk, getNativeImageIndex(index), gl::Extents(area.width, area.height, area.depth), >- gl::Offset(area.x, area.y, area.z), formatInfo, unpack, stagingBuffer, type, pixels, >- vkFormat, getRequiredImageAccess())); >+ gl::Offset(area.x, area.y, area.z), formatInfo, unpack, type, pixels, vkFormat, >+ getRequiredImageAccess())); > } > > // If we used context's staging buffer, flush out the updates >- if (stagingBuffer) >+ if (shouldFlush) > { > ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); > } >@@ -802,20 +799,14 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context, > ANGLE_VK_PERF_WARNING(contextVk, GL_DEBUG_SEVERITY_HIGH, > "Texture copied on CPU due to format restrictions"); > >- // Use context's staging buffer if possible >- vk::DynamicBuffer *contextStagingBuffer = nullptr; >- if (!shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()), dstActualFormatID)) >- { >- contextStagingBuffer = contextVk->getStagingBuffer(); >- } >- > // Do a CPU readback that does the conversion, and then stage the change to the pixel buffer. > ANGLE_TRY(mImage->stageSubresourceUpdateFromFramebuffer( > context, offsetImageIndex, clippedSourceArea, modifiedDestOffset, > gl::Extents(clippedSourceArea.width, clippedSourceArea.height, 1), internalFormat, >- getRequiredImageAccess(), framebufferVk, contextStagingBuffer)); >+ getRequiredImageAccess(), framebufferVk)); > >- if (contextStagingBuffer) >+ // Flush out staged update if possible >+ if (!shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()), dstActualFormatID)) > { > ANGLE_TRY(flushImageStagedUpdates(contextVk)); > } >@@ -877,10 +868,11 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk, > "Texture copied on CPU due to format restrictions"); > > // Read back the requested region of the source texture >+ vk::RendererScoped<vk::BufferHelper> bufferHelper(renderer); > uint8_t *sourceData = nullptr; > ANGLE_TRY(source->copyImageDataToBufferAndGetData( > contextVk, sourceLevelGL, sourceBox.depth, sourceBox, >- RenderPassClosureReason::CopyTextureOnCPU, &sourceData)); >+ RenderPassClosureReason::CopyTextureOnCPU, &bufferHelper.get(), &sourceData)); > > const angle::Format &srcTextureFormat = source->getImage().getActualFormat(); > const angle::Format &dstTextureFormat = >@@ -910,17 +902,10 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk, > const gl::ImageIndex stagingIndex = gl::ImageIndex::Make2DArrayRange( > offsetImageIndex.getLevelIndex(), stagingBaseLayer, stagingLayerCount); > >- // Use context's staging buffer if possible >- vk::DynamicBuffer *contextStagingBuffer = nullptr; >- if (!shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()), dstFormatID)) >- { >- contextStagingBuffer = contextVk->getStagingBuffer(); >- } >- > uint8_t *destData = nullptr; >- ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData( >- contextVk, destinationAllocationSize, stagingIndex, stagingExtents, stagingOffset, >- &destData, contextStagingBuffer, dstFormatID)); >+ ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData(contextVk, destinationAllocationSize, >+ stagingIndex, stagingExtents, stagingOffset, >+ &destData, dstFormatID)); > > // Source and dst data is tightly packed > GLuint srcDataRowPitch = sourceBox.width * srcTextureFormat.pixelBytes; >@@ -950,7 +935,7 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk, > dstFormat.componentType, sourceBox.width, sourceBox.height, sourceBox.depth, > unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha); > >- if (contextStagingBuffer) >+ if (!shouldUpdateBeStaged(gl::LevelIndex(index.getLevelIndex()), dstFormatID)) > { > ANGLE_TRY(flushImageStagedUpdates(contextVk)); > } >@@ -1020,7 +1005,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, > access.onImageTransferWrite(level, 1, baseLayer, layerCount, VK_IMAGE_ASPECT_COLOR_BIT, > mImage); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkImageSubresourceLayers destSubresource = srcSubresource; >@@ -1057,7 +1042,7 @@ angle::Result TextureVk::copySubImageImplWithTransfer(ContextVk *contextVk, > access.onImageTransferWrite(gl::LevelIndex(0), 1, 0, layerCount, VK_IMAGE_ASPECT_COLOR_BIT, > &stagingImage->get()); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkImageSubresourceLayers destSubresource = srcSubresource; >@@ -1287,7 +1272,7 @@ angle::Result TextureVk::setStorageMultisample(const gl::Context *context, > } > else if (mImage) > { >- mImage->releaseStagingBuffer(contextVk->getRenderer()); >+ mImage->releaseStagedUpdates(contextVk->getRenderer()); > } > > // Assume all multisample texture types must be renderable. >@@ -1425,7 +1410,7 @@ angle::Result TextureVk::setEGLImageTarget(const gl::Context *context, > newLayout = vk::ImageLayout::AllGraphicsShadersReadOnly; > } > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > mImage->changeLayoutAndQueue(contextVk, mImage->getAspectFlags(), newLayout, > rendererQueueFamilyIndex, commandBuffer); >@@ -1489,7 +1474,7 @@ void TextureVk::releaseAndDeleteImageAndViews(ContextVk *contextVk) > if (mImage) > { > releaseImage(contextVk); >- releaseStagingBuffer(contextVk); >+ releaseStagedUpdates(contextVk); > mImageObserverBinding.bind(nullptr); > mRequiresMutableStorage = false; > mRequiredImageAccess = vk::ImageAccess::SampleOnly; >@@ -1531,16 +1516,6 @@ angle::Result TextureVk::ensureImageAllocated(ContextVk *contextVk, const vk::Fo > { > setImageHelper(contextVk, new vk::ImageHelper(), mState.getType(), format, 0, 0, true); > } >- else >- { >- // Note: one possible path here is when an image level is being redefined to a different >- // format. In that case, staged updates with the new format should succeed, but otherwise >- // the format should not affect the currently allocated image. The following function only >- // takes the alignment requirement to make sure the format is not accidentally used for any >- // other purpose. >- updateImageHelper(contextVk, vk::GetImageCopyBufferAlignment( >- format.getActualImageFormatID(getRequiredImageAccess()))); >- } > > initImageUsageFlags(contextVk, format.getActualImageFormatID(getRequiredImageAccess())); > >@@ -1570,8 +1545,6 @@ void TextureVk::setImageHelper(ContextVk *contextVk, > mImageLevelOffset = imageLevelOffset; > mImageLayerOffset = imageLayerOffset; > mImage = imageHelper; >- updateImageHelper(contextVk, vk::GetImageCopyBufferAlignment( >- format.getActualImageFormatID(getRequiredImageAccess()))); > > // Force re-creation of render targets next time they are needed > for (auto &renderTargets : mSingleLayerRenderTargets) >@@ -1598,14 +1571,6 @@ void TextureVk::setImageHelper(ContextVk *contextVk, > getImageViews().init(renderer); > } > >-void TextureVk::updateImageHelper(ContextVk *contextVk, size_t imageCopyBufferAlignment) >-{ >- RendererVk *renderer = contextVk->getRenderer(); >- ASSERT(mImage != nullptr); >- mImage->initStagingBuffer(renderer, imageCopyBufferAlignment, vk::kStagingBufferFlags, >- mStagingBufferInitialSize); >-} >- > angle::Result TextureVk::redefineLevel(const gl::Context *context, > const gl::ImageIndex &index, > const vk::Format &format, >@@ -1620,12 +1585,25 @@ angle::Result TextureVk::redefineLevel(const gl::Context *context, > > if (mImage != nullptr) > { >- // If there is any staged changes for this index, we can remove them since we're going to >+ // If there are any staged changes for this index, we can remove them since we're going to > // override them with this call. > gl::LevelIndex levelIndexGL(index.getLevelIndex()); > uint32_t layerIndex = index.hasLayer() ? index.getLayerIndex() : 0; >- mImage->removeSingleSubresourceStagedUpdates(contextVk, levelIndexGL, layerIndex, >- index.getLayerCount()); >+ if (gl::IsArrayTextureType(index.getType())) >+ { >+ // A multi-layer texture is being redefined, remove all updates to this level; the >+ // number of layers may have changed. >+ mImage->removeStagedUpdates(contextVk, levelIndexGL, levelIndexGL); >+ } >+ else >+ { >+ // Otherwise remove only updates to this layer. For example, cube map updates can be >+ // done through glTexImage2D, one per cube face (i.e. layer) and so should not remove >+ // updates to the other layers. >+ ASSERT(index.getLayerCount() == 1); >+ mImage->removeSingleSubresourceStagedUpdates(contextVk, levelIndexGL, layerIndex, >+ index.getLayerCount()); >+ } > > if (mImage->valid()) > { >@@ -1692,6 +1670,7 @@ angle::Result TextureVk::copyImageDataToBufferAndGetData(ContextVk *contextVk, > uint32_t layerCount, > const gl::Box &sourceArea, > RenderPassClosureReason reason, >+ vk::BufferHelper *copyBuffer, > uint8_t **outDataPtr) > { > ANGLE_TRACE_EVENT0("gpu.angle", "TextureVk::copyImageDataToBufferAndGetData"); >@@ -1699,10 +1678,6 @@ angle::Result TextureVk::copyImageDataToBufferAndGetData(ContextVk *contextVk, > // Make sure the source is initialized and it's images are flushed. > ANGLE_TRY(ensureImageInitialized(contextVk, ImageMipLevels::EnabledLevels)); > >- vk::BufferHelper *copyBuffer = nullptr; >- vk::StagingBufferOffsetArray sourceCopyOffsets = {0, 0}; >- size_t bufferSize = 0; >- > gl::Box modifiedSourceArea = sourceArea; > > bool is3D = mImage->getExtents().depth > 1; >@@ -1716,8 +1691,7 @@ angle::Result TextureVk::copyImageDataToBufferAndGetData(ContextVk *contextVk, > } > > ANGLE_TRY(mImage->copyImageDataToBuffer(contextVk, sourceLevelGL, layerCount, 0, >- modifiedSourceArea, ©Buffer, &bufferSize, >- &sourceCopyOffsets, outDataPtr)); >+ modifiedSourceArea, copyBuffer, outDataPtr)); > > // Explicitly finish. If new use cases arise where we don't want to block we can change this. > ANGLE_TRY(contextVk->finishImpl(reason)); >@@ -1765,6 +1739,11 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk, > region.imageOffset.z = 0; > region.imageExtent.depth = 1; > } >+ else if (index.getType() == gl::TextureType::CubeMap) >+ { >+ // Copy to the correct cube map face. >+ layerIndex = index.getLayerIndex(); >+ } > region.imageSubresource.baseArrayLayer = layerIndex; > > // Make sure the source is initialized and its images are flushed. >@@ -1774,7 +1753,7 @@ angle::Result TextureVk::copyBufferDataToImage(ContextVk *contextVk, > access.onBufferTransferRead(srcBuffer); > access.onImageTransferWrite(level, 1, layerIndex, layerCount, mImage->getAspectFlags(), mImage); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > commandBuffer->copyBufferToImage(srcBuffer->getBuffer().getHandle(), mImage->getImage(), >@@ -1833,7 +1812,7 @@ angle::Result TextureVk::generateMipmapsWithCompute(ContextVk *contextVk) > mImage->getLayerCount(), VK_IMAGE_ASPECT_COLOR_BIT, > mImage); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > // Generate mipmaps for every layer separately. >@@ -1899,9 +1878,10 @@ angle::Result TextureVk::generateMipmapsWithCPU(const gl::Context *context) > gl::Box imageArea(0, 0, 0, baseLevelExtents.width, baseLevelExtents.height, > baseLevelExtents.depth); > >+ vk::RendererScoped<vk::BufferHelper> bufferHelper(contextVk->getRenderer()); > ANGLE_TRY(copyImageDataToBufferAndGetData(contextVk, baseLevelGL, imageLayerCount, imageArea, > RenderPassClosureReason::GenerateMipmapOnCPU, >- &imageData)); >+ &bufferHelper.get(), &imageData)); > > const angle::Format &angleFormat = mImage->getActualFormat(); > GLuint sourceRowPitch = baseLevelExtents.width * angleFormat.pixelBytes; >@@ -2072,7 +2052,7 @@ angle::Result TextureVk::copyAndStageImageData(ContextVk *contextVk, > &stagingImage->get()); > access.onImageTransferRead(aspectFlags, srcImage); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkImageCopy copyRegion = {}; >@@ -2171,13 +2151,11 @@ angle::Result TextureVk::reinitImageAsRenderable(ContextVk *contextVk, > gl::ImageIndex::MakeFromType(mState.getType(), levelGL.get(), 0, layerCount); > > // Read back the requested region of the source texture >- uint8_t *srcData = nullptr; >- vk::BufferHelper *srcBuffer = nullptr; >- size_t srcBufferSize = 0; >- vk::StagingBufferOffsetArray sourceCopyOffsets = {0, 0}; >+ vk::RendererScoped<vk::BufferHelper> bufferHelper(renderer); >+ vk::BufferHelper *srcBuffer = &bufferHelper.get(); >+ uint8_t *srcData = nullptr; > ANGLE_TRY(mImage->copyImageDataToBuffer(contextVk, levelGL, layerCount, 0, sourceBox, >- &srcBuffer, &srcBufferSize, &sourceCopyOffsets, >- &srcData)); >+ srcBuffer, &srcData)); > > // Explicitly finish. If new use cases arise where we don't want to block we can change > // this. >@@ -2190,7 +2168,7 @@ angle::Result TextureVk::reinitImageAsRenderable(ContextVk *contextVk, > uint8_t *dstData = nullptr; > ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData( > contextVk, dstBufferSize, index, mImage->getLevelExtents(levelVk), gl::kOffsetZero, >- &dstData, nullptr, dstFormat.id)); >+ &dstData, dstFormat.id)); > > // Source and destination data is tightly packed > GLuint srcDataRowPitch = sourceBox.width * srcFormat.pixelBytes; >@@ -2544,7 +2522,7 @@ void TextureVk::prepareForGenerateMipmap(ContextVk *contextVk) > // Generate bitmask for (baseLevel, maxLevel]. `+1` because bitMask takes `the number of bits` > // but levels start counting from 0 > gl::TexLevelMask levelsMask(angle::BitMask<uint32_t>(maxLevel.get() + 1)); >- levelsMask &= static_cast<uint32_t>(~angle::Bit<uint32_t>(baseLevel.get())); >+ levelsMask &= static_cast<uint32_t>(~angle::BitMask<uint32_t>(firstGeneratedLevel.get())); > // Remove (baseLevel, maxLevel] from mRedefinedLevels. These levels are no longer incompatibly > // defined if they previously were. The corresponding bits in mRedefinedLevels should be > // cleared. >@@ -2712,6 +2690,16 @@ angle::Result TextureVk::syncState(const gl::Context *context, > localBits.reset(gl::Texture::DIRTY_BIT_BASE_LEVEL); > localBits.reset(gl::Texture::DIRTY_BIT_MAX_LEVEL); > >+ // For AHBs, the ImageViews are created with VkSamplerYcbcrConversionInfo's chromaFilter >+ // matching min/magFilters as part of the eglEGLImageTargetTexture2DOES() call. However, the >+ // min/mag filters can change later, requiring the ImageViews to be created. >+ if (mImage->valid() && mImage->hasImmutableSampler() && >+ (dirtyBits.test(gl::Texture::DIRTY_BIT_MIN_FILTER) || >+ dirtyBits.test(gl::Texture::DIRTY_BIT_MAG_FILTER))) >+ { >+ ANGLE_TRY(refreshImageViews(contextVk)); >+ } >+ > if (localBits.none() && mSampler.valid()) > { > return angle::Result::Continue; >@@ -3020,10 +3008,10 @@ angle::Result TextureVk::initImageViews(ContextVk *contextVk, > // Use this as a proxy for the SRGB override & skip decode settings. > bool createExtraSRGBViews = mRequiresMutableStorage; > >- ANGLE_TRY(getImageViews().initReadViews(contextVk, mState.getType(), *mImage, format, >- formatSwizzle, readSwizzle, baseLevelVk, levelCount, >- baseLayer, layerCount, createExtraSRGBViews, >- mImageUsageFlags & ~VK_IMAGE_USAGE_STORAGE_BIT)); >+ ANGLE_TRY(getImageViews().initReadViews( >+ contextVk, mState.getType(), *mImage, format, formatSwizzle, readSwizzle, baseLevelVk, >+ levelCount, baseLayer, layerCount, createExtraSRGBViews, >+ mImageUsageFlags & ~VK_IMAGE_USAGE_STORAGE_BIT, mState.getSamplerState())); > > return angle::Result::Continue; > } >@@ -3074,11 +3062,11 @@ void TextureVk::releaseImage(ContextVk *contextVk) > mRedefinedLevels.reset(); > } > >-void TextureVk::releaseStagingBuffer(ContextVk *contextVk) >+void TextureVk::releaseStagedUpdates(ContextVk *contextVk) > { > if (mImage) > { >- mImage->releaseStagingBuffer(contextVk->getRenderer()); >+ mImage->releaseStagedUpdates(contextVk->getRenderer()); > } > } > >@@ -3145,8 +3133,7 @@ angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk, > ANGLE_TRY(mImage->stageSubresourceUpdateAndGetData( > contextVk, mipAllocationSize, > gl::ImageIndex::MakeFromType(mState.getType(), currentMipLevel.get(), layer), >- mipLevelExtents, gl::Offset(), &destData, contextVk->getStagingBuffer(), >- sourceFormat.id)); >+ mipLevelExtents, gl::Offset(), &destData, sourceFormat.id)); > > // Generate the mipmap into that new buffer > sourceFormat.mipGenerationFunction( >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.h >index cb96e656a20a00f290458bd9d8c4a0027f2a3ec7..2053e7c8d49b3344baa750d3e066517cf72aac12 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TextureVk.h >@@ -244,11 +244,6 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface > const gl::SamplerState &samplerState) const; > vk::ImageOrBufferViewSubresourceSerial getBufferViewSerial() const; > >- void overrideStagingBufferSizeForTesting(size_t initialSizeForTesting) >- { >- mStagingBufferInitialSize = initialSizeForTesting; >- } >- > GLenum getColorReadFormat(const gl::Context *context) override; > GLenum getColorReadType(const gl::Context *context) override; > >@@ -308,7 +303,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface > uint32_t imageLevelOffset, > uint32_t imageLayerOffset, > bool selfOwned); >- void updateImageHelper(ContextVk *contextVk, size_t imageCopyBufferAlignment); >+ > vk::ImageViewHelper &getImageViews() > { > return mMultisampledImageViews[gl::RenderToTextureImageIndex::Default]; >@@ -353,6 +348,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface > uint32_t layerCount, > const gl::Box &sourceArea, > RenderPassClosureReason reason, >+ vk::BufferHelper *copyBuffer, > uint8_t **outDataPtr); > > angle::Result copyBufferDataToImage(ContextVk *contextVk, >@@ -431,7 +427,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface > angle::FormatID actualImageFormatID, > ImageMipLevels mipLevels); > void releaseImage(ContextVk *contextVk); >- void releaseStagingBuffer(ContextVk *contextVk); >+ void releaseStagedUpdates(ContextVk *contextVk); > uint32_t getMipLevelCount(ImageMipLevels mipLevels) const; > uint32_t getMaxLevelCount() const; > angle::Result copyAndStageImageData(ContextVk *contextVk, >@@ -554,9 +550,6 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface > // sampling states for the Texture. > vk::SamplerBinding mSampler; > >- // Overridden in some tests. >- size_t mStagingBufferInitialSize; >- > // The created vkImage usage flag. > VkImageUsageFlags mImageUsageFlags; > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp >index cb867e4602087e8bf0ba574467cdbbffceba86fa..280708aa1182f0ddb86470148843e715e7b55b8d 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.cpp >@@ -248,6 +248,8 @@ void TransformFeedbackVk::updateDescriptorSetLayout( > const ShaderInterfaceVariableInfo &info = > variableInfoMap.get(gl::ShaderType::Vertex, bufferName); > >+ ASSERT(info.binding != std::numeric_limits<uint32_t>::max()); >+ > descSetLayoutOut->update(info.binding, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, > VK_SHADER_STAGE_VERTEX_BIT, nullptr); > } >@@ -279,7 +281,7 @@ void TransformFeedbackVk::initDescriptorSet(ContextVk *contextVk, > } > > void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk, >- const gl::ProgramState &programState, >+ const gl::ProgramExecutable &executable, > const ShaderInterfaceVariableInfoMap &variableInfoMap, > VkDescriptorSet descSet) const > { >@@ -288,12 +290,10 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk, > return; > } > >- const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable(); >- ASSERT(executable); >- size_t xfbBufferCount = executable->getTransformFeedbackBufferCount(); >+ size_t xfbBufferCount = executable.getTransformFeedbackBufferCount(); > > ASSERT(xfbBufferCount > 0); >- ASSERT(programState.getTransformFeedbackBufferMode() != GL_INTERLEAVED_ATTRIBS || >+ ASSERT(executable.getTransformFeedbackBufferMode() != GL_INTERLEAVED_ATTRIBS || > xfbBufferCount == 1); > > VkDescriptorBufferInfo *descriptorBufferInfo = >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h >index 5f5af53db3f8a3a139aebc2f96f22b93c1c10298..02c4ff28a8c81d878cb456406d5f6dc5ecbe4bd2 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h >@@ -52,7 +52,7 @@ class TransformFeedbackVk : public TransformFeedbackImpl, public angle::Observer > size_t xfbBufferCount, > VkDescriptorSet descSet) const; > void updateDescriptorSet(ContextVk *contextVk, >- const gl::ProgramState &programState, >+ const gl::ProgramExecutable &executable, > const ShaderInterfaceVariableInfoMap &variableInfoMap, > VkDescriptorSet descSet) const; > void getBufferOffsets(ContextVk *contextVk, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.cpp >index 94b55c14252db817b5d436016412ff817244154b..9a689a427cac33bfd157c27b96390adac6379e95 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.cpp >@@ -1426,82 +1426,92 @@ angle::Result UtilsVk::ensureSamplersInitialized(ContextVk *contextVk) > return angle::Result::Continue; > } > >-angle::Result UtilsVk::setupProgram(ContextVk *contextVk, >- Function function, >- vk::RefCounted<vk::ShaderAndSerial> *fsCsShader, >- vk::RefCounted<vk::ShaderAndSerial> *vsShader, >- vk::ShaderProgramHelper *program, >- const vk::GraphicsPipelineDesc *pipelineDesc, >- const VkDescriptorSet descriptorSet, >- const void *pushConstants, >- size_t pushConstantsSize, >- vk::CommandBuffer *commandBuffer) >+angle::Result UtilsVk::setupComputeProgram(ContextVk *contextVk, >+ Function function, >+ vk::RefCounted<vk::ShaderAndSerial> *csShader, >+ vk::ShaderProgramHelper *program, >+ const VkDescriptorSet descriptorSet, >+ const void *pushConstants, >+ size_t pushConstantsSize, >+ vk::OutsideRenderPassCommandBuffer *commandBuffer) > { >- RendererVk *renderer = contextVk->getRenderer(); >+ ASSERT(function >= Function::ComputeStartIndex); > >- const bool isCompute = function >= Function::ComputeStartIndex; >- const VkShaderStageFlags pushConstantsShaderStage = >- isCompute ? VK_SHADER_STAGE_COMPUTE_BIT : VK_SHADER_STAGE_FRAGMENT_BIT; >- const VkPipelineBindPoint pipelineBindPoint = >- isCompute ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS; >+ const vk::BindingPointer<vk::PipelineLayout> &pipelineLayout = mPipelineLayouts[function]; > >- // If compute, vsShader and pipelineDesc should be nullptr, and if not compute they shouldn't >- // be. >- ASSERT(isCompute != (vsShader && pipelineDesc)); >+ vk::PipelineHelper *pipeline; >+ program->setShader(gl::ShaderType::Compute, csShader); >+ ANGLE_TRY(program->getComputePipeline(contextVk, pipelineLayout.get(), &pipeline)); >+ pipeline->retain(&contextVk->getResourceUseList()); >+ commandBuffer->bindComputePipeline(pipeline->getPipeline()); > >- const vk::BindingPointer<vk::PipelineLayout> &pipelineLayout = mPipelineLayouts[function]; >+ contextVk->invalidateComputePipelineBinding(); > >- if (isCompute) >+ if (descriptorSet != VK_NULL_HANDLE) > { >- vk::PipelineHelper *pipeline; >- program->setShader(gl::ShaderType::Compute, fsCsShader); >- ANGLE_TRY(program->getComputePipeline(contextVk, pipelineLayout.get(), &pipeline)); >- pipeline->retain(&contextVk->getResourceUseList()); >- commandBuffer->bindComputePipeline(pipeline->getPipeline()); >- >- contextVk->invalidateComputePipelineBinding(); >+ commandBuffer->bindDescriptorSets(pipelineLayout.get(), VK_PIPELINE_BIND_POINT_COMPUTE, >+ DescriptorSetIndex::Internal, 1, &descriptorSet, 0, >+ nullptr); >+ contextVk->invalidateComputeDescriptorSet(DescriptorSetIndex::Internal); > } >- else >+ >+ if (pushConstants) > { >- program->setShader(gl::ShaderType::Vertex, vsShader); >- if (fsCsShader) >- { >- program->setShader(gl::ShaderType::Fragment, fsCsShader); >- } >+ commandBuffer->pushConstants(pipelineLayout.get(), VK_SHADER_STAGE_COMPUTE_BIT, 0, >+ static_cast<uint32_t>(pushConstantsSize), pushConstants); >+ } >+ >+ return angle::Result::Continue; >+} >+ >+angle::Result UtilsVk::setupGraphicsProgram(ContextVk *contextVk, >+ Function function, >+ vk::RefCounted<vk::ShaderAndSerial> *vsShader, >+ vk::RefCounted<vk::ShaderAndSerial> *fsShader, >+ vk::ShaderProgramHelper *program, >+ const vk::GraphicsPipelineDesc *pipelineDesc, >+ const VkDescriptorSet descriptorSet, >+ const void *pushConstants, >+ size_t pushConstantsSize, >+ vk::RenderPassCommandBuffer *commandBuffer) >+{ >+ RendererVk *renderer = contextVk->getRenderer(); > >- // This value is not used but is passed to getGraphicsPipeline to avoid a nullptr check. >- const vk::GraphicsPipelineDesc *descPtr; >- vk::PipelineHelper *helper; >- vk::PipelineCache *pipelineCache = nullptr; >- ANGLE_TRY(renderer->getPipelineCache(&pipelineCache)); >- ANGLE_TRY(program->getGraphicsPipeline(contextVk, &contextVk->getRenderPassCache(), >- *pipelineCache, pipelineLayout.get(), *pipelineDesc, >- gl::AttributesMask(), gl::ComponentTypeMask(), >- gl::DrawBufferMask(), &descPtr, &helper)); >- helper->retain(&contextVk->getResourceUseList()); >- commandBuffer->bindGraphicsPipeline(helper->getPipeline()); >+ ASSERT(function < Function::ComputeStartIndex); > >- contextVk->invalidateGraphicsPipelineBinding(); >+ const vk::BindingPointer<vk::PipelineLayout> &pipelineLayout = mPipelineLayouts[function]; >+ >+ program->setShader(gl::ShaderType::Vertex, vsShader); >+ if (fsShader) >+ { >+ program->setShader(gl::ShaderType::Fragment, fsShader); > } > >+ // This value is not used but is passed to getGraphicsPipeline to avoid a nullptr check. >+ const vk::GraphicsPipelineDesc *descPtr; >+ vk::PipelineHelper *helper; >+ vk::PipelineCache *pipelineCache = nullptr; >+ ANGLE_TRY(renderer->getPipelineCache(&pipelineCache)); >+ ANGLE_TRY(program->getGraphicsPipeline(contextVk, &contextVk->getRenderPassCache(), >+ *pipelineCache, pipelineLayout.get(), *pipelineDesc, >+ gl::AttributesMask(), gl::ComponentTypeMask(), >+ gl::DrawBufferMask(), &descPtr, &helper)); >+ helper->retain(&contextVk->getResourceUseList()); >+ commandBuffer->bindGraphicsPipeline(helper->getPipeline()); >+ >+ contextVk->invalidateGraphicsPipelineBinding(); >+ > if (descriptorSet != VK_NULL_HANDLE) > { >- commandBuffer->bindDescriptorSets(pipelineLayout.get(), pipelineBindPoint, >+ commandBuffer->bindDescriptorSets(pipelineLayout.get(), VK_PIPELINE_BIND_POINT_GRAPHICS, > DescriptorSetIndex::Internal, 1, &descriptorSet, 0, > nullptr); >- if (isCompute) >- { >- contextVk->invalidateComputeDescriptorSet(DescriptorSetIndex::Internal); >- } >- else >- { >- contextVk->invalidateGraphicsDescriptorSet(DescriptorSetIndex::Internal); >- } >+ contextVk->invalidateGraphicsDescriptorSet(DescriptorSetIndex::Internal); > } > > if (pushConstants) > { >- commandBuffer->pushConstants(pipelineLayout.get(), pushConstantsShaderStage, 0, >+ commandBuffer->pushConstants(pipelineLayout.get(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, > static_cast<uint32_t>(pushConstantsSize), pushConstants); > } > >@@ -1519,7 +1529,7 @@ angle::Result UtilsVk::convertIndexBuffer(ContextVk *contextVk, > access.onBufferComputeShaderRead(src); > access.onBufferComputeShaderWrite(dst); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkDescriptorSet descriptorSet; >@@ -1554,9 +1564,9 @@ angle::Result UtilsVk::convertIndexBuffer(ContextVk *contextVk, > vk::RefCounted<vk::ShaderAndSerial> *shader = nullptr; > ANGLE_TRY(contextVk->getShaderLibrary().getConvertIndex_comp(contextVk, flags, &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::ConvertIndexBuffer, shader, nullptr, >- &mConvertIndexPrograms[flags], nullptr, descriptorSet, &shaderParams, >- sizeof(ConvertIndexShaderParams), commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::ConvertIndexBuffer, shader, >+ &mConvertIndexPrograms[flags], descriptorSet, &shaderParams, >+ sizeof(ConvertIndexShaderParams), commandBuffer)); > > constexpr uint32_t kInvocationsPerGroup = 64; > constexpr uint32_t kInvocationsPerIndex = 2; >@@ -1585,7 +1595,7 @@ angle::Result UtilsVk::convertIndexIndirectBuffer(ContextVk *contextVk, > access.onBufferComputeShaderWrite(dstIndirectBuf); > access.onBufferComputeShaderWrite(dstIndexBuf); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkDescriptorSet descriptorSet; >@@ -1625,9 +1635,9 @@ angle::Result UtilsVk::convertIndexIndirectBuffer(ContextVk *contextVk, > vk::RefCounted<vk::ShaderAndSerial> *shader = nullptr; > ANGLE_TRY(contextVk->getShaderLibrary().getConvertIndex_comp(contextVk, flags, &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::ConvertIndexIndirectBuffer, shader, nullptr, >- &mConvertIndexPrograms[flags], nullptr, descriptorSet, &shaderParams, >- sizeof(ConvertIndexIndirectShaderParams), commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::ConvertIndexIndirectBuffer, shader, >+ &mConvertIndexPrograms[flags], descriptorSet, &shaderParams, >+ sizeof(ConvertIndexIndirectShaderParams), commandBuffer)); > > constexpr uint32_t kInvocationsPerGroup = 64; > constexpr uint32_t kInvocationsPerIndex = 2; >@@ -1657,7 +1667,7 @@ angle::Result UtilsVk::convertLineLoopIndexIndirectBuffer( > access.onBufferComputeShaderWrite(dstIndirectBuffer); > access.onBufferComputeShaderWrite(dstIndexBuffer); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkDescriptorSet descriptorSet; >@@ -1697,10 +1707,10 @@ angle::Result UtilsVk::convertLineLoopIndexIndirectBuffer( > ANGLE_TRY(contextVk->getShaderLibrary().getConvertIndexIndirectLineLoop_comp(contextVk, flags, > &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::ConvertIndexIndirectLineLoopBuffer, shader, nullptr, >- &mConvertIndexIndirectLineLoopPrograms[flags], nullptr, descriptorSet, >- &shaderParams, sizeof(ConvertIndexIndirectLineLoopShaderParams), >- commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::ConvertIndexIndirectLineLoopBuffer, shader, >+ &mConvertIndexIndirectLineLoopPrograms[flags], descriptorSet, >+ &shaderParams, sizeof(ConvertIndexIndirectLineLoopShaderParams), >+ commandBuffer)); > > commandBuffer->dispatch(1, 1, 1); > >@@ -1723,7 +1733,7 @@ angle::Result UtilsVk::convertLineLoopArrayIndirectBuffer( > access.onBufferComputeShaderWrite(dstIndirectBuffer); > access.onBufferComputeShaderWrite(dstIndexBuffer); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkDescriptorSet descriptorSet; >@@ -1760,10 +1770,10 @@ angle::Result UtilsVk::convertLineLoopArrayIndirectBuffer( > ANGLE_TRY( > contextVk->getShaderLibrary().getConvertIndirectLineLoop_comp(contextVk, flags, &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::ConvertIndirectLineLoopBuffer, shader, nullptr, >- &mConvertIndirectLineLoopPrograms[flags], nullptr, descriptorSet, >- &shaderParams, sizeof(ConvertIndirectLineLoopShaderParams), >- commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::ConvertIndirectLineLoopBuffer, shader, >+ &mConvertIndirectLineLoopPrograms[flags], descriptorSet, >+ &shaderParams, sizeof(ConvertIndirectLineLoopShaderParams), >+ commandBuffer)); > > commandBuffer->dispatch(1, 1, 1); > >@@ -1781,7 +1791,7 @@ angle::Result UtilsVk::convertVertexBuffer(ContextVk *contextVk, > access.onBufferComputeShaderRead(src); > access.onBufferComputeShaderWrite(dst); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > ConvertVertexShaderParams shaderParams; >@@ -1886,7 +1896,7 @@ angle::Result UtilsVk::convertVertexBufferImpl(ContextVk *contextVk, > vk::BufferHelper *dst, > vk::BufferHelper *src, > uint32_t flags, >- vk::CommandBuffer *commandBuffer, >+ vk::OutsideRenderPassCommandBuffer *commandBuffer, > const ConvertVertexShaderParams &shaderParams) > { > ANGLE_TRY(ensureConvertVertexResourcesInitialized(contextVk)); >@@ -1916,9 +1926,9 @@ angle::Result UtilsVk::convertVertexBufferImpl(ContextVk *contextVk, > vk::RefCounted<vk::ShaderAndSerial> *shader = nullptr; > ANGLE_TRY(contextVk->getShaderLibrary().getConvertVertex_comp(contextVk, flags, &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::ConvertVertexBuffer, shader, nullptr, >- &mConvertVertexPrograms[flags], nullptr, descriptorSet, &shaderParams, >- sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::ConvertVertexBuffer, shader, >+ &mConvertVertexPrograms[flags], descriptorSet, &shaderParams, >+ sizeof(shaderParams), commandBuffer)); > > commandBuffer->dispatch(UnsignedCeilDivide(shaderParams.outputCount, 64), 1, 1); > >@@ -1932,7 +1942,7 @@ angle::Result UtilsVk::startRenderPass(ContextVk *contextVk, > const vk::ImageView *imageView, > const vk::RenderPassDesc &renderPassDesc, > const gl::Rectangle &renderArea, >- vk::CommandBuffer **commandBufferOut) >+ vk::RenderPassCommandBuffer **commandBufferOut) > { > vk::RenderPass *compatibleRenderPass = nullptr; > ANGLE_TRY(contextVk->getCompatibleRenderPass(renderPassDesc, &compatibleRenderPass)); >@@ -1977,7 +1987,7 @@ angle::Result UtilsVk::clearFramebuffer(ContextVk *contextVk, > > const gl::Rectangle &scissoredRenderArea = params.clearArea; > vk::Framebuffer *currentFramebuffer = nullptr; >- vk::CommandBuffer *commandBuffer; >+ vk::RenderPassCommandBuffer *commandBuffer; > > // Start a new render pass if not already started > ANGLE_TRY(framebuffer->getFramebuffer(contextVk, ¤tFramebuffer, nullptr)); >@@ -1992,7 +2002,7 @@ angle::Result UtilsVk::clearFramebuffer(ContextVk *contextVk, > > if (params.clearStencil || params.clearDepth) > { >- vk::CommandBufferHelper *renderpassCommands; >+ vk::RenderPassCommandBufferHelper *renderpassCommands; > renderpassCommands = &contextVk->getStartedRenderPassCommands(); > > // Because clear is not affected by depth/stencil test, we have to explicitly mark >@@ -2101,9 +2111,9 @@ angle::Result UtilsVk::clearFramebuffer(ContextVk *contextVk, > contextVk->getStartedRenderPassCommands().isTransformFeedbackActiveUnpaused(); > contextVk->pauseTransformFeedbackIfActiveUnpaused(); > >- ANGLE_TRY(setupProgram(contextVk, Function::ImageClear, fragmentShader, vertexShader, >- imageClearProgram, &pipelineDesc, VK_NULL_HANDLE, &shaderParams, >- sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupGraphicsProgram(contextVk, Function::ImageClear, vertexShader, fragmentShader, >+ imageClearProgram, &pipelineDesc, VK_NULL_HANDLE, &shaderParams, >+ sizeof(shaderParams), commandBuffer)); > > // Make sure this draw call doesn't count towards occlusion query results. > contextVk->pauseRenderPassQueriesIfActive(); >@@ -2178,7 +2188,7 @@ angle::Result UtilsVk::clearImage(ContextVk *contextVk, > pipelineDesc.setRasterizationSamples(dst->getSamples()); > pipelineDesc.setRenderPassDesc(renderPassDesc); > >- vk::CommandBuffer *commandBuffer; >+ vk::RenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(startRenderPass(contextVk, dst, &destView.get(), renderPassDesc, renderArea, > &commandBuffer)); > >@@ -2203,9 +2213,9 @@ angle::Result UtilsVk::clearImage(ContextVk *contextVk, > ANGLE_TRY(shaderLibrary.getFullScreenTri_vert(contextVk, 0, &vertexShader)); > ANGLE_TRY(shaderLibrary.getImageClear_frag(contextVk, flags, &fragmentShader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::ImageClear, fragmentShader, vertexShader, >- &mImageClearPrograms[flags], &pipelineDesc, VK_NULL_HANDLE, >- &shaderParams, sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupGraphicsProgram(contextVk, Function::ImageClear, vertexShader, fragmentShader, >+ &mImageClearPrograms[flags], &pipelineDesc, VK_NULL_HANDLE, >+ &shaderParams, sizeof(shaderParams), commandBuffer)); > > // Note: this utility creates its own framebuffer, thus bypassing ContextVk::startRenderPass. > // As such, occlusion queries are not enabled. >@@ -2407,7 +2417,7 @@ angle::Result UtilsVk::blitResolveImpl(ContextVk *contextVk, > SetStencilForShaderExport(contextVk, &pipelineDesc); > } > >- vk::CommandBuffer *commandBuffer; >+ vk::RenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(framebuffer->startNewRenderPass(contextVk, params.blitArea, &commandBuffer, nullptr)); > > VkViewport viewport; >@@ -2424,7 +2434,8 @@ angle::Result UtilsVk::blitResolveImpl(ContextVk *contextVk, > contextVk->onImageRenderPassRead(src->getAspectFlags(), vk::ImageLayout::FragmentShaderReadOnly, > src); > >- vk::CommandBufferHelper *renderPassCommands = &contextVk->getStartedRenderPassCommands(); >+ vk::RenderPassCommandBufferHelper *renderPassCommands = >+ &contextVk->getStartedRenderPassCommands(); > if (blitDepth) > { > // Explicitly mark a depth write because we are modifying the depth buffer. >@@ -2500,9 +2511,9 @@ angle::Result UtilsVk::blitResolveImpl(ContextVk *contextVk, > ANGLE_TRY(shaderLibrary.getFullScreenTri_vert(contextVk, 0, &vertexShader)); > ANGLE_TRY(shaderLibrary.getBlitResolve_frag(contextVk, flags, &fragmentShader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::BlitResolve, fragmentShader, vertexShader, >- &mBlitResolvePrograms[flags], &pipelineDesc, descriptorSet, >- &shaderParams, sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupGraphicsProgram(contextVk, Function::BlitResolve, vertexShader, fragmentShader, >+ &mBlitResolvePrograms[flags], &pipelineDesc, descriptorSet, >+ &shaderParams, sizeof(shaderParams), commandBuffer)); > > // Note: this utility starts the render pass directly, thus bypassing > // ContextVk::startRenderPass. As such, occlusion queries are not enabled. >@@ -2634,7 +2645,7 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk, > depthStencilRenderTarget->getLayerIndex(), 1, > depthStencilImage->getAspectFlags(), depthStencilImage); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > // Blit/resolve stencil into the buffer. >@@ -2678,9 +2689,9 @@ angle::Result UtilsVk::stencilBlitResolveNoShaderExport(ContextVk *contextVk, > ANGLE_TRY(contextVk->getShaderLibrary().getBlitResolveStencilNoExport_comp(contextVk, flags, > &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::BlitResolveStencilNoExport, shader, nullptr, >- &mBlitResolveStencilNoExportPrograms[flags], nullptr, descriptorSet, >- &shaderParams, sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::BlitResolveStencilNoExport, shader, >+ &mBlitResolveStencilNoExportPrograms[flags], descriptorSet, >+ &shaderParams, sizeof(shaderParams), commandBuffer)); > commandBuffer->dispatch(UnsignedCeilDivide(bufferRowLengthInUints, 8), > UnsignedCeilDivide(params.blitArea.height, 8), 1); > descriptorPoolBinding.reset(); >@@ -2851,7 +2862,7 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk, > std::swap(renderArea.width, renderArea.height); > } > >- vk::CommandBuffer *commandBuffer; >+ vk::RenderPassCommandBuffer *commandBuffer; > ANGLE_TRY( > startRenderPass(contextVk, dst, destView, renderPassDesc, renderArea, &commandBuffer)); > >@@ -2890,9 +2901,9 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk, > ANGLE_TRY(shaderLibrary.getFullScreenTri_vert(contextVk, 0, &vertexShader)); > ANGLE_TRY(shaderLibrary.getImageCopy_frag(contextVk, flags, &fragmentShader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::ImageCopy, fragmentShader, vertexShader, >- &mImageCopyPrograms[flags], &pipelineDesc, descriptorSet, &shaderParams, >- sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupGraphicsProgram(contextVk, Function::ImageCopy, vertexShader, fragmentShader, >+ &mImageCopyPrograms[flags], &pipelineDesc, descriptorSet, >+ &shaderParams, sizeof(shaderParams), commandBuffer)); > > // Note: this utility creates its own framebuffer, thus bypassing ContextVk::startRenderPass. > // As such, occlusion queries are not enabled. >@@ -2984,7 +2995,7 @@ angle::Result UtilsVk::copyImageBits(ContextVk *contextVk, > isDst3D ? 1 : params.copyExtents[2], VK_IMAGE_ASPECT_COLOR_BIT, > dst); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > // Copy src into buffer, completely packed. >@@ -3195,12 +3206,12 @@ angle::Result UtilsVk::generateMipmap(ContextVk *contextVk, > > // Note: onImageRead/onImageWrite is expected to be called by the caller. This avoids inserting > // barriers between calls for each layer of the image. >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > >- ANGLE_TRY(setupProgram(contextVk, Function::GenerateMipmap, shader, nullptr, >- &mGenerateMipmapPrograms[flags], nullptr, descriptorSet, &shaderParams, >- sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::GenerateMipmap, shader, >+ &mGenerateMipmapPrograms[flags], descriptorSet, &shaderParams, >+ sizeof(shaderParams), commandBuffer)); > > commandBuffer->dispatch(workGroupX, workGroupY, 1); > descriptorPoolBinding.reset(); >@@ -3301,7 +3312,7 @@ angle::Result UtilsVk::unresolve(ContextVk *contextVk, > SetStencilForShaderExport(contextVk, &pipelineDesc); > } > >- vk::CommandBuffer *commandBuffer = >+ vk::RenderPassCommandBuffer *commandBuffer = > &contextVk->getStartedRenderPassCommands().getCommandBuffer(); > > VkViewport viewport; >@@ -3365,9 +3376,9 @@ angle::Result UtilsVk::unresolve(ContextVk *contextVk, > ANGLE_TRY(GetUnresolveFrag(contextVk, colorAttachmentCount, colorAttachmentTypes, > params.unresolveDepth, params.unresolveStencil, fragmentShader)); > >- ANGLE_TRY(setupProgram(contextVk, function, fragmentShader, vertexShader, >- &mUnresolvePrograms[flags], &pipelineDesc, descriptorSet, nullptr, 0, >- commandBuffer)); >+ ANGLE_TRY(setupGraphicsProgram(contextVk, function, vertexShader, fragmentShader, >+ &mUnresolvePrograms[flags], &pipelineDesc, descriptorSet, >+ nullptr, 0, commandBuffer)); > // This draw call is made before ContextVk gets a chance to start the occlusion query. As such, > // occlusion queries are not enabled. > commandBuffer->draw(3, 0); >@@ -3390,21 +3401,16 @@ angle::Result UtilsVk::cullOverlayWidgets(ContextVk *contextVk, > { > ANGLE_TRY(ensureOverlayCullResourcesInitialized(contextVk)); > >- ASSERT(params.subgroupSize[0] == 8 && >- (params.subgroupSize[1] == 8 || params.subgroupSize[1] == 4)); >+ // Currently, only subgroupSize of 16, 32 and 64 are supported >+ ASSERT((params.subgroupSize[0] == 8 && >+ (params.subgroupSize[1] == 8 || params.subgroupSize[1] == 4)) || >+ (params.subgroupSize[0] == 4 && params.subgroupSize[1] == 4)); >+ > uint32_t flags = > params.subgroupSize[1] == 8 ? OverlayCull_comp::kIs8x8 : OverlayCull_comp::kIs8x4; >- if (params.supportsSubgroupBallot) >- { >- flags |= OverlayCull_comp::kSupportsBallot; >- } >- else if (params.supportsSubgroupBallot) >- { >- flags |= OverlayCull_comp::kSupportsArithmetic; >- } >- else >+ if (params.subgroupSize[0] == 4) > { >- flags |= OverlayCull_comp::kSupportsNone; >+ flags = OverlayCull_comp::kIs4x4; > } > > VkDescriptorSet descriptorSet; >@@ -3419,7 +3425,7 @@ angle::Result UtilsVk::cullOverlayWidgets(ContextVk *contextVk, > access.onBufferComputeShaderRead(enabledWidgetsBuffer); > access.onImageComputeShaderWrite(gl::LevelIndex(0), 1, 0, 1, VK_IMAGE_ASPECT_COLOR_BIT, dst); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkDescriptorImageInfo imageInfo = {}; >@@ -3451,9 +3457,9 @@ angle::Result UtilsVk::cullOverlayWidgets(ContextVk *contextVk, > vk::RefCounted<vk::ShaderAndSerial> *shader = nullptr; > ANGLE_TRY(contextVk->getShaderLibrary().getOverlayCull_comp(contextVk, flags, &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::OverlayCull, shader, nullptr, >- &mOverlayCullPrograms[flags], nullptr, descriptorSet, nullptr, 0, >- commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::OverlayCull, shader, >+ &mOverlayCullPrograms[flags], descriptorSet, nullptr, 0, >+ commandBuffer)); > > commandBuffer->dispatch(dst->getExtents().width, dst->getExtents().height, 1); > descriptorPoolBinding.reset(); >@@ -3479,11 +3485,19 @@ angle::Result UtilsVk::drawOverlay(ContextVk *contextVk, > shaderParams.outputSize[1] = dst->getExtents().height; > shaderParams.rotateXY = params.rotateXY; > >- ASSERT(params.subgroupSize[0] == 8 && >- (params.subgroupSize[1] == 8 || params.subgroupSize[1] == 4)); >+ // subgroupSize 8x8 or 8x4 supports desktop, and subgroupSize 4x4 supports Android devices >+ ASSERT((params.subgroupSize[0] == 8 && >+ (params.subgroupSize[1] == 8 || params.subgroupSize[1] == 4)) || >+ (params.subgroupSize[0] == 4 && params.subgroupSize[1] == 4)); >+ > uint32_t flags = > params.subgroupSize[1] == 8 ? OverlayDraw_comp::kIs8x8 : OverlayDraw_comp::kIs8x4; > >+ if (params.subgroupSize[0] == 4) >+ { >+ flags = OverlayDraw_comp::kIs4x4; >+ } >+ > VkDescriptorSet descriptorSet; > vk::RefCountedDescriptorPoolBinding descriptorPoolBinding; > ANGLE_TRY(allocateDescriptorSet(contextVk, Function::OverlayDraw, &descriptorPoolBinding, >@@ -3499,7 +3513,7 @@ angle::Result UtilsVk::drawOverlay(ContextVk *contextVk, > access.onBufferComputeShaderRead(textWidgetsBuffer); > access.onBufferComputeShaderRead(graphWidgetsBuffer); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > VkDescriptorImageInfo imageInfos[3] = {}; >@@ -3559,9 +3573,9 @@ angle::Result UtilsVk::drawOverlay(ContextVk *contextVk, > vk::RefCounted<vk::ShaderAndSerial> *shader = nullptr; > ANGLE_TRY(contextVk->getShaderLibrary().getOverlayDraw_comp(contextVk, flags, &shader)); > >- ANGLE_TRY(setupProgram(contextVk, Function::OverlayDraw, shader, nullptr, >- &mOverlayDrawPrograms[flags], nullptr, descriptorSet, &shaderParams, >- sizeof(shaderParams), commandBuffer)); >+ ANGLE_TRY(setupComputeProgram(contextVk, Function::OverlayDraw, shader, >+ &mOverlayDrawPrograms[flags], descriptorSet, &shaderParams, >+ sizeof(shaderParams), commandBuffer)); > > // Every pixel of culledWidgets corresponds to one workgroup, so we can use that as dispatch > // size. >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.h >index dc80611ef80b4e73471ea4f6eeafb9676f9abd78..cf22403bde0c81248e31597665c8ff14631e0588 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/UtilsVk.h >@@ -176,8 +176,6 @@ class UtilsVk : angle::NonCopyable > struct OverlayCullParameters > { > uint32_t subgroupSize[2]; >- bool supportsSubgroupBallot; >- bool supportsSubgroupArithmetic; > }; > > struct OverlayDrawParameters >@@ -481,21 +479,26 @@ class UtilsVk : angle::NonCopyable > EnumCount = 22, > }; > >- // Common function that creates the pipeline for the specified function, binds it and prepares >- // the draw/dispatch call. If function >= ComputeStartIndex, fsCsShader is expected to be a >- // compute shader, vsShader and pipelineDesc should be nullptr, and this will set up a dispatch >- // call. Otherwise fsCsShader is expected to be a fragment shader and this will set up a draw >- // call. >- angle::Result setupProgram(ContextVk *contextVk, >- Function function, >- vk::RefCounted<vk::ShaderAndSerial> *fsCsShader, >- vk::RefCounted<vk::ShaderAndSerial> *vsShader, >- vk::ShaderProgramHelper *program, >- const vk::GraphicsPipelineDesc *pipelineDesc, >- const VkDescriptorSet descriptorSet, >- const void *pushConstants, >- size_t pushConstantsSize, >- vk::CommandBuffer *commandBuffer); >+ // Common functions that create the pipeline for the specified function, binds it and prepares >+ // the draw/dispatch call. >+ angle::Result setupComputeProgram(ContextVk *contextVk, >+ Function function, >+ vk::RefCounted<vk::ShaderAndSerial> *csShader, >+ vk::ShaderProgramHelper *program, >+ const VkDescriptorSet descriptorSet, >+ const void *pushConstants, >+ size_t pushConstantsSize, >+ vk::OutsideRenderPassCommandBuffer *commandBuffer); >+ angle::Result setupGraphicsProgram(ContextVk *contextVk, >+ Function function, >+ vk::RefCounted<vk::ShaderAndSerial> *vsShader, >+ vk::RefCounted<vk::ShaderAndSerial> *fsShader, >+ vk::ShaderProgramHelper *program, >+ const vk::GraphicsPipelineDesc *pipelineDesc, >+ const VkDescriptorSet descriptorSet, >+ const void *pushConstants, >+ size_t pushConstantsSize, >+ vk::RenderPassCommandBuffer *commandBuffer); > > // Initializes descriptor set layout, pipeline layout and descriptor pool corresponding to given > // function, if not already initialized. Uses setSizes to create the layout. For example, if >@@ -533,14 +536,14 @@ class UtilsVk : angle::NonCopyable > const vk::ImageView *imageView, > const vk::RenderPassDesc &renderPassDesc, > const gl::Rectangle &renderArea, >- vk::CommandBuffer **commandBufferOut); >+ vk::RenderPassCommandBuffer **commandBufferOut); > > // Set up descriptor set and call dispatch. > angle::Result convertVertexBufferImpl(ContextVk *contextVk, > vk::BufferHelper *dst, > vk::BufferHelper *src, > uint32_t flags, >- vk::CommandBuffer *commandBuffer, >+ vk::OutsideRenderPassCommandBuffer *commandBuffer, > const ConvertVertexShaderParams &shaderParams); > > // Blits or resolves either color or depth/stencil, based on which view is given. >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp >index bfd204c7374920fb5a674d93666b73cc6c9883ae..b2f3b84ce4d004f50a26271a1d65e22ff7d01e2a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp >@@ -24,10 +24,6 @@ namespace rx > { > namespace > { >-constexpr size_t kDynamicVertexDataSize = 1024 * 1024; >-constexpr size_t kDynamicIndexDataSize = 1024 * 8; >-constexpr size_t kDynamicIndirectDataSize = sizeof(VkDrawIndexedIndirectCommand) * 8; >- > ANGLE_INLINE bool BindingIsAligned(const gl::VertexBinding &binding, > const angle::Format &angleFormat, > unsigned int attribSize, >@@ -67,44 +63,74 @@ void WarnOnVertexFormatConversion(ContextVk *contextVk, > } > > angle::Result StreamVertexData(ContextVk *contextVk, >- vk::DynamicBuffer *dynamicBuffer, >- const uint8_t *sourceData, >+ vk::BufferHelper *dstBufferHelper, >+ const uint8_t *srcData, > size_t bytesToAllocate, >- size_t destOffset, >+ size_t dstOffset, > size_t vertexCount, >- size_t sourceStride, >- size_t destStride, >- VertexCopyFunction vertexLoadFunction, >- vk::BufferHelper **bufferOut, >- VkDeviceSize *bufferOffsetOut, >- uint32_t replicateCount) >+ size_t srcStride, >+ VertexCopyFunction vertexLoadFunction) > { >- uint8_t *dst = nullptr; >- ANGLE_TRY(dynamicBuffer->allocate(contextVk, bytesToAllocate, &dst, nullptr, bufferOffsetOut, >- nullptr)); >- *bufferOut = dynamicBuffer->getCurrentBuffer(); >- dst += destOffset; >- if (replicateCount == 1) >+ RendererVk *renderer = contextVk->getRenderer(); >+ >+ // Allocate buffer for results >+ ANGLE_TRY(dstBufferHelper->allocateForVertexConversion(contextVk, bytesToAllocate, >+ vk::MemoryHostVisibility::Visible)); >+ uint8_t *dst = dstBufferHelper->getMappedMemory() + dstOffset; >+ >+ vertexLoadFunction(srcData, srcStride, vertexCount, dst); >+ >+ ANGLE_TRY(dstBufferHelper->flush(renderer)); >+ >+ return angle::Result::Continue; >+} >+ >+angle::Result StreamVertexDataWithDivisor(ContextVk *contextVk, >+ vk::BufferHelper *dstBufferHelper, >+ const uint8_t *srcData, >+ size_t bytesToAllocate, >+ size_t srcStride, >+ size_t dstStride, >+ VertexCopyFunction vertexLoadFunction, >+ uint32_t divisor, >+ size_t numSrcVertices) >+{ >+ RendererVk *renderer = contextVk->getRenderer(); >+ >+ // Allocate buffer for results >+ ANGLE_TRY(dstBufferHelper->allocateForVertexConversion(contextVk, bytesToAllocate, >+ vk::MemoryHostVisibility::Visible)); >+ uint8_t *dst = dstBufferHelper->getMappedMemory(); >+ >+ // Each source vertex is used `divisor` times before advancing. Clamp to avoid OOB reads. >+ size_t clampedSize = std::min(numSrcVertices * dstStride * divisor, bytesToAllocate); >+ >+ ASSERT(clampedSize % dstStride == 0); >+ ASSERT(divisor > 0); >+ >+ uint32_t srcVertexUseCount = 0; >+ for (size_t dataCopied = 0; dataCopied < clampedSize; dataCopied += dstStride, dst += dstStride) > { >- vertexLoadFunction(sourceData, sourceStride, vertexCount, dst); >+ vertexLoadFunction(srcData, srcStride, 1, dst); >+ srcVertexUseCount++; >+ if (srcVertexUseCount == divisor) >+ { >+ srcData += srcStride; >+ srcVertexUseCount = 0; >+ } > } >- else >+ >+ // Satisfy robustness constraints (only if extension enabled) >+ if (contextVk->getExtensions().robustnessEXT) > { >- ASSERT(replicateCount > 1); >- uint32_t sourceRemainingCount = replicateCount - 1; >- for (size_t dataCopied = 0; dataCopied < bytesToAllocate; >- dataCopied += destStride, dst += destStride, sourceRemainingCount--) >+ if (clampedSize < bytesToAllocate) > { >- vertexLoadFunction(sourceData, sourceStride, 1, dst); >- if (sourceRemainingCount == 0) >- { >- sourceData += sourceStride; >- sourceRemainingCount = replicateCount; >- } >+ memset(dst + clampedSize, 0, bytesToAllocate - clampedSize); > } > } > >- ANGLE_TRY(dynamicBuffer->flush(contextVk)); >+ ANGLE_TRY(dstBufferHelper->flush(renderer)); >+ > return angle::Result::Continue; > } > >@@ -116,6 +142,7 @@ size_t GetVertexCount(BufferVk *srcBuffer, const gl::VertexBinding &binding, uin > return 0; > > // Count the last vertex. It may occupy less than a full stride. >+ // This is also correct if stride happens to be less than srcFormatSize. > size_t numVertices = 1; > bytes -= srcFormatSize; > >@@ -133,31 +160,16 @@ VertexArrayVk::VertexArrayVk(ContextVk *contextVk, const gl::VertexArrayState &s > mCurrentArrayBufferOffsets{}, > mCurrentArrayBufferRelativeOffsets{}, > mCurrentArrayBuffers{}, >- mCurrentElementArrayBufferOffset(0), > mCurrentElementArrayBuffer(nullptr), > mLineLoopHelper(contextVk->getRenderer()), > mDirtyLineLoopTranslation(true) > { >- RendererVk *renderer = contextVk->getRenderer(); > vk::BufferHelper &emptyBuffer = contextVk->getEmptyBuffer(); > > mCurrentArrayBufferHandles.fill(emptyBuffer.getBuffer().getHandle()); > mCurrentArrayBufferOffsets.fill(0); > mCurrentArrayBufferRelativeOffsets.fill(0); > mCurrentArrayBuffers.fill(&emptyBuffer); >- >- mDynamicVertexData.init(renderer, vk::kVertexBufferUsageFlags, vk::kVertexBufferAlignment, >- kDynamicVertexDataSize, true, vk::DynamicBufferPolicy::OneShotUse); >- >- // We use an alignment of four for index data. This ensures that compute shaders can read index >- // elements from "uint" aligned addresses. >- mDynamicIndexData.init(renderer, vk::kIndexBufferUsageFlags, vk::kIndexBufferAlignment, >- kDynamicIndexDataSize, true, vk::DynamicBufferPolicy::OneShotUse); >- mTranslatedByteIndexData.init(renderer, vk::kIndexBufferUsageFlags, vk::kIndexBufferAlignment, >- kDynamicIndexDataSize, true, vk::DynamicBufferPolicy::OneShotUse); >- mTranslatedByteIndirectData.init(renderer, vk::kIndirectBufferUsageFlags, >- vk::kIndirectBufferAlignment, kDynamicIndirectDataSize, true, >- vk::DynamicBufferPolicy::OneShotUse); > } > > VertexArrayVk::~VertexArrayVk() {} >@@ -168,8 +180,11 @@ void VertexArrayVk::destroy(const gl::Context *context) > > RendererVk *renderer = contextVk->getRenderer(); > >- mDynamicVertexData.release(renderer); >- mDynamicIndexData.release(renderer); >+ for (vk::BufferHelper &bufferHelper : mStreamedVertexData) >+ { >+ bufferHelper.release(renderer); >+ } >+ mStreamedIndexData.release(renderer); > mTranslatedByteIndexData.release(renderer); > mTranslatedByteIndirectData.release(renderer); > mLineLoopHelper.release(contextVk); >@@ -182,22 +197,20 @@ angle::Result VertexArrayVk::convertIndexBufferGPU(ContextVk *contextVk, > intptr_t offsetIntoSrcData = reinterpret_cast<intptr_t>(indices); > size_t srcDataSize = static_cast<size_t>(bufferVk->getSize()) - offsetIntoSrcData; > >- mTranslatedByteIndexData.releaseInFlightBuffers(contextVk); >- >- ANGLE_TRY(mTranslatedByteIndexData.allocate(contextVk, sizeof(GLushort) * srcDataSize, nullptr, >- nullptr, &mCurrentElementArrayBufferOffset, >- nullptr)); >- mCurrentElementArrayBuffer = mTranslatedByteIndexData.getCurrentBuffer(); >+ // Allocate buffer for results >+ ANGLE_TRY(mTranslatedByteIndexData.allocateForVertexConversion( >+ contextVk, sizeof(GLushort) * srcDataSize, vk::MemoryHostVisibility::NonVisible)); >+ mCurrentElementArrayBuffer = &mTranslatedByteIndexData; > >- vk::BufferHelper *dst = mTranslatedByteIndexData.getCurrentBuffer(); >+ vk::BufferHelper *dst = &mTranslatedByteIndexData; > vk::BufferHelper *src = &bufferVk->getBuffer(); > > // Copy relevant section of the source into destination at allocated offset. Note that the > // offset returned by allocate() above is in bytes. As is the indices offset pointer. > UtilsVk::ConvertIndexParameters params = {}; > params.srcOffset = static_cast<uint32_t>(offsetIntoSrcData); >- params.dstOffset = static_cast<uint32_t>(mCurrentElementArrayBufferOffset); >- params.maxIndex = static_cast<uint32_t>(bufferVk->getSize()); >+ params.dstOffset = 0; >+ params.maxIndex = static_cast<uint32_t>(bufferVk->getSize()); > > return contextVk->getUtils().convertIndexBuffer(contextVk, dst, src, params); > } >@@ -205,47 +218,36 @@ angle::Result VertexArrayVk::convertIndexBufferGPU(ContextVk *contextVk, > angle::Result VertexArrayVk::convertIndexBufferIndirectGPU(ContextVk *contextVk, > vk::BufferHelper *srcIndirectBuf, > VkDeviceSize srcIndirectBufOffset, >- vk::BufferHelper **indirectBufferVkOut, >- VkDeviceSize *indirectBufferVkOffsetOut) >+ vk::BufferHelper **indirectBufferVkOut) > { > size_t srcDataSize = static_cast<size_t>(mCurrentElementArrayBuffer->getSize()); > ASSERT(mCurrentElementArrayBuffer == > &vk::GetImpl(getState().getElementArrayBuffer())->getBuffer()); >- ASSERT(mCurrentElementArrayBufferOffset == 0); >- >- mTranslatedByteIndexData.releaseInFlightBuffers(contextVk); >- mTranslatedByteIndirectData.releaseInFlightBuffers(contextVk); > >- vk::BufferHelper *srcIndexBuf = mCurrentElementArrayBuffer; >- VkDeviceSize srcIndexBufOffset = mCurrentElementArrayBufferOffset; >+ vk::BufferHelper *srcIndexBuf = mCurrentElementArrayBuffer; > >- VkDeviceSize dstIndirectBufOffset; >- VkDeviceSize dstIndexBufOffset; >- ANGLE_TRY(mTranslatedByteIndexData.allocate(contextVk, sizeof(GLushort) * srcDataSize, nullptr, >- nullptr, &dstIndexBufOffset, nullptr)); >- vk::BufferHelper *dstIndexBuf = mTranslatedByteIndexData.getCurrentBuffer(); >+ // Allocate buffer for results >+ ANGLE_TRY(mTranslatedByteIndexData.allocateForVertexConversion( >+ contextVk, sizeof(GLushort) * srcDataSize, vk::MemoryHostVisibility::NonVisible)); >+ vk::BufferHelper *dstIndexBuf = &mTranslatedByteIndexData; > >- ANGLE_TRY(mTranslatedByteIndirectData.allocate(contextVk, sizeof(VkDrawIndexedIndirectCommand), >- nullptr, nullptr, &dstIndirectBufOffset, >- nullptr)); >- vk::BufferHelper *dstIndirectBuf = mTranslatedByteIndirectData.getCurrentBuffer(); >+ ANGLE_TRY(mTranslatedByteIndirectData.allocateForVertexConversion( >+ contextVk, sizeof(VkDrawIndexedIndirectCommand), vk::MemoryHostVisibility::NonVisible)); >+ vk::BufferHelper *dstIndirectBuf = &mTranslatedByteIndirectData; > > // Save new element array buffer >- mCurrentElementArrayBuffer = dstIndexBuf; >- mCurrentElementArrayBufferOffset = dstIndexBufOffset; >- >+ mCurrentElementArrayBuffer = dstIndexBuf; > // Tell caller what new indirect buffer is >- *indirectBufferVkOut = dstIndirectBuf; >- *indirectBufferVkOffsetOut = dstIndirectBufOffset; >+ *indirectBufferVkOut = dstIndirectBuf; > > // Copy relevant section of the source into destination at allocated offset. Note that the > // offset returned by allocate() above is in bytes. As is the indices offset pointer. > UtilsVk::ConvertIndexIndirectParameters params = {}; > params.srcIndirectBufOffset = static_cast<uint32_t>(srcIndirectBufOffset); >- params.srcIndexBufOffset = static_cast<uint32_t>(srcIndexBufOffset); >- params.dstIndexBufOffset = static_cast<uint32_t>(dstIndexBufOffset); >+ params.srcIndexBufOffset = 0; >+ params.dstIndexBufOffset = 0; > params.maxIndex = static_cast<uint32_t>(srcDataSize); >- params.dstIndirectBufOffset = static_cast<uint32_t>(dstIndirectBufOffset); >+ params.dstIndirectBufOffset = 0; > > return contextVk->getUtils().convertIndexIndirectBuffer(contextVk, srcIndirectBuf, srcIndexBuf, > dstIndirectBuf, dstIndexBuf, params); >@@ -255,13 +257,11 @@ angle::Result VertexArrayVk::handleLineLoopIndexIndirect(ContextVk *contextVk, > gl::DrawElementsType glIndexType, > vk::BufferHelper *srcIndirectBuf, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut) >+ vk::BufferHelper **indirectBufferOut) > { > ANGLE_TRY(mLineLoopHelper.streamIndicesIndirect( >- contextVk, glIndexType, mCurrentElementArrayBuffer, mCurrentElementArrayBufferOffset, >- srcIndirectBuf, indirectBufferOffset, &mCurrentElementArrayBuffer, >- &mCurrentElementArrayBufferOffset, indirectBufferOut, indirectBufferOffsetOut)); >+ contextVk, glIndexType, mCurrentElementArrayBuffer, srcIndirectBuf, indirectBufferOffset, >+ &mCurrentElementArrayBuffer, indirectBufferOut)); > > return angle::Result::Continue; > } >@@ -269,8 +269,7 @@ angle::Result VertexArrayVk::handleLineLoopIndexIndirect(ContextVk *contextVk, > angle::Result VertexArrayVk::handleLineLoopIndirectDraw(const gl::Context *context, > vk::BufferHelper *indirectBufferVk, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut) >+ vk::BufferHelper **indirectBufferOut) > { > size_t maxVertexCount = 0; > ContextVk *contextVk = vk::GetImpl(context); >@@ -284,7 +283,7 @@ angle::Result VertexArrayVk::handleLineLoopIndirectDraw(const gl::Context *conte > { > const gl::VertexAttribute &attrib = attribs[attribIndex]; > ASSERT(attrib.enabled); >- VkDeviceSize bufSize = this->getCurrentArrayBuffers()[attribIndex]->getSize(); >+ VkDeviceSize bufSize = getCurrentArrayBuffers()[attribIndex]->getSize(); > const gl::VertexBinding &binding = bindings[attrib.bindingIndex]; > size_t stride = binding.getStride(); > size_t vertexCount = static_cast<size_t>(bufSize / stride); >@@ -295,8 +294,7 @@ angle::Result VertexArrayVk::handleLineLoopIndirectDraw(const gl::Context *conte > } > ANGLE_TRY(mLineLoopHelper.streamArrayIndirect(contextVk, maxVertexCount + 1, indirectBufferVk, > indirectBufferOffset, &mCurrentElementArrayBuffer, >- &mCurrentElementArrayBufferOffset, >- indirectBufferOut, indirectBufferOffsetOut)); >+ indirectBufferOut)); > > return angle::Result::Continue; > } >@@ -307,16 +305,14 @@ angle::Result VertexArrayVk::convertIndexBufferCPU(ContextVk *contextVk, > const void *sourcePointer) > { > ASSERT(!mState.getElementArrayBuffer() || indexType == gl::DrawElementsType::UnsignedByte); >- >- mDynamicIndexData.releaseInFlightBuffers(contextVk); >- > size_t elementSize = contextVk->getVkIndexTypeSize(indexType); > const size_t amount = elementSize * indexCount; >- GLubyte *dst = nullptr; > >- ANGLE_TRY(mDynamicIndexData.allocate(contextVk, amount, &dst, nullptr, >- &mCurrentElementArrayBufferOffset, nullptr)); >- mCurrentElementArrayBuffer = mDynamicIndexData.getCurrentBuffer(); >+ ANGLE_TRY(mStreamedIndexData.allocateForVertexConversion(contextVk, amount, >+ vk::MemoryHostVisibility::Visible)); >+ GLubyte *dst = mStreamedIndexData.getMappedMemory(); >+ >+ mCurrentElementArrayBuffer = &mStreamedIndexData; > if (contextVk->shouldConvertUint8VkIndexType(indexType)) > { > // Unsigned bytes don't have direct support in Vulkan so we have to expand the >@@ -356,11 +352,11 @@ angle::Result VertexArrayVk::convertIndexBufferCPU(ContextVk *contextVk, > // so there's no need to perform any conversion. > memcpy(dst, sourcePointer, amount); > } >- return mDynamicIndexData.flush(contextVk); >+ return mStreamedIndexData.flush(contextVk->getRenderer()); > } > > // We assume the buffer is completely full of the same kind of data and convert >-// and/or align it as we copy it to a DynamicBuffer. The assumption could be wrong >+// and/or align it as we copy it to a buffer. The assumption could be wrong > // but the alternative of copying it piecemeal on each draw would have a lot more > // overhead. > angle::Result VertexArrayVk::convertVertexBufferGPU(ContextVk *contextVk, >@@ -385,13 +381,12 @@ angle::Result VertexArrayVk::convertVertexBufferGPU(ContextVk *contextVk, > { > return angle::Result::Continue; > } >- > ASSERT(vertexFormat.getVertexInputAlignment(compressed) <= vk::kVertexBufferAlignment); > > // Allocate buffer for results >- conversion->data.releaseInFlightBuffers(contextVk); >- ANGLE_TRY(conversion->data.allocate(contextVk, numVertices * dstFormatSize, nullptr, nullptr, >- &conversion->lastAllocationOffset, nullptr)); >+ vk::BufferHelper *dstBuffer = conversion->data.get(); >+ ANGLE_TRY(dstBuffer->allocateForVertexConversion(contextVk, numVertices * dstFormatSize, >+ vk::MemoryHostVisibility::NonVisible)); > > ASSERT(conversion->dirty); > conversion->dirty = false; >@@ -404,10 +399,10 @@ angle::Result VertexArrayVk::convertVertexBufferGPU(ContextVk *contextVk, > params.dstFormat = &dstFormat; > params.srcStride = binding.getStride(); > params.srcOffset = binding.getOffset() + relativeOffset; >- params.dstOffset = static_cast<size_t>(conversion->lastAllocationOffset); >+ params.dstOffset = 0; > >- ANGLE_TRY(contextVk->getUtils().convertVertexBuffer( >- contextVk, conversion->data.getCurrentBuffer(), srcBufferHelper, params)); >+ ANGLE_TRY( >+ contextVk->getUtils().convertVertexBuffer(contextVk, dstBuffer, srcBufferHelper, params)); > > return angle::Result::Continue; > } >@@ -426,8 +421,6 @@ angle::Result VertexArrayVk::convertVertexBufferCPU(ContextVk *contextVk, > unsigned srcFormatSize = vertexFormat.getIntendedFormat().pixelBytes; > unsigned dstFormatSize = vertexFormat.getActualBufferFormat(compressed).pixelBytes; > >- conversion->data.releaseInFlightBuffers(contextVk); >- > size_t numVertices = GetVertexCount(srcBuffer, binding, srcFormatSize); > if (numVertices == 0) > { >@@ -439,11 +432,13 @@ angle::Result VertexArrayVk::convertVertexBufferCPU(ContextVk *contextVk, > const uint8_t *srcBytes = reinterpret_cast<const uint8_t *>(src); > srcBytes += binding.getOffset() + relativeOffset; > ASSERT(vertexFormat.getVertexInputAlignment(compressed) <= vk::kVertexBufferAlignment); >- ANGLE_TRY(StreamVertexData( >- contextVk, &conversion->data, srcBytes, numVertices * dstFormatSize, 0, numVertices, >- binding.getStride(), srcFormatSize, vertexFormat.getVertexLoadFunction(compressed), >- &mCurrentArrayBuffers[attribIndex], &conversion->lastAllocationOffset, 1)); >+ >+ vk::BufferHelper *dstBufferHelper = conversion->data.get(); >+ ANGLE_TRY(StreamVertexData(contextVk, dstBufferHelper, srcBytes, numVertices * dstFormatSize, 0, >+ numVertices, binding.getStride(), >+ vertexFormat.getVertexLoadFunction(compressed))); > ANGLE_TRY(srcBuffer->unmapImpl(contextVk)); >+ mCurrentArrayBuffers[attribIndex] = dstBufferHelper; > > ASSERT(conversion->dirty); > conversion->dirty = false; >@@ -476,14 +471,12 @@ angle::Result VertexArrayVk::syncState(const gl::Context *context, > { > // Note that just updating buffer data may still result in a new > // vk::BufferHelper allocation. >- BufferVk *bufferVk = vk::GetImpl(bufferGL); >- mCurrentElementArrayBuffer = &bufferVk->getBuffer(); >- mCurrentElementArrayBufferOffset = 0; >+ BufferVk *bufferVk = vk::GetImpl(bufferGL); >+ mCurrentElementArrayBuffer = &bufferVk->getBuffer(); > } > else > { >- mCurrentElementArrayBuffer = nullptr; >- mCurrentElementArrayBufferOffset = 0; >+ mCurrentElementArrayBuffer = nullptr; > } > > mLineLoopBufferFirstIndex.reset(); >@@ -658,10 +651,10 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, > bufferOnly = false; > } > >- vk::BufferHelper *bufferHelper = conversion->data.getCurrentBuffer(); >+ vk::BufferHelper *bufferHelper = conversion->data.get(); > mCurrentArrayBuffers[attribIndex] = bufferHelper; > mCurrentArrayBufferHandles[attribIndex] = bufferHelper->getBuffer().getHandle(); >- mCurrentArrayBufferOffsets[attribIndex] = conversion->lastAllocationOffset; >+ mCurrentArrayBufferOffsets[attribIndex] = bufferHelper->getOffset(); > // Converted attribs are packed in their own VK buffer so offset is zero > mCurrentArrayBufferRelativeOffsets[attribIndex] = 0; > >@@ -676,7 +669,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, > > mCurrentArrayBuffers[attribIndex] = &emptyBuffer; > mCurrentArrayBufferHandles[attribIndex] = emptyBuffer.getBuffer().getHandle(); >- mCurrentArrayBufferOffsets[attribIndex] = 0; >+ mCurrentArrayBufferOffsets[attribIndex] = emptyBuffer.getOffset(); > stride = 0; > } > else >@@ -702,7 +695,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, > vk::BufferHelper &emptyBuffer = contextVk->getEmptyBuffer(); > mCurrentArrayBuffers[attribIndex] = &emptyBuffer; > mCurrentArrayBufferHandles[attribIndex] = emptyBuffer.getBuffer().getHandle(); >- mCurrentArrayBufferOffsets[attribIndex] = 0; >+ mCurrentArrayBufferOffsets[attribIndex] = emptyBuffer.getOffset(); > // Client side buffer will be transfered to a tightly packed buffer later > stride = vertexFormat.getActualBufferFormat(compressed).pixelBytes; > } >@@ -730,7 +723,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, > vk::BufferHelper &emptyBuffer = contextVk->getEmptyBuffer(); > mCurrentArrayBuffers[attribIndex] = &emptyBuffer; > mCurrentArrayBufferHandles[attribIndex] = emptyBuffer.getBuffer().getHandle(); >- mCurrentArrayBufferOffsets[attribIndex] = 0; >+ mCurrentArrayBufferOffsets[attribIndex] = emptyBuffer.getOffset(); > mCurrentArrayBufferStrides[attribIndex] = 0; > mCurrentArrayBufferCompressed[attribIndex] = false; > mCurrentArrayBufferRelativeOffsets[attribIndex] = 0; >@@ -751,6 +744,8 @@ angle::Result VertexArrayVk::updateStreamedAttribs(const gl::Context *context, > const void *indices) > { > ContextVk *contextVk = vk::GetImpl(context); >+ RendererVk *renderer = contextVk->getRenderer(); >+ > const gl::AttributesMask activeAttribs = > context->getStateCache().getActiveClientAttribsMask() | > context->getStateCache().getActiveBufferedAttribsMask(); >@@ -765,9 +760,6 @@ angle::Result VertexArrayVk::updateStreamedAttribs(const gl::Context *context, > ANGLE_TRY(GetVertexRangeInfo(context, firstVertex, vertexOrIndexCount, indexTypeOrInvalid, > indices, 0, &startVertex, &vertexCount)); > >- RendererVk *renderer = contextVk->getRenderer(); >- mDynamicVertexData.releaseInFlightBuffers(contextVk); >- > const auto &attribs = mState.getVertexAttributes(); > const auto &bindings = mState.getVertexBindings(); > >@@ -787,6 +779,8 @@ angle::Result VertexArrayVk::updateStreamedAttribs(const gl::Context *context, > > ASSERT(vertexFormat.getVertexInputAlignment(false) <= vk::kVertexBufferAlignment); > >+ vk::BufferHelper *vertexDataBuffer = &mStreamedVertexData[attribIndex]; >+ > const uint8_t *src = static_cast<const uint8_t *>(attrib.pointer); > const uint32_t divisor = binding.getDivisor(); > if (divisor > 0) >@@ -794,40 +788,46 @@ angle::Result VertexArrayVk::updateStreamedAttribs(const gl::Context *context, > // Instanced attrib > if (divisor > renderer->getMaxVertexAttribDivisor()) > { >- // Emulated attrib >- BufferVk *bufferVk = nullptr; >+ // Divisor will be set to 1 & so update buffer to have 1 attrib per instance >+ size_t bytesToAllocate = instanceCount * stride; >+ > if (binding.getBuffer().get() != nullptr) > { > // Map buffer to expand attribs for divisor emulation >- bufferVk = vk::GetImpl(binding.getBuffer().get()); >- void *buffSrc = nullptr; >+ BufferVk *bufferVk = vk::GetImpl(binding.getBuffer().get()); >+ void *buffSrc = nullptr; > ANGLE_TRY(bufferVk->mapImpl(contextVk, GL_MAP_READ_BIT, &buffSrc)); > src = reinterpret_cast<const uint8_t *>(buffSrc) + binding.getOffset(); >- } >- // Divisor will be set to 1 & so update buffer to have 1 attrib per instance >- size_t bytesToAllocate = instanceCount * stride; > >- ANGLE_TRY(StreamVertexData(contextVk, &mDynamicVertexData, src, bytesToAllocate, 0, >- instanceCount, binding.getStride(), stride, >- vertexFormat.getVertexLoadFunction(compressed), >- &mCurrentArrayBuffers[attribIndex], >- &mCurrentArrayBufferOffsets[attribIndex], divisor)); >- if (bufferVk) >- { >+ uint32_t srcAttributeSize = >+ static_cast<uint32_t>(ComputeVertexAttributeTypeSize(attrib)); >+ >+ size_t numVertices = GetVertexCount(bufferVk, binding, srcAttributeSize); >+ >+ ANGLE_TRY(StreamVertexDataWithDivisor( >+ contextVk, vertexDataBuffer, src, bytesToAllocate, binding.getStride(), >+ stride, vertexFormat.getVertexLoadFunction(compressed), divisor, >+ numVertices)); >+ > ANGLE_TRY(bufferVk->unmapImpl(contextVk)); > } >+ else >+ { >+ size_t numVertices = instanceCount; >+ ANGLE_TRY(StreamVertexDataWithDivisor( >+ contextVk, vertexDataBuffer, src, bytesToAllocate, binding.getStride(), >+ stride, vertexFormat.getVertexLoadFunction(compressed), divisor, >+ numVertices)); >+ } > } > else > { > ASSERT(binding.getBuffer().get() == nullptr); > size_t count = UnsignedCeilDivide(instanceCount, divisor); > size_t bytesToAllocate = count * stride; >- >- ANGLE_TRY(StreamVertexData(contextVk, &mDynamicVertexData, src, bytesToAllocate, 0, >- count, binding.getStride(), stride, >- vertexFormat.getVertexLoadFunction(compressed), >- &mCurrentArrayBuffers[attribIndex], >- &mCurrentArrayBufferOffsets[attribIndex], 1)); >+ ANGLE_TRY(StreamVertexData(contextVk, vertexDataBuffer, src, bytesToAllocate, 0, >+ count, binding.getStride(), >+ vertexFormat.getVertexLoadFunction(compressed))); > } > } > else >@@ -836,18 +836,17 @@ angle::Result VertexArrayVk::updateStreamedAttribs(const gl::Context *context, > // Allocate space for startVertex + vertexCount so indexing will work. If we don't > // start at zero all the indices will be off. > // Only vertexCount vertices will be used by the upcoming draw so that is all we copy. >- size_t bytesToAllocate = (startVertex + vertexCount) * stride; > src += startVertex * binding.getStride(); >- size_t destOffset = startVertex * stride; >- >- ANGLE_TRY(StreamVertexData( >- contextVk, &mDynamicVertexData, src, bytesToAllocate, destOffset, vertexCount, >- binding.getStride(), stride, vertexFormat.getVertexLoadFunction(compressed), >- &mCurrentArrayBuffers[attribIndex], &mCurrentArrayBufferOffsets[attribIndex], 1)); >+ size_t destOffset = startVertex * stride; >+ size_t bytesToAllocate = (startVertex + vertexCount) * stride; >+ ANGLE_TRY(StreamVertexData(contextVk, vertexDataBuffer, src, bytesToAllocate, >+ destOffset, vertexCount, binding.getStride(), >+ vertexFormat.getVertexLoadFunction(compressed))); > } > >- mCurrentArrayBufferHandles[attribIndex] = >- mCurrentArrayBuffers[attribIndex]->getBuffer().getHandle(); >+ mCurrentArrayBuffers[attribIndex] = vertexDataBuffer; >+ mCurrentArrayBufferHandles[attribIndex] = vertexDataBuffer->getBuffer().getHandle(); >+ mCurrentArrayBufferOffsets[attribIndex] = mCurrentArrayBuffers[attribIndex]->getOffset(); > } > > return angle::Result::Continue; >@@ -869,10 +868,10 @@ angle::Result VertexArrayVk::handleLineLoop(ContextVk *contextVk, > > if (!elementArrayBuffer) > { >- ANGLE_TRY(mLineLoopHelper.streamIndices( >- contextVk, indexTypeOrInvalid, vertexOrIndexCount, >- reinterpret_cast<const uint8_t *>(indices), &mCurrentElementArrayBuffer, >- &mCurrentElementArrayBufferOffset, indexCountOut)); >+ ANGLE_TRY( >+ mLineLoopHelper.streamIndices(contextVk, indexTypeOrInvalid, vertexOrIndexCount, >+ reinterpret_cast<const uint8_t *>(indices), >+ &mCurrentElementArrayBuffer, indexCountOut)); > } > else > { >@@ -881,7 +880,7 @@ angle::Result VertexArrayVk::handleLineLoop(ContextVk *contextVk, > BufferVk *elementArrayBufferVk = vk::GetImpl(elementArrayBuffer); > ANGLE_TRY(mLineLoopHelper.getIndexBufferForElementArrayBuffer( > contextVk, elementArrayBufferVk, indexTypeOrInvalid, vertexOrIndexCount, offset, >- &mCurrentElementArrayBuffer, &mCurrentElementArrayBufferOffset, indexCountOut)); >+ &mCurrentElementArrayBuffer, indexCountOut)); > } > } > >@@ -902,8 +901,7 @@ angle::Result VertexArrayVk::handleLineLoop(ContextVk *contextVk, > mLineLoopBufferFirstIndex != firstVertex || mLineLoopBufferLastIndex != lastVertex) > { > ANGLE_TRY(mLineLoopHelper.getIndexBufferForDrawArrays( >- contextVk, clampedVertexCount, firstVertex, &mCurrentElementArrayBuffer, >- &mCurrentElementArrayBufferOffset)); >+ contextVk, clampedVertexCount, firstVertex, &mCurrentElementArrayBuffer)); > > mLineLoopBufferFirstIndex = firstVertex; > mLineLoopBufferLastIndex = lastVertex; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.h >index c198265bf8ba2017a13fce558826862f450218b5..461b41e105657d05a6d9c6ad1cb2384ae902d3cb 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/VertexArrayVk.h >@@ -58,14 +58,12 @@ class VertexArrayVk : public VertexArrayImpl > gl::DrawElementsType glIndexType, > vk::BufferHelper *srcIndirectBuf, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut); >+ vk::BufferHelper **indirectBufferOut); > > angle::Result handleLineLoopIndirectDraw(const gl::Context *context, > vk::BufferHelper *indirectBufferVk, > VkDeviceSize indirectBufferOffset, >- vk::BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut); >+ vk::BufferHelper **indirectBufferOut); > > const gl::AttribArray<VkBuffer> &getCurrentArrayBufferHandles() const > { >@@ -82,11 +80,6 @@ class VertexArrayVk : public VertexArrayImpl > return mCurrentArrayBuffers; > } > >- VkDeviceSize getCurrentElementArrayBufferOffset() const >- { >- return mCurrentElementArrayBufferOffset; >- } >- > vk::BufferHelper *getCurrentElementArrayBuffer() const { return mCurrentElementArrayBuffer; } > > angle::Result convertIndexBufferGPU(ContextVk *contextVk, >@@ -96,8 +89,7 @@ class VertexArrayVk : public VertexArrayImpl > angle::Result convertIndexBufferIndirectGPU(ContextVk *contextVk, > vk::BufferHelper *srcIndirectBuf, > VkDeviceSize srcIndirectBufOffset, >- vk::BufferHelper **indirectBufferVkOut, >- VkDeviceSize *indirectBufferVkOffsetOut); >+ vk::BufferHelper **indirectBufferVkOut); > > angle::Result convertIndexBufferCPU(ContextVk *contextVk, > gl::DrawElementsType indexType, >@@ -143,13 +135,12 @@ class VertexArrayVk : public VertexArrayImpl > // Cache strides of attributes for a fast pipeline cache update when VAOs are changed > gl::AttribArray<GLuint> mCurrentArrayBufferStrides; > gl::AttributesMask mCurrentArrayBufferCompressed; >- VkDeviceSize mCurrentElementArrayBufferOffset; > vk::BufferHelper *mCurrentElementArrayBuffer; > >- vk::DynamicBuffer mDynamicVertexData; >- vk::DynamicBuffer mDynamicIndexData; >- vk::DynamicBuffer mTranslatedByteIndexData; >- vk::DynamicBuffer mTranslatedByteIndirectData; >+ gl::AttribArray<vk::BufferHelper> mStreamedVertexData; >+ vk::BufferHelper mStreamedIndexData; >+ vk::BufferHelper mTranslatedByteIndexData; >+ vk::BufferHelper mTranslatedByteIndirectData; > > vk::LineLoopHelper mLineLoopHelper; > Optional<GLint> mLineLoopBufferFirstIndex; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp >index 9780d9325012694508e68e2e9a048b0daa914408..3ee41e13ded8b698af014bdc7aa3c06ca9d88c14 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp >@@ -417,7 +417,7 @@ void HardwareBufferImageSiblingVkAndroid::release(RendererVk *renderer) > // TODO: Handle the case where the EGLImage is used in two contexts not in the same share > // group. https://issuetracker.google.com/169868803 > mImage->releaseImage(renderer); >- mImage->releaseStagingBuffer(renderer); >+ mImage->releaseStagedUpdates(renderer); > SafeDelete(mImage); > } > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp >index 48c4ead03c7ad7535473cd882511708c1dab1f72..eb2f0a58d45d92371fb266181163318dece5dce0 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp >@@ -550,7 +550,7 @@ void DmaBufImageSiblingVkLinux::release(RendererVk *renderer) > // TODO: Handle the case where the EGLImage is used in two contexts not in the same share > // group. https://issuetracker.google.com/169868803 > mImage->releaseImage(renderer); >- mImage->releaseStagingBuffer(renderer); >+ mImage->releaseStagedUpdates(renderer); > SafeDelete(mImage); > } > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm >index 4dee0099527116dad0d4842aad04ea4723efd307..963efbd0c701ee9d13812bccb1fdb62e537b4d54 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm >@@ -124,9 +124,6 @@ angle::Result IOSurfaceSurfaceVkMac::initializeImpl(DisplayVk *displayVk) > mState.isRobustResourceInitEnabled(), > mState.hasProtectedContent())); > >- mColorAttachment.image.initStagingBuffer( >- renderer, renderer->getMinImportedHostPointerAlignment(), vk::kStagingBufferFlags, >- IOSurfaceGetBytesPerRowOfPlane(mIOSurface, mPlane) * mHeight); > mColorRenderTarget.init(&mColorAttachment.image, &mColorAttachment.imageViews, nullptr, nullptr, > gl::LevelIndex(0), 0, 1, RenderTargetTransience::Default); > >@@ -188,7 +185,7 @@ egl::Error IOSurfaceSurfaceVkMac::bindTexImage(const gl::Context *context, > angle::Result result = mColorAttachment.image.stageSubresourceUpdate( > contextVk, gl::ImageIndex::Make2D(0), > gl::Extents(static_cast<int>(width), pixelUnpack.imageHeight, 1), gl::Offset(), >- internalFormatInfo, pixelUnpack, nullptr, kIOSurfaceFormats[mFormatIndex].type, >+ internalFormatInfo, pixelUnpack, kIOSurfaceFormats[mFormatIndex].type, > reinterpret_cast<uint8_t *>(source), format, vk::ImageAccess::Renderable); > > IOSurfaceUnlock(mIOSurface, 0, nullptr); >@@ -221,9 +218,9 @@ egl::Error IOSurfaceSurfaceVkMac::releaseTexImage(const gl::Context *context, EG > PackPixelsParams params(bounds, dstFormat, static_cast<GLuint>(outputRowPitchInBytes), > contextVk->isViewportFlipEnabledForDrawFBO(), nullptr, 0); > >- result = mColorAttachment.image.readPixels( >- contextVk, bounds, params, VK_IMAGE_ASPECT_COLOR_BIT, gl::LevelIndex(0), 0, >- IOSurfaceGetBaseAddressOfPlane(mIOSurface, mPlane), contextVk->getStagingBuffer()); >+ result = mColorAttachment.image.readPixels(contextVk, bounds, params, VK_IMAGE_ASPECT_COLOR_BIT, >+ gl::LevelIndex(0), 0, >+ IOSurfaceGetBaseAddressOfPlane(mIOSurface, mPlane)); > > IOSurfaceUnlock(mIOSurface, 0, nullptr); > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc >index f4bcce053d941d2aac2d29f970fa15618783f70b..8c863f43a32df804d43e78e9a42f179a2a57c029 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc >@@ -10,53 +10,96 @@ > > #pragma once > constexpr uint8_t kOverlayCull_comp_00000000[] = { >- 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x6d,0x94,0xdd,0x4b,0xd3,0x61, >- 0x14,0xc7,0xcf,0x7e,0x9b,0x9b,0x15,0x94,0x6d,0x85,0x98,0x6f,0x95,0xe0,0x8d,0x22, >- 0x41,0x2f,0x04,0x21,0xe5,0x8d,0x0b,0x5a,0x96,0x08,0xd1,0x85,0x5e,0xf8,0xd2,0x42, >- 0x21,0xbd,0xa8,0x84,0x44,0x72,0x54,0x26,0xd5,0xa4,0x6b,0x93,0xb0,0x51,0xad,0x51, >- 0x4d,0xec,0x8f,0x8b,0x5e,0x20,0xe8,0x9c,0x67,0x9f,0x9f,0x9e,0xa4,0xc1,0xc3,0xb3, >- 0xf3,0x3d,0xe7,0xf9,0x3e,0xdf,0xef,0x39,0xcf,0x96,0x8c,0x7a,0x32,0x92,0x4c,0xc8, >- 0x41,0x69,0x96,0x6f,0xd2,0xf8,0x1c,0x95,0x48,0x12,0xec,0x83,0xec,0x57,0x74,0x3f, >- 0x24,0xe9,0x80,0xe7,0x0b,0x63,0x85,0x81,0xfb,0x0f,0x66,0x06,0xce,0x9d,0x3f,0x63, >- 0xf5,0x87,0x25,0x19,0xce,0x59,0xee,0x88,0x64,0xa4,0x49,0xf7,0x94,0xae,0x7b,0x93, >- 0xb3,0xf3,0x86,0x67,0x75,0x0d,0xeb,0x6a,0xd1,0xf3,0xa9,0xc0,0x27,0x72,0x92,0xfa, >- 0xc0,0xa7,0x68,0x36,0xf0,0x8b,0xb4,0x13,0xdb,0x9e,0x0e,0x67,0x44,0xae,0x2a,0x63, >- 0x07,0xda,0x7a,0xd8,0xf3,0x7a,0xa7,0x61,0x11,0xf5,0x5d,0xba,0x9f,0xde,0xcd,0x35, >- 0xe2,0x53,0x8e,0x7f,0x18,0xfe,0x13,0xc4,0xc5,0x7d,0xf5,0x45,0xea,0x63,0x6e,0x8b, >- 0xdb,0xc8,0x2d,0x70,0xd6,0xe2,0x9c,0xde,0x18,0x85,0xda,0x64,0x70,0x6d,0xdf,0x8f, >- 0x6b,0x4d,0x1a,0x4f,0xf6,0x69,0xd5,0x38,0x83,0xfe,0x88,0xb8,0x85,0x38,0x19,0xea, >- 0x52,0xa1,0x07,0x09,0xfc,0x5d,0x22,0xce,0x82,0xf5,0xc1,0x97,0x83,0xcf,0xea,0x8f, >- 0x91,0x4b,0xc3,0xd7,0xca,0xf7,0x94,0xab,0x37,0x6f,0x36,0xa7,0x0e,0xfa,0xd7,0x0a, >- 0xd6,0x45,0xaf,0xda,0xe1,0xea,0x44,0x57,0x07,0x77,0x77,0x86,0x9a,0x3d,0x2f,0xdd, >- 0x6e,0x3e,0x7d,0x2e,0x8e,0xb5,0xf4,0xec,0xfa,0x12,0xd5,0x15,0x49,0x2f,0x9a,0xce, >- 0xea,0xde,0x4b,0x2e,0xd6,0x74,0x19,0xcf,0xb1,0xc7,0xe1,0x7d,0x1e,0xaf,0xe9,0x6a, >- 0x76,0x71,0x01,0x4f,0xfd,0x3a,0x73,0xeb,0xe1,0x75,0x6a,0x0a,0xae,0xe6,0x36,0x7a, >- 0xe2,0x78,0x02,0xce,0x36,0x39,0x20,0x33,0xf4,0x25,0x21,0xff,0x7e,0x22,0x3c,0x9a, >- 0xfe,0x3b,0x60,0x33,0xe8,0xb2,0xb8,0xe8,0x66,0x37,0xab,0x7b,0x37,0x67,0xfa,0x95, >- 0xcd,0x66,0xb4,0xc0,0xbd,0x13,0xac,0x0b,0xaa,0x2f,0x42,0xab,0xe0,0xf1,0xa7,0x22, >- 0xf6,0xf6,0x07,0x99,0x77,0x1e,0xbf,0x37,0xd4,0x49,0x26,0xbc,0xe3,0x06,0x96,0xe7, >- 0x8c,0x69,0x7c,0x86,0xcf,0x11,0xf2,0xe6,0xb7,0x04,0x36,0x0a,0x6e,0xd8,0x90,0x62, >- 0xf6,0x06,0x1e,0xf2,0x4e,0x72,0xdc,0x63,0x5e,0x17,0xc1,0x87,0x34,0xb2,0xd9,0x3c, >- 0xda,0xf5,0xda,0xc8,0x0d,0xf2,0x5e,0x96,0xc8,0x8d,0x2a,0x97,0x9d,0x5b,0x06,0x13, >- 0x87,0x3d,0x06,0x33,0x6f,0x3b,0x8a,0xd9,0x3c,0x57,0xa8,0xb5,0xdc,0x0f,0x75,0xba, >- 0xca,0x99,0xdf,0xca,0xbb,0x12,0xf4,0x4a,0xc0,0xcc,0x7f,0xc9,0xf9,0x7d,0x02,0xd7, >- 0x92,0xf3,0x6b,0x9c,0xf6,0x4e,0x9e,0x92,0x37,0x8f,0x9b,0xca,0xd3,0x1b,0x7a,0xd1, >- 0xc0,0x7f,0x29,0x4f,0xcc,0x67,0xfb,0x77,0x65,0xb3,0xfc,0x73,0xb4,0x34,0x51,0x5b, >- 0x42,0x4f,0xd9,0xe9,0xb1,0x9a,0x35,0x5d,0x65,0xce,0xaf,0x39,0x3d,0x2f,0x9c,0x9e, >- 0x88,0x99,0x6d,0xa3,0xe7,0x25,0xf9,0x11,0xa7,0xe7,0x15,0xb8,0xe9,0x89,0xf9,0xca, >- 0x4e,0xcf,0x3a,0x9a,0x56,0xa9,0xb5,0xbb,0xc6,0x12,0x4d,0xa1,0xd7,0xaf,0x79,0xfb, >- 0xeb,0xae,0xb7,0xb7,0xc0,0x85,0x19,0x1b,0xb6,0xc1,0xbb,0x5a,0x74,0xf3,0x7b,0xe3, >- 0xe6,0xb7,0xe1,0xe6,0xb7,0x49,0x2e,0xe6,0x7b,0x0b,0xe6,0xe7,0xb7,0x05,0xe6,0xe7, >- 0xf7,0x8e,0xda,0x2d,0xfa,0x55,0x75,0xfd,0xb2,0x5c,0x45,0x57,0x15,0x7f,0x15,0xd7, >- 0xaf,0xf7,0x70,0x6d,0xfe,0x67,0x7e,0x1f,0xc8,0xfb,0xf9,0x7d,0x04,0xb7,0x7e,0xc5, >- 0x7c,0x55,0xd7,0xaf,0x4f,0x68,0x29,0x53,0x5b,0x41,0x4f,0xdd,0xe9,0xb1,0x9a,0x9a, >- 0xae,0x3a,0xe7,0x6b,0x4e,0xcf,0x67,0xa7,0x67,0xff,0xfc,0xbe,0x90,0xf7,0xf3,0xfb, >- 0x0a,0x6e,0x7a,0x62,0xbe,0xba,0xd3,0xb3,0x8d,0xa6,0x2a,0xb5,0x35,0x37,0xbf,0x1d, >- 0xe6,0xb7,0xed,0x7a,0x3b,0x0e,0x2e,0xe1,0xae,0x46,0x6f,0x27,0x99,0x5d,0x0e,0x2f, >- 0xd3,0xce,0x8b,0xe5,0xa6,0x74,0x4d,0x73,0xf7,0x14,0xb3,0xb4,0xff,0x9d,0xbb,0xfc, >- 0xe7,0x2c,0xf3,0x7f,0x33,0xc7,0xef,0xff,0xa6,0x6a,0xb3,0xfb,0xe7,0x79,0x2f,0xe3, >- 0x70,0xe7,0x02,0x4f,0x2a,0x9c,0x9b,0x23,0x6f,0xbe,0x62,0x6e,0xdb,0xff,0xe8,0x84, >- 0x2e,0xea,0xfa,0x0b,0x66,0xb8,0xa3,0xd3,0xd4,0x07,0x00,0x00 >+ 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x6d,0x97,0x5b,0x4c,0x9c,0x55, >+ 0x10,0xc7,0xcf,0xec,0xc2,0x82,0x25,0x42,0x29,0x95,0x05,0x6c,0x8c,0x96,0x6a,0x8c, >+ 0x90,0xb5,0xb5,0xb6,0x85,0x68,0x89,0x4d,0x56,0xcb,0x03,0x2d,0x65,0x59,0xea,0x46, >+ 0xca,0x65,0x53,0x62,0x2f,0x11,0x6d,0x8b,0x36,0xdc,0x12,0xfb,0x60,0x7c,0xf4,0x85, >+ 0x9a,0xd8,0xa8,0x0f,0xbe,0x60,0xb4,0x50,0x1a,0x7d,0x68,0xdf,0x4a,0x52,0x34,0x4a, >+ 0x54,0x6c,0x54,0x4c,0x8c,0x7d,0x10,0x0d,0x89,0xad,0x8d,0x8d,0xbd,0x58,0x7a,0xb1, >+ 0xce,0x7c,0xe7,0x3f,0x30,0x7c,0x94,0xe4,0xe4,0xfb,0xe6,0x3f,0xe7,0xcc,0xfc,0xce, >+ 0x39,0xdf,0x99,0xc3,0x46,0x23,0x95,0x79,0xce,0x91,0x5b,0xe6,0xf2,0xdd,0xc7,0xe4, >+ 0x82,0xbf,0x62,0x17,0x71,0xf2,0x5a,0xe0,0x62,0xc1,0x73,0x6b,0x43,0x73,0x43,0xa2, >+ 0xe7,0xf5,0xae,0xc4,0xd3,0x1b,0xd6,0x8a,0xbf,0xd0,0x45,0x83,0x7e,0xe2,0x2b,0x72, >+ 0x79,0x2e,0x97,0x9f,0x39,0xdc,0xba,0xb3,0xfb,0x5e,0x15,0xbd,0x99,0xdb,0x10,0xb7, >+ 0xe5,0x3c,0x3e,0x27,0x88,0xe7,0xdc,0xc3,0xe8,0x1f,0xc4,0x63,0xb5,0x39,0x88,0xef, >+ 0xdc,0x83,0xb0,0x77,0xf1,0x33,0x16,0x8c,0x71,0xae,0x9e,0x23,0xb6,0x79,0x14,0x57, >+ 0x89,0xe7,0x56,0xce,0x29,0x5a,0x04,0xfd,0x3b,0xf8,0xb9,0x7a,0xde,0xe7,0xed,0x47, >+ 0x4c,0xfc,0x21,0xc4,0xaf,0x80,0x3d,0x16,0xea,0x3f,0x86,0xfe,0x1a,0x5b,0xec,0x72, >+ 0xf8,0x4e,0x63,0xac,0xd8,0x25,0x9c,0x31,0x12,0xf4,0x8d,0x06,0xb3,0x96,0xf7,0x07, >+ 0xb8,0x4f,0x0c,0x73,0x92,0xbf,0x38,0xdb,0x05,0xe0,0x17,0x7f,0x15,0xfc,0x2b,0x30, >+ 0x9f,0x95,0xac,0x96,0x18,0x3d,0x8e,0xb1,0xab,0xd8,0x2e,0xc3,0x38,0xaf,0xe5,0x04, >+ 0x39,0x65,0xcd,0x44,0x7f,0x06,0x76,0x05,0x34,0xf1,0xaf,0xc2,0x7b,0xcc,0xc4,0x93, >+ 0x35,0xca,0x37,0x76,0x02,0x7d,0xd4,0xae,0x0d,0x71,0x25,0xb1,0x4e,0xc2,0xdd,0x84, >+ 0x58,0x51,0xc4,0x4f,0xc1,0xd7,0x84,0xfc,0x29,0xec,0x27,0x99,0xf1,0x69,0xcc,0x5b, >+ 0xfa,0xb7,0xc0,0x17,0x43,0xbc,0x0c,0xde,0x6d,0xfe,0x56,0x6e,0xcf,0x61,0xbe,0xb2, >+ 0xcf,0x19,0x68,0x0f,0x61,0x4f,0x77,0x21,0x56,0x3b,0x38,0xdb,0x90,0x5b,0xec,0x0e, >+ 0xb3,0xe6,0x9d,0xe6,0x3b,0xaa,0x82,0x9d,0x35,0x2c,0x5d,0xe8,0x9b,0x01,0xcb,0xa1, >+ 0x60,0xff,0xbc,0x56,0xcd,0xdf,0x94,0xec,0xd1,0x9b,0xe0,0x4f,0x9b,0xf9,0x0d,0x21, >+ 0xa6,0xf6,0x79,0x0f,0x6b,0x9a,0x08,0xbe,0x81,0xfb,0xdc,0x28,0xe6,0x84,0xe3,0x31, >+ 0xff,0x17,0x09,0xe6,0xe0,0x73,0x9f,0x80,0x36,0x8a,0xb8,0x62,0x8f,0x99,0xef,0xe3, >+ 0x33,0x7e,0x76,0xce,0xb3,0xc4,0x82,0xf5,0x3d,0x8d,0x7d,0x4f,0xce,0xef,0x49,0x34, >+ 0xc8,0x3f,0xcc,0x89,0x36,0x32,0x4b,0x04,0xeb,0xe8,0xb0,0x3f,0x37,0x58,0x91,0xb3, >+ 0xb6,0x19,0xfb,0x76,0x14,0xec,0x8d,0x7c,0x06,0x65,0xdc,0xbb,0xd0,0x8e,0x62,0x8c, >+ 0xf0,0xbe,0x85,0x39,0x1d,0x83,0x5f,0xe6,0x76,0x04,0xda,0x07,0xd0,0x45,0xdb,0xc2, >+ 0x9a,0xec,0xe5,0x19,0xec,0x77,0x1a,0x79,0x64,0xde,0xe3,0xd0,0xb7,0xb0,0x25,0x6b, >+ 0x7c,0x16,0xfb,0x92,0x85,0x6f,0x33,0xf6,0x7d,0x02,0xbe,0x26,0x8e,0x25,0xe3,0xbe, >+ 0x84,0xe6,0x8c,0xf6,0x15,0x34,0x99,0xdb,0x49,0xd6,0x64,0x7f,0xbe,0x46,0x5f,0xf1, >+ 0xfd,0xcb,0x33,0x9d,0xc2,0x98,0x9b,0x1c,0x57,0x7c,0x93,0xdc,0xa6,0x30,0xff,0x49, >+ 0x33,0xdf,0x6f,0x10,0x6b,0xc2,0xcc,0x57,0x62,0xca,0xbe,0x7f,0x0b,0xbf,0xcc,0xf1, >+ 0x7d,0x8e,0x23,0x79,0xbe,0x83,0x3e,0xc7,0x71,0x34,0x9e,0x3c,0xaf,0x71,0x3c,0xf1, >+ 0x7f,0x0f,0x96,0x5c,0xf4,0x9d,0x04,0xcf,0xb4,0xe1,0x91,0x3e,0xe7,0xb8,0x4d,0x63, >+ 0xfc,0x39,0xc3,0xf3,0x83,0xe1,0x89,0x60,0xcf,0x4e,0x80,0xe7,0x47,0xf8,0x8f,0x19, >+ 0x9e,0x9f,0xa0,0x0b,0x8f,0xc6,0x9b,0x36,0x3c,0x3f,0x83,0x69,0x0a,0x7d,0x25,0xd7, >+ 0x27,0xbc,0x8a,0xb2,0x8e,0xbf,0xc0,0x9f,0xc4,0x5e,0x4d,0x60,0x7d,0x7f,0x85,0x6f, >+ 0x1c,0x7b,0x2a,0xf5,0xe2,0x3c,0x6a,0x88,0x68,0x75,0x4c,0x75,0x1e,0xfd,0x74,0xfd, >+ 0xff,0x84,0x6f,0x05,0xe6,0x5b,0x41,0x0b,0xf3,0x15,0xdf,0x05,0x19,0x4f,0x9e,0xef, >+ 0x02,0xbe,0x1f,0xc9,0x75,0xd1,0x8c,0xd3,0x5c,0x7f,0x21,0xd7,0x45,0xf3,0xfd,0x5c, >+ 0x82,0xae,0xf6,0xdf,0x60,0xfa,0x02,0x71,0x2e,0x43,0xbb,0x64,0xf8,0x2e,0x1b,0xbe, >+ 0x7f,0x90,0xa7,0x12,0x7c,0xe5,0x86,0x4f,0x7c,0x57,0xe4,0x9c,0x82,0xef,0x8a,0xe1, >+ 0xbb,0x6a,0xc6,0x29,0xdf,0x35,0xf0,0x5d,0x35,0x3c,0xd7,0xa1,0xab,0x7d,0x23,0xc4, >+ 0x37,0x07,0xed,0xba,0xe1,0x9b,0x33,0x7c,0xb7,0x90,0x27,0x01,0xbe,0x32,0xc3,0x27, >+ 0xbe,0xdb,0x52,0xcf,0xc1,0x77,0xdb,0xf0,0xdd,0x31,0xe3,0x94,0xef,0x3f,0xf0,0xdd, >+ 0x31,0x3c,0x77,0xa1,0xab,0x4d,0xb4,0x98,0x2f,0x42,0x5e,0xbb,0x6b,0xf8,0x44,0x53, >+ 0xbe,0x1c,0xf2,0x79,0x6a,0xc1,0x17,0x37,0x7c,0xe2,0xcb,0xe5,0x16,0x07,0x9f,0xbc, >+ 0x2b,0x5f,0xcc,0x8c,0x53,0xbe,0x3c,0xf2,0x7c,0xe2,0x53,0x9e,0x7c,0xf2,0xba,0xda, >+ 0xcb,0x42,0x7c,0x05,0xe4,0x35,0xe9,0xa7,0x7c,0x05,0x86,0xef,0x7e,0xe4,0x49,0x82, >+ 0xaf,0xd4,0xf0,0x89,0xaf,0x90,0x5b,0x29,0xf8,0x0a,0x0d,0x5f,0x91,0x19,0xa7,0x7c, >+ 0xcb,0xc1,0x57,0x64,0x78,0x8a,0xc9,0xeb,0x6a,0x97,0x84,0xf8,0x56,0x92,0xd7,0x8a, >+ 0x0d,0x9f,0x68,0x72,0x2e,0x35,0x6f,0x29,0x6c,0x5d,0xa7,0x38,0x6c,0xdd,0xd7,0x32, >+ 0xd8,0xfa,0x1d,0x96,0xc3,0xd6,0x73,0x23,0xcf,0x4f,0x31,0xdf,0xdf,0xb0,0xef,0x69, >+ 0xcc,0x77,0xd6,0xd4,0x17,0xf1,0xcd,0x70,0x9b,0x45,0x3d,0x98,0x31,0x73,0xfb,0x1d, >+ 0xdf,0x46,0xd6,0x7c,0x0b,0x7f,0x40,0x4f,0xb1,0x25,0x35,0xe8,0x08,0x79,0x6d,0x18, >+ 0x6b,0x28,0x0c,0x1a,0x6b,0x16,0xb5,0x45,0xfa,0xbd,0x43,0xfe,0x2e,0x14,0x2e,0x19, >+ 0x33,0x63,0x6a,0xf4,0x47,0xf0,0x3b,0xf3,0xad,0xae,0x21,0x7f,0x57,0x8d,0x9b,0x7b, >+ 0xe0,0x51,0x5a,0xb8,0x07,0xd6,0xd0,0xc2,0x3d,0xf0,0x18,0x79,0x9f,0xc6,0x7b,0x9c, >+ 0xbc,0x66,0xef,0x81,0x27,0xa0,0xd9,0x7b,0xa0,0x8a,0x7c,0x5f,0xf1,0xc9,0xba,0xac, >+ 0x33,0xdf,0x81,0xf8,0xaa,0xb9,0xad,0xc3,0x7a,0xca,0xbb,0xd6,0xdd,0x04,0x62,0x69, >+ 0x0e,0x7b,0x0f,0x3c,0x49,0xde,0x6f,0xef,0x81,0xb5,0xe4,0x75,0x59,0x1b,0x8d,0x27, >+ 0x4f,0xad,0xbb,0x4f,0x91,0x67,0x99,0x45,0xdf,0x6a,0xf0,0xd4,0x18,0x1e,0xe9,0xb3, >+ 0x9e,0x5b,0x0d,0xc6,0xaf,0x37,0x3c,0x1b,0x0c,0x4f,0xf8,0x1e,0xd8,0x48,0xde,0x6f, >+ 0xef,0x81,0x4d,0xe4,0x75,0xe1,0xd1,0x78,0x35,0x86,0xa7,0x96,0x3c,0x93,0x30,0x6e, >+ 0x42,0x5e,0xbd,0x07,0x9e,0x25,0xef,0x0f,0xdf,0x03,0x75,0xe4,0x7d,0xb6,0xe6,0xd7, >+ 0x61,0x1e,0x83,0xa1,0xfa,0xde,0xc0,0xf6,0x20,0xf2,0x36,0x98,0xf3,0xb5,0x8d,0x96, >+ 0xd6,0xf7,0xed,0x38,0x5f,0xdb,0xcc,0x79,0x6a,0x24,0xaf,0xab,0xdd,0x14,0x3a,0x5f, >+ 0x29,0xf2,0x5a,0xa3,0x39,0x5f,0x29,0x73,0xfe,0xd3,0xb4,0xb8,0xbe,0x0f,0x18,0x3e, >+ 0xf1,0xb5,0x70,0x1b,0x00,0x5f,0x8b,0xe1,0xdb,0x49,0x4b,0xeb,0xfb,0x8b,0xe0,0xdb, >+ 0x69,0x78,0x32,0xe4,0x75,0xb5,0x5f,0x0a,0xf1,0xb5,0x92,0xd7,0x32,0x86,0xaf,0xd5, >+ 0xf0,0xb5,0xd1,0xe2,0xfa,0xde,0x6f,0xf8,0xc4,0xd7,0xce,0xad,0x1f,0x7c,0xed,0x86, >+ 0xaf,0x83,0x96,0xd6,0xf7,0x4e,0xf0,0x75,0x18,0x9e,0x2c,0x79,0x5d,0xed,0xdd,0x21, >+ 0xbe,0x2e,0xf2,0x5a,0xd6,0xf0,0x75,0x19,0xbe,0x97,0x43,0xf5,0xbd,0xcf,0xf0,0x89, >+ 0x6f,0x0f,0xb7,0x3e,0xf0,0xed,0x31,0x7c,0x7b,0xef,0x51,0xdf,0xf7,0x81,0x6f,0xaf, >+ 0xe1,0xd9,0x4f,0x5e,0x57,0xfb,0x95,0x10,0x5f,0x37,0x79,0x6d,0xbf,0xe1,0xeb,0x36, >+ 0x7c,0xaf,0x85,0xea,0x7b,0xaf,0xe1,0x13,0xdf,0x01,0x6e,0xbd,0xe0,0x3b,0x60,0xf8, >+ 0x0e,0xde,0xa3,0xbe,0x1f,0x02,0xdf,0x41,0xc3,0xd3,0x43,0x5e,0x57,0xfb,0x8d,0x10, >+ 0xdf,0x61,0xf2,0x5a,0x8f,0xe1,0x3b,0x8c,0xf3,0xa6,0x79,0x7b,0x61,0xeb,0x3a,0xf5, >+ 0xc1,0xd6,0x7d,0xed,0x87,0xad,0xdf,0xe1,0x00,0x6c,0x3d,0x37,0x83,0x38,0x5b,0xf5, >+ 0xb4,0xb8,0x96,0x27,0xd9,0xae,0x47,0x1f,0x79,0xd7,0x79,0x3c,0x4f,0x4b,0x6b,0xf9, >+ 0x0b,0xe4,0x75,0xad,0xe5,0x6f,0x93,0xd7,0x6c,0x2d,0xd7,0x58,0xf5,0xb4,0x50,0xcb, >+ 0x3f,0x44,0x2d,0x17,0x06,0x19,0x93,0x34,0xb5,0x77,0x18,0x7e,0x87,0xb5,0x1f,0x09, >+ 0xdd,0x35,0xc7,0xb9,0x8d,0xe0,0x7e,0x38,0x0e,0x96,0xd1,0xa0,0x7e,0xfa,0xdf,0x2f, >+ 0x83,0xf8,0xed,0xf2,0x39,0x7e,0x3f,0xec,0xe0,0x9c,0x52,0xe3,0x4f,0xe1,0x9e,0x18, >+ 0x36,0xbf,0xa7,0x76,0x73,0xdf,0x93,0xe8,0x7b,0x0a,0xbc,0x1a,0x7b,0x24,0xf8,0x9f, >+ 0x86,0x5c,0x0d,0xb7,0xff,0x01,0x0a,0x64,0x63,0x51,0x74,0x10,0x00,0x00 > }; > > // Generated from: >@@ -65,8 +108,6 @@ constexpr uint8_t kOverlayCull_comp_00000000[] = { > // > // #extension GL_EXT_samplerless_texture_functions : require > // >-// #extension GL_KHR_shader_subgroup_ballot : require >-// > // layout(local_size_x = 32, local_size_y = 1, local_size_z = 1)in; > // > // layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimage2D culledWidgetsOut; >@@ -76,6 +117,33 @@ constexpr uint8_t kOverlayCull_comp_00000000[] = { > // uvec4 coordinates[32 + 32]; > // }; > // >+// shared uint intersectingWidgets[32]; >+// >+// void accumulateWidgets(const uint localId) >+// { >+// >+// if(localId < 16) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 16]; >+// if(localId < 8) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 8]; >+// if(localId < 4) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 4]; >+// if(localId < 2) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 2]; >+// if(localId < 1) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 1]; >+// } >+// } >+// } >+// } >+// } >+// } >+// > // uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 blockCoordHigh) > // { > // const uint localId = gl_LocalInvocationID . x; >@@ -85,8 +153,16 @@ constexpr uint8_t kOverlayCull_comp_00000000[] = { > // all(lessThan(widgetCoords . xy, blockCoordHigh))&& > // all(greaterThanEqual(widgetCoords . zw, blockCoordLow)); > // >-// return subgroupBallot(intersects). xy; >+// uvec2 ballot = uvec2(0, 0); >+// >+// intersectingWidgets[localId]= uint(intersects)<< localId; >+// accumulateWidgets(localId); >+// if(localId == 0) >+// { >+// ballot . x = intersectingWidgets[0]; >+// } > // >+// return ballot; > // } > // > // void main() >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc >index 5b64710b313b62aaad57c0d02bb9bb235d795c28..04f6fb07fe72fbd1325119ae1f94b1d693265445 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc >@@ -10,45 +10,94 @@ > > #pragma once > constexpr uint8_t kOverlayCull_comp_00000001[] = { >- 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x5d,0x92,0x5b,0x6b,0x53,0x51, >- 0x10,0x85,0xe7,0x9c,0xdc,0xaa,0x82,0xd6,0x44,0x09,0xb6,0x69,0xa3,0x06,0xfa,0x62, >- 0x29,0x82,0x17,0x04,0x09,0xda,0x97,0x44,0x68,0x8a,0x4a,0x1f,0x6c,0x6b,0xc5,0x6a, >- 0x2f,0x20,0x58,0xb1,0x54,0x0d,0x6a,0x2c,0xd5,0x14,0xfd,0x11,0xfe,0x03,0x1f,0xc4, >- 0x3f,0x27,0x5e,0x40,0x70,0xd6,0xce,0x77,0xe2,0x36,0x07,0x86,0x39,0xb3,0x66,0xf6, >- 0xda,0x6b,0x66,0x76,0x2e,0x6d,0x94,0x2c,0x97,0xd8,0x51,0x1b,0xb3,0x4f,0x36,0xf8, >- 0x4e,0x5a,0x6a,0x09,0xbe,0x89,0xbf,0xe9,0xfe,0x98,0x15,0x03,0xde,0xee,0x2c,0x75, >- 0xe6,0xf6,0x5e,0x6c,0xce,0x5d,0xbe,0x72,0x51,0xf5,0xc7,0x2d,0x17,0xce,0x29,0x77, >- 0xc2,0x4a,0x56,0x70,0x9f,0x77,0xdb,0x79,0xf4,0xe4,0x99,0xf0,0xb2,0x5b,0xcb,0x6d, >- 0xdc,0xcf,0xe7,0x03,0x9f,0x05,0xbe,0x04,0x6b,0x3b,0x5a,0x0e,0xfc,0x66,0x93,0xc4, >- 0xf2,0xc5,0x70,0xc6,0xec,0x96,0x33,0xd6,0xd0,0xd6,0xc0,0xb7,0xfd,0x4e,0x61,0x29, >- 0xf5,0xd3,0xee,0xcf,0x0f,0x73,0x83,0xf8,0x5c,0xc4,0xdf,0x82,0x7f,0x82,0x78,0x6d, >- 0xa4,0x7e,0x8d,0xfa,0x8c,0x5b,0xf1,0x19,0x72,0xdb,0x9c,0x55,0x5c,0xf1,0x1b,0xd3, >- 0x50,0x9b,0x0b,0x5d,0xeb,0xff,0xb4,0xd7,0x48,0xeb,0x59,0xce,0x57,0x3d,0x2e,0xa1, >- 0x3f,0x25,0x1e,0x27,0xce,0x85,0xba,0x7c,0x98,0x41,0x42,0x7f,0xd7,0x89,0xcb,0x60, >- 0x17,0xe0,0xab,0xc0,0xa7,0xfa,0x53,0xe4,0x8a,0xf0,0x55,0xf9,0xcf,0x47,0xf5,0x13, >- 0xcc,0xb5,0xc6,0xfc,0xaa,0x60,0xd3,0xcc,0x6a,0x12,0xae,0x29,0x74,0xd5,0xb8,0x7b, >- 0x2a,0xd4,0xfc,0xeb,0xa5,0x4e,0x2f,0x99,0x96,0x7a,0xd4,0x9b,0xce,0x37,0x86,0x7d, >- 0x99,0xeb,0x4a,0x6d,0x06,0x4d,0x97,0xdc,0xcf,0x90,0xcb,0x34,0xdd,0xa0,0xe7,0xac, >- 0xc7,0xd6,0x48,0x8f,0x0b,0x6e,0x63,0x6e,0xb3,0xbe,0x63,0xcd,0xac,0x03,0xb6,0x10, >- 0xe6,0x7d,0xc4,0x56,0xe9,0x33,0xb1,0xff,0xbf,0x14,0xcd,0xd2,0x73,0x1f,0x6c,0x95, >- 0x7b,0x14,0xaf,0x45,0xbb,0x78,0xe8,0xbe,0x3e,0xa2,0x6b,0x0b,0xce,0x59,0x8f,0xb4, >- 0x83,0x6d,0x66,0xb5,0x85,0x5d,0x75,0x3d,0x29,0xf3,0x35,0x7a,0xf8,0xe9,0x88,0xde, >- 0x76,0x93,0x7d,0xb6,0xe9,0xe7,0xb6,0x2b,0x2f,0x85,0x77,0x3a,0xc0,0xda,0x9c,0x11, >- 0xff,0x21,0x7d,0x2d,0x92,0x57,0x7f,0x07,0x60,0x77,0xc0,0x85,0xcd,0x3b,0xa6,0x1d, >- 0x3f,0xe5,0x1d,0x54,0xb8,0x47,0x5a,0x77,0xc0,0xe7,0x3d,0xd2,0xec,0x9f,0x0f,0x7b, >- 0x1f,0xe4,0x9a,0xbc,0x87,0x5d,0x72,0x77,0x9d,0x4b,0xe7,0xf6,0xc0,0x2c,0xc2,0x5e, >- 0x82,0xa9,0xb7,0x6f,0x8e,0x69,0x5f,0xaf,0xa8,0x55,0xee,0x87,0x77,0xda,0xe3,0xcc, >- 0x6f,0xe7,0x55,0xae,0xeb,0xd6,0xa3,0xff,0x6e,0xd4,0xef,0x6b,0xb8,0x76,0xa3,0x7e, >- 0xc5,0xa9,0x77,0xf0,0x86,0xbc,0x7a,0xfc,0xec,0x3c,0xba,0xe7,0x2d,0xf8,0x2f,0xe7, >- 0xc9,0xf8,0xe4,0xbf,0x3b,0x9b,0xf2,0xef,0xd0,0x52,0xa0,0xb6,0x8b,0x9e,0x7e,0xa4, >- 0x47,0x35,0xfb,0x6e,0x7d,0xce,0xef,0x47,0x7a,0x0e,0x22,0x3d,0x29,0x3b,0xfb,0x8a, >- 0x9e,0xf7,0xe4,0x17,0x23,0x3d,0x1f,0xc0,0xa5,0x27,0xe3,0xeb,0x47,0x7a,0x0e,0xd1, >- 0xd4,0xa3,0x56,0x77,0x2d,0x25,0x85,0x30,0xeb,0x8f,0xbc,0x6d,0xd5,0x7c,0x61,0x8e, >- 0xf7,0xd8,0x47,0x05,0xdd,0x2b,0x91,0x6e,0xe5,0x96,0xdd,0x56,0xb8,0x67,0x99,0xbd, >- 0xe9,0xcd,0x3e,0xe0,0xbd,0xf6,0x78,0xab,0xeb,0xbc,0x95,0x6c,0x67,0x8f,0xb9,0x2f, >- 0xde,0xe3,0x06,0x58,0x12,0x66,0x5c,0x0a,0x9a,0x36,0xa9,0xdd,0x40,0x43,0x25,0xfc, >- 0xe7,0x03,0xff,0x3a,0x79,0xf5,0x9a,0x69,0x90,0xff,0xe3,0x0c,0xd7,0xdc,0xfe,0x02, >- 0xd4,0xf4,0x04,0xb7,0x08,0x06,0x00,0x00 >+ 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x6d,0x97,0xff,0x4f,0xd5,0x65, >+ 0x14,0xc7,0x9f,0xe7,0x02,0x57,0x90,0x51,0x0a,0x16,0x09,0x58,0xe4,0x35,0x97,0x13, >+ 0xaf,0xe5,0x84,0x30,0xc7,0xb7,0x75,0x8d,0x72,0xa8,0xc0,0x45,0xc5,0x89,0x02,0x86, >+ 0x4b,0x72,0x32,0xbe,0xdc,0x1f,0x9a,0xa1,0xb8,0x56,0xfd,0x54,0x7f,0x41,0x7f,0x41, >+ 0xd8,0xca,0xcd,0x1f,0xc5,0x70,0x95,0x5f,0x7e,0xcc,0x2d,0xd7,0x8a,0x55,0xc8,0x2c, >+ 0x5c,0x6d,0x4d,0x7f,0x10,0x8d,0xc6,0xe8,0x9c,0xcf,0xf3,0x3e,0xf8,0xe6,0x16,0xdb, >+ 0xb3,0xcf,0xe7,0xbc,0xcf,0xf3,0x9c,0xf3,0x7a,0x9e,0xf3,0xf9,0x1c,0x3e,0x37,0x27, >+ 0x96,0x58,0xe1,0x9c,0x77,0x2b,0x5d,0xbe,0xfb,0xc4,0xbb,0xe8,0x6f,0xb5,0x8b,0x39, >+ 0xbd,0x2d,0x74,0xf1,0xe8,0xda,0xdc,0x92,0x6e,0x49,0x8e,0x64,0xfa,0x92,0xdb,0xab, >+ 0x5f,0x52,0xff,0x13,0x2e,0x27,0x9a,0xa7,0xbe,0x27,0xdd,0x0a,0x97,0x27,0xd7,0x5c, >+ 0x19,0xa7,0x7a,0xfb,0x07,0x54,0x4f,0xcb,0x18,0x97,0xb1,0x4a,0xd6,0xe7,0x46,0xf1, >+ 0x9c,0x6b,0xc4,0xfc,0x28,0x9e,0xa8,0xe9,0x28,0xbe,0x73,0xe5,0xb0,0xbb,0xe4,0x1a, >+ 0x8f,0xd6,0x38,0xf7,0x86,0x44,0x3c,0x12,0x50,0x5c,0x02,0xd7,0x66,0xc9,0xa9,0x5a, >+ 0x0c,0xf3,0xbb,0xe5,0xba,0x7e,0xc9,0x17,0xec,0xe7,0x29,0xfe,0x38,0xe2,0x97,0xc1, >+ 0x9e,0xcc,0x9a,0x3f,0x89,0xf9,0x16,0x5b,0xed,0xb5,0xf0,0xdd,0xc0,0x5a,0xb5,0x4b, >+ 0x24,0x63,0x2c,0x9a,0x9b,0x13,0xed,0x5a,0xef,0x9f,0x92,0x39,0xca,0x5a,0x89,0xf5, >+ 0xa5,0x62,0x17,0x82,0x5f,0xfd,0x9b,0xe1,0x2f,0xc6,0x7e,0xd6,0x88,0x5a,0x42,0x7a, >+ 0x29,0xd6,0x56,0x88,0xfd,0x0c,0xd6,0x05,0x2d,0x37,0xca,0xa9,0x67,0xa6,0xfa,0x4e, >+ 0xd8,0x65,0xd0,0xd4,0x5f,0x81,0xfb,0x38,0xc5,0xd3,0x33,0xca,0x27,0x3b,0x89,0x39, >+ 0x66,0xef,0xc8,0xe2,0x4a,0xe1,0x9c,0x94,0xbb,0x0d,0xb1,0x72,0x10,0xbf,0x1d,0xbe, >+ 0x36,0xe4,0x6f,0x47,0x3d,0x3d,0xad,0xef,0xc0,0xbe,0x75,0xfe,0x7e,0xf8,0xe2,0x88, >+ 0xd7,0x89,0x7b,0xce,0x7f,0x18,0xf5,0xaf,0x40,0x9d,0x3b,0xa1,0x3d,0x8b,0x9a,0x76, >+ 0x21,0xd6,0x51,0x70,0x1e,0x41,0x6e,0xb5,0xbb,0xe9,0xcc,0x7b,0x70,0x6e,0xc6,0xa2, >+ 0x76,0x2f,0xb1,0xf4,0x61,0x6e,0x27,0x58,0x86,0xa3,0xfa,0x05,0xad,0x4a,0x9e,0x29, >+ 0xad,0xd1,0x18,0xf8,0x3b,0x68,0x7f,0xe3,0x88,0x69,0x73,0xbe,0xc4,0x99,0x26,0xa2, >+ 0x67,0xa0,0xc0,0x5d,0xc6,0x9e,0xf0,0x7a,0x2c,0xfd,0xc5,0xa2,0x3d,0x84,0xdc,0x5f, >+ 0x41,0xbb,0x8c,0xb8,0x6a,0x4f,0xd2,0xf3,0xf1,0xb5,0x5c,0x7b,0x96,0x58,0xe2,0xd1, >+ 0xf9,0xde,0xc0,0x39,0xa4,0x30,0xec,0xbc,0xde,0x93,0x44,0xf7,0x16,0x17,0x17,0xcd, >+ 0x1e,0x15,0xfb,0x2e,0xd9,0x67,0xc4,0xbe,0x43,0xf6,0x59,0xb1,0x67,0xc8,0x1e,0x13, >+ 0xfb,0xb6,0xd8,0x35,0xb2,0x9f,0x18,0x6a,0xe1,0x50,0xe3,0x47,0xa2,0xe8,0xfb,0x5a, >+ 0x87,0xda,0x9f,0xc7,0xfe,0xf7,0xc9,0x7b,0xac,0x7b,0xff,0x1c,0xda,0x79,0xac,0xd1, >+ 0x3d,0x7f,0x80,0x73,0xb9,0x00,0xbf,0x9e,0xcf,0x39,0x68,0x17,0xa1,0xab,0xd6,0x24, >+ 0x9a,0x3e,0x0f,0xdf,0xe1,0x99,0xe9,0x40,0x1e,0x65,0xba,0x09,0xbd,0x49,0x2c,0xad, >+ 0xd3,0xf7,0xa8,0x6d,0x2f,0x7c,0x75,0x78,0x76,0x6e,0xc1,0xd7,0x26,0xb1,0x74,0xdd, >+ 0x0f,0xd0,0x1c,0x69,0x3f,0x42,0x8b,0x45,0xb9,0xf3,0xa2,0x1a,0xff,0x84,0xb9,0xea, >+ 0x7b,0x28,0x3b,0x9d,0xc6,0x9a,0x79,0x89,0xab,0xbe,0x29,0x19,0xd3,0xd8,0xff,0x14, >+ 0xed,0xf7,0x67,0xc4,0xba,0x45,0xfb,0xd5,0x98,0xfa,0xec,0xfc,0x02,0xbf,0xee,0xf1, >+ 0x53,0x89,0xa3,0x79,0x7e,0x85,0xfe,0xb7,0xc4,0xb1,0x78,0x7a,0x7d,0x20,0xf1,0xd4, >+ 0x7f,0x1b,0x2c,0x79,0x98,0x3b,0x05,0x9e,0x59,0xe2,0xd1,0x39,0x33,0x32,0x66,0xb1, >+ 0x7e,0x86,0x78,0xee,0x10,0x4f,0x0c,0x35,0xfb,0x02,0x3c,0xbf,0xc1,0x7f,0x81,0x78, >+ 0x7e,0x87,0xae,0x3c,0x16,0x6f,0x96,0x78,0xee,0x82,0x69,0x1a,0x73,0x67,0xe8,0xcc, >+ 0xfe,0xc0,0xd9,0x97,0x82,0x31,0xee,0x1f,0x33,0xaa,0xef,0x4f,0x19,0xff,0x20,0xa6, >+ 0xde,0x7f,0x26,0xa7,0xaf,0xe7,0xff,0x17,0xe2,0xa6,0x50,0xe3,0x6f,0x51,0x97,0x7b, >+ 0xf0,0xdd,0xc4,0xb3,0xa0,0xbd,0xea,0x3e,0xfa,0x97,0x6a,0xf5,0x92,0xe3,0x3e,0xe6, >+ 0x19,0xc3,0x2a,0x1f,0x7c,0xc5,0x60,0x68,0x22,0x06,0xf5,0xad,0x96,0xa1,0x9a,0x32, >+ 0xe8,0xfd,0x39,0xe4,0x2a,0xa6,0x75,0x96,0xab,0xc4,0x87,0x5c,0xea,0xb3,0xe7,0x6e, >+ 0x8d,0x0f,0xba,0xd9,0x4f,0xfb,0xc0,0x74,0x15,0x71,0x4a,0x7d,0xd0,0x74,0x9e,0xf1, >+ 0xa9,0x66,0x7c,0x6b,0x91,0x27,0x01,0xbe,0x46,0xe2,0x53,0x5f,0x99,0x8c,0x46,0xf0, >+ 0x95,0x11,0x5f,0x39,0xad,0x33,0xbe,0x0a,0xf0,0x95,0x13,0xcf,0x3a,0x1f,0x74,0xb3, >+ 0x9f,0xcb,0xe2,0xab,0xf4,0x41,0x5b,0x47,0x7c,0x95,0xc4,0xb7,0x1e,0x79,0x92,0xe0, >+ 0x6b,0x20,0x3e,0xf5,0x25,0x64,0x34,0x80,0x2f,0x41,0x7c,0x1b,0x68,0x9d,0xf1,0xbd, >+ 0x00,0xbe,0x0d,0xc4,0xb3,0xd1,0x07,0xdd,0xec,0x17,0xb3,0xf8,0x36,0xf9,0xa0,0x6d, >+ 0x24,0xbe,0x4d,0xc4,0xb7,0x19,0x79,0x76,0x80,0xaf,0x9e,0xf8,0xd4,0x57,0xa5,0xeb, >+ 0xc0,0x57,0x45,0x7c,0x5b,0x68,0x9d,0xf1,0x25,0xc1,0xb7,0x85,0x78,0xb6,0xfa,0xa0, >+ 0x9b,0xfd,0x72,0x16,0xdf,0x36,0x1f,0xb4,0xad,0xc4,0xb7,0x8d,0xf8,0xb6,0x23,0x4f, >+ 0x0a,0x7c,0x75,0xc4,0xa7,0xbe,0x6a,0x8d,0x0d,0xbe,0x6a,0xe2,0xab,0xa1,0x75,0xc6, >+ 0xf7,0x0a,0xf8,0x6a,0x88,0xa7,0xd6,0x07,0xdd,0xec,0x57,0xb3,0xf8,0x76,0xfa,0xa0, >+ 0xd5,0x12,0x9f,0x6a,0xfa,0x3e,0x5b,0xde,0x3a,0xd8,0x76,0x4e,0xf5,0xb0,0xad,0xae, >+ 0x0d,0xb0,0xed,0x39,0x6c,0x84,0x6d,0xef,0x8d,0x5e,0xc7,0xb1,0xdf,0x07,0x78,0x17, >+ 0x3b,0xb0,0xdf,0x79,0xea,0x4b,0xea,0x9b,0x8b,0xee,0xc3,0xba,0x39,0xda,0xdb,0x43, >+ 0xbc,0xc7,0xbd,0xd4,0xd3,0x1f,0x41,0x6f,0x17,0x4b,0x7b,0xd7,0xbb,0x3e,0x68,0x63, >+ 0x88,0xa9,0x0c,0x16,0x6b,0x1e,0x3d,0x49,0xe7,0x7d,0xe4,0xc3,0x1c,0xe5,0xd2,0x35, >+ 0x73,0x98,0x1b,0x07,0xaf,0xf6,0x9c,0xf7,0x71,0x3e,0x0b,0xd4,0xa3,0xac,0xff,0x68, >+ 0x93,0xfe,0xbf,0xfe,0x13,0xc3,0x07,0xe6,0x02,0x71,0xe7,0xa0,0x26,0x0b,0xe8,0x3f, >+ 0x6a,0xc7,0xa8,0xfe,0xaf,0x61,0xbe,0xf5,0x9f,0x0c,0xd5,0x5f,0x7d,0x29,0x19,0x19, >+ 0x70,0xa5,0xa8,0xfe,0xbb,0x50,0x7f,0xfd,0x5f,0x6d,0xb9,0x5e,0x47,0xae,0x5d,0x54, >+ 0xef,0x66,0x1f,0x74,0xb3,0xdf,0xf4,0x81,0xc9,0xea,0xbf,0xdb,0x07,0xad,0xd9,0x3f, >+ 0xe6,0xdb,0x4d,0x7c,0x2d,0xe0,0xb3,0xfe,0x33,0x42,0x7c,0xea,0xdb,0x23,0x63,0x04, >+ 0x7c,0x7b,0x88,0x6f,0x2f,0xf8,0x46,0x89,0x6f,0x1f,0xf8,0xf6,0x12,0x4f,0xab,0x0f, >+ 0xba,0xd9,0xed,0x59,0x7c,0x69,0x1f,0xb4,0x56,0xe2,0x4b,0x13,0xdf,0x7e,0xf0,0x59, >+ 0xff,0x19,0x26,0x3e,0xf5,0x1d,0x90,0x31,0x0c,0xbe,0x03,0xc4,0x77,0x10,0x7c,0x67, >+ 0x88,0xaf,0x13,0x7c,0x07,0x89,0xe7,0x90,0x0f,0xba,0xd9,0x87,0xb3,0xf8,0xba,0x7c, >+ 0xd0,0x0e,0x11,0x5f,0x17,0xf1,0x1d,0x05,0x9f,0xf5,0x9f,0x21,0xe2,0x53,0x5f,0xb7, >+ 0x8c,0x21,0xf0,0x75,0x13,0x5f,0x0f,0xf8,0xce,0x12,0x5f,0x2f,0xf8,0x7a,0x88,0xe7, >+ 0x98,0x0f,0xba,0xd9,0x7d,0x59,0x7c,0xc7,0x7d,0xd0,0x8e,0x11,0xdf,0x71,0xe2,0x7b, >+ 0x1b,0x7c,0xd6,0x7f,0x06,0x89,0x4f,0x7d,0x27,0x64,0x0c,0x82,0xef,0x04,0xf1,0xf5, >+ 0x83,0x6f,0x8c,0xf8,0xde,0x01,0x5f,0x3f,0xf1,0x9c,0xf4,0x41,0x37,0xfb,0x54,0x16, >+ 0xdf,0x80,0x0f,0xda,0x49,0xe2,0x1b,0x40,0xff,0xb0,0xbc,0x83,0xb0,0xed,0x9c,0x86, >+ 0x60,0x5b,0x5d,0x87,0x61,0xdb,0x73,0x38,0x02,0xdb,0xde,0x9b,0x8c,0x5f,0xfe,0x7e, >+ 0xeb,0xd5,0x7a,0xc1,0x87,0x3e,0xf4,0x83,0x79,0xf4,0x8d,0x0c,0xf5,0xaa,0x7c,0xbf, >+ 0xbc,0x57,0x15,0xd1,0xd9,0xa8,0xaf,0x40,0x46,0x11,0x62,0x16,0xd0,0x39,0xac,0xf4, >+ 0xff,0xed,0x55,0x85,0x3e,0xe8,0xd6,0xab,0x4e,0xfb,0xa0,0x69,0x7e,0x8f,0xfe,0x63, >+ 0xb1,0x8a,0x88,0xef,0x63,0xcc,0x51,0xe6,0xd3,0xc8,0xa9,0x2c,0x13,0x6e,0x39,0xcb, >+ 0x25,0xb9,0x9f,0x40,0xaf,0xbb,0x84,0xbc,0xfa,0x5b,0xe0,0x0a,0x7e,0x07,0x8c,0xe2, >+ 0x37,0xc0,0x37,0xf8,0x86,0xb6,0x6f,0xd9,0xab,0xc8,0xc1,0xdf,0xb7,0xd7,0xa0,0xa9, >+ 0xdc,0x2a,0x1c,0xfa,0x5d,0x7c,0x1d,0x73,0xaf,0xd1,0xef,0x97,0xb7,0x24,0xe6,0x15, >+ 0xc4,0xbc,0x8e,0x3d,0x18,0xc3,0x44,0xd4,0xf3,0xbc,0xab,0x95,0xf1,0x2f,0x51,0xce, >+ 0x09,0xfc,0xe4,0x0f,0x00,0x00 > }; > > // Generated from: >@@ -57,8 +106,6 @@ constexpr uint8_t kOverlayCull_comp_00000001[] = { > // > // #extension GL_EXT_samplerless_texture_functions : require > // >-// #extension GL_KHR_shader_subgroup_ballot : require >-// > // layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in; > // > // layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimage2D culledWidgetsOut; >@@ -68,6 +115,33 @@ constexpr uint8_t kOverlayCull_comp_00000001[] = { > // uvec4 coordinates[32 + 32]; > // }; > // >+// shared uint intersectingWidgets[32]; >+// >+// void accumulateWidgets(const uint localId) >+// { >+// >+// if(localId < 16) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 16]; >+// if(localId < 8) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 8]; >+// if(localId < 4) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 4]; >+// if(localId < 2) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 2]; >+// if(localId < 1) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 1]; >+// } >+// } >+// } >+// } >+// } >+// } >+// > // uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 blockCoordHigh) > // { > // const uint localId = gl_LocalInvocationID . x; >@@ -77,8 +151,29 @@ constexpr uint8_t kOverlayCull_comp_00000001[] = { > // all(lessThan(widgetCoords . xy, blockCoordHigh))&& > // all(greaterThanEqual(widgetCoords . zw, blockCoordLow)); > // >-// return subgroupBallot(intersects). xy; >+// uvec2 ballot = uvec2(0, 0); >+// >+// if(localId < 32) >+// { >+// intersectingWidgets[localId]= uint(intersects)<< localId; >+// accumulateWidgets(localId); >+// if(localId == 0) >+// { >+// ballot . x = intersectingWidgets[0]; >+// } >+// } >+// else >+// { >+// const uint graphLocalId = localId - 32; >+// intersectingWidgets[graphLocalId]= uint(intersects)<< graphLocalId; >+// accumulateWidgets(graphLocalId); >+// } >+// if(localId == 0) >+// { >+// ballot . y = intersectingWidgets[0]; >+// } > // >+// return ballot; > // } > // > // void main() >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc >index 46b925aa76edb354c180fed8d4a685c6730ed32d..f36a3cad9467e60705615b6e0a6e0dc439e7fec2 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc >@@ -10,54 +10,89 @@ > > #pragma once > constexpr uint8_t kOverlayCull_comp_00000002[] = { >- 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x6d,0x94,0xdb,0x4b,0x94,0x51, >- 0x14,0xc5,0xf7,0x7c,0x33,0x8e,0x56,0x50,0xe6,0x14,0x62,0xde,0x2a,0xc1,0x17,0x45, >- 0x82,0x2e,0x04,0x21,0x93,0xf4,0x60,0xa8,0xe0,0x25,0x7a,0xeb,0x25,0xf2,0x36,0x92, >- 0x81,0xd6,0x43,0x82,0x92,0x65,0x17,0x93,0x6a,0x22,0xea,0xa9,0x07,0x93,0x30,0xb1, >- 0x46,0xb1,0x8c,0xd0,0x9e,0xfb,0x97,0xa2,0x12,0x82,0xf6,0x3e,0xf3,0xfb,0x6c,0x37, >- 0x34,0x70,0x38,0xee,0xcb,0x59,0x67,0xad,0xbd,0x8e,0x5f,0x32,0x6a,0x2a,0x97,0x64, >- 0x42,0xf6,0x4a,0x85,0x7c,0x95,0xe2,0xef,0xa0,0x44,0x92,0x60,0x6f,0x67,0xcf,0xea, >- 0xbe,0x4f,0xd2,0x21,0xdf,0xd9,0x73,0xa9,0xa7,0xed,0xe6,0xad,0xc1,0xb6,0x53,0xa7, >- 0x4f,0x58,0xff,0x7e,0x49,0x86,0x73,0x56,0x3b,0x20,0xe5,0x52,0xa6,0x7b,0x4a,0xd7, >- 0xf8,0xd5,0xdc,0x0d,0xcb,0x57,0xe9,0xea,0xd2,0x55,0xa9,0xe7,0x53,0x01,0x4f,0xe4, >- 0x28,0xfd,0x01,0x4f,0xb3,0x55,0x01,0x5f,0xa4,0x96,0xd8,0xf6,0x74,0x38,0x23,0x72, >- 0x51,0x11,0xeb,0xe0,0xd6,0xc4,0xde,0xa9,0x77,0x5a,0x2e,0xa2,0xbf,0x41,0xf7,0xe3, >- 0xbb,0xb5,0x62,0x7c,0xcc,0xe1,0x77,0x81,0x7f,0x84,0x38,0x57,0xd2,0x9f,0xa3,0x3f, >- 0xc6,0xb6,0xb8,0x86,0xda,0x24,0x67,0x2d,0xce,0xe8,0x8d,0x51,0xe8,0x4d,0x06,0xd5, >- 0xf6,0xf7,0x61,0xed,0x49,0xa3,0xc9,0x7e,0xd5,0x1a,0x97,0xc3,0x3f,0x22,0xae,0x24, >- 0x4e,0x86,0xbe,0x54,0x98,0x41,0x02,0x7d,0xe7,0x88,0xab,0xc8,0xb5,0x80,0x97,0x01, >- 0xcf,0xfa,0x0f,0x51,0x4b,0x83,0x57,0xcd,0xdf,0x29,0xd7,0x6f,0xda,0xce,0xeb,0xaa, >- 0x63,0x7e,0xd5,0xe4,0x1a,0x98,0x55,0x2d,0x58,0xf5,0xf0,0xaa,0xe3,0xee,0xfa,0xd0, >- 0xf3,0x57,0x4b,0xa3,0xf3,0xa7,0xc5,0xc5,0x31,0x97,0xa6,0x5d,0x5d,0xa2,0xbc,0x22, >- 0x69,0x86,0xd3,0x49,0xdd,0x9b,0xa9,0xc5,0x9c,0xb2,0x25,0x9a,0x2e,0x30,0x83,0x58, >- 0x73,0x57,0x49,0xbd,0x57,0x57,0x85,0x8b,0xfb,0xd0,0xd8,0xaa,0x6f,0xc0,0x66,0xda, >- 0x4f,0x4f,0x9f,0xeb,0xb9,0x02,0xbf,0x1a,0xd9,0x23,0x23,0xcc,0x25,0x21,0xff,0xfe, >- 0x22,0x34,0x1a,0xff,0x51,0x72,0x23,0xf0,0xb0,0x38,0xe7,0xbc,0xbb,0xae,0x7b,0x23, >- 0x67,0x5a,0x15,0xcd,0x3c,0x9a,0xe4,0x9e,0x2c,0xeb,0x8c,0xf2,0x89,0xe0,0x26,0x68, >- 0xfa,0xa9,0x19,0x7b,0xfb,0xed,0xf8,0xdd,0x8d,0xbe,0x5e,0x65,0x6e,0xdc,0x7b,0xc8, >- 0x75,0x73,0xc6,0x38,0xde,0x47,0xd7,0x00,0x75,0xd3,0x37,0x4b,0xee,0x32,0x79,0xcb, >- 0x75,0x68,0xce,0xde,0xc0,0x6d,0xde,0x49,0x86,0x7b,0x4c,0xeb,0x14,0xf9,0x0e,0x8d, >- 0xcc,0x9b,0xe9,0x5d,0xad,0xc5,0x5a,0x3b,0xef,0x65,0x86,0x5a,0xbf,0x62,0xd9,0xb9, >- 0x3b,0xe4,0xc4,0xe5,0xee,0x92,0x33,0x6d,0x1b,0x9a,0x33,0x3f,0xef,0xd1,0x6b,0xb5, >- 0x1f,0xaa,0x74,0x9e,0x33,0x3b,0x8a,0x6b,0xb5,0x39,0x5d,0xf3,0xe8,0x9f,0x73,0x7a, >- 0x1f,0x80,0x35,0xe3,0xf4,0x1a,0xa6,0xbd,0x93,0x87,0xd4,0x4d,0xe3,0x6b,0xc5,0xb1, >- 0x7b,0x1e,0x91,0xff,0xa5,0x38,0x31,0x9e,0xed,0xdf,0x15,0xcd,0xea,0x8f,0xe1,0x52, >- 0x46,0xef,0x1c,0x7c,0xf2,0x8e,0x8f,0xf5,0x2c,0xe8,0xca,0x73,0x7e,0xc1,0xf1,0x79, >- 0xe2,0xf8,0x44,0x78,0xb6,0x0e,0x9f,0xa7,0xd4,0x07,0x1c,0x9f,0x67,0xe4,0x8d,0x4f, >- 0x8c,0x97,0x77,0x7c,0x9e,0xc3,0x69,0x9e,0x5e,0xbb,0x6b,0x55,0xa7,0x68,0x73,0x7c, >- 0x41,0x3d,0x8b,0x57,0xdf,0x98,0xef,0x4b,0x6a,0xe6,0xcb,0x68,0xa2,0xd8,0xfb,0x8a, >- 0xff,0x0b,0xa1,0x3e,0x4b,0xef,0x22,0x6f,0x6e,0xca,0x79,0xfb,0xc6,0x79,0xbb,0xe8, >- 0xbc,0x5d,0xa2,0x16,0xfb,0xf8,0x96,0x9c,0xf7,0x76,0x99,0x9c,0xf7,0xf6,0x1d,0xbd, >- 0xcb,0xcc,0xb2,0xe0,0x66,0x69,0xb5,0x15,0x5d,0x05,0xb4,0xaf,0xb8,0x59,0xae,0x82, >- 0xb5,0xf4,0x1f,0x6f,0xdf,0x53,0xf7,0xde,0x7e,0x20,0x6f,0xb3,0x8c,0xf1,0x0a,0x6e, >- 0x96,0x6b,0x70,0xc9,0xd3,0xbb,0x02,0x9f,0x4d,0xc7,0x67,0x2d,0xf8,0x25,0x21,0x67, >- 0xe7,0xd7,0x1d,0x9f,0x0d,0xc7,0xa7,0xd4,0xdb,0x8f,0xd4,0xbd,0xb7,0x9f,0xc8,0x1b, >- 0x9f,0x18,0x6f,0xd3,0xf1,0xf9,0x0c,0xa7,0x02,0xbd,0xeb,0xce,0xdb,0x2f,0xd4,0x4b, >- 0xbd,0xdd,0xa2,0xe6,0xbd,0xdd,0x76,0xde,0x6e,0x85,0x19,0x14,0xe7,0x3e,0x48,0x5f, >- 0x06,0x9d,0xc3,0x4e,0xa7,0xd5,0x86,0x74,0x0d,0xc3,0x6b,0x08,0x9f,0xed,0x7b,0x35, >- 0xc6,0xb7,0x6a,0x9a,0xef,0xd4,0x38,0xdf,0x8d,0x3e,0xe5,0x6d,0xef,0x60,0x82,0xf7, >- 0xb4,0x0d,0xb6,0xad,0x6b,0xda,0x3b,0x46,0xef,0x04,0x9a,0x63,0x6c,0xdb,0x7f,0xab, >- 0x7b,0x67,0x75,0xfd,0x01,0xe4,0x9e,0xfb,0xe2,0x0c,0x08,0x00,0x00 >+ 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x65,0x96,0x4b,0x6c,0x95,0x55, >+ 0x10,0xc7,0xcf,0xdc,0xdb,0x16,0x94,0x44,0x1e,0x15,0x2b,0xe5,0xda,0x40,0xaf,0x89, >+ 0x21,0x9a,0x82,0xa9,0x8f,0x5e,0xb5,0x4a,0x25,0xb6,0xbd,0xb5,0xb5,0xf4,0xf6,0x21, >+ 0xf6,0xb1,0x20,0x98,0x10,0x17,0xb2,0x91,0x9d,0x2e,0x4c,0x60,0x51,0x4c,0x24,0x71, >+ 0xe3,0xa6,0x1b,0x8a,0x25,0x3e,0x02,0xc6,0x85,0x4d,0x24,0x46,0x1b,0xb4,0x10,0xb5, >+ 0x26,0x46,0x16,0x56,0xd3,0x44,0x90,0x48,0x04,0x89,0x44,0x10,0xad,0x05,0x09,0xce, >+ 0xff,0x3b,0xff,0x69,0xa7,0x5f,0x9b,0x9c,0x7c,0xdf,0xfc,0x67,0xce,0xcc,0xef,0x3c, >+ 0xbe,0xe9,0xcd,0x66,0xf2,0xcb,0x42,0x90,0x70,0x7b,0x58,0x1e,0xf6,0x4b,0x48,0xfe, >+ 0x56,0x87,0x4c,0xc0,0xeb,0x8a,0x50,0x91,0x3c,0x5b,0xda,0xbb,0xdb,0xeb,0x5e,0xd9, >+ 0xfb,0x62,0xdd,0x43,0x0f,0x6f,0x81,0xff,0x8e,0x90,0x4d,0xe2,0xe0,0x5b,0x19,0x96, >+ 0x85,0x72,0x7d,0x96,0xe9,0x78,0x79,0xe7,0x4b,0x7b,0xa0,0xb7,0xea,0x18,0xd6,0xb1, >+ 0x4a,0xe7,0x97,0x25,0xf9,0xf0,0x1e,0xe3,0x93,0x7c,0xaa,0xb6,0x26,0xf9,0x43,0x58, >+ 0x4f,0xbb,0x4b,0x9f,0x15,0x8c,0x6b,0xd5,0x8c,0xa5,0x88,0x12,0xf2,0x7c,0xb6,0x68, >+ 0x4d,0x68,0x19,0xc6,0xf7,0xe8,0xb3,0x76,0xde,0x17,0xed,0x8d,0x2e,0xff,0x30,0xf3, >+ 0x57,0xd3,0x1e,0x4b,0xc5,0x8f,0x31,0xde,0x72,0xc3,0x5e,0x47,0xdf,0x31,0xce,0x85, >+ 0x5d,0xa9,0x15,0x33,0x49,0x6c,0x36,0x59,0x35,0xde,0xd7,0x6a,0x0c,0x58,0x37,0x70, >+ 0x7e,0x95,0xda,0x2b,0xc8,0x0f,0xff,0xfd,0xf4,0xaf,0xd1,0xb1,0x5c,0xc7,0x9d,0xaa, >+ 0x56,0x3a,0xbd,0x8a,0xeb,0xcc,0xa9,0x7d,0x37,0xe7,0x55,0x25,0xf9,0xca,0x92,0x9a, >+ 0xd8,0x33,0xe8,0x8f,0xd3,0xae,0xa6,0x06,0x7f,0x8e,0xef,0x15,0x2e,0x5f,0x9e,0x9a, >+ 0xd9,0x75,0x29,0x8e,0x02,0xf7,0x05,0x9c,0xcd,0x9c,0x9b,0x65,0xbe,0x16,0xfa,0x9a, >+ 0x59,0xaf,0x85,0xe7,0x27,0x6e,0x7e,0x91,0xeb,0x44,0x7c,0x1b,0x7d,0x15,0xcc,0xd7, >+ 0xc1,0x77,0x5f,0x7f,0x3b,0xf7,0x26,0xc7,0x73,0xed,0xa0,0x56,0xc3,0x33,0xec,0x62, >+ 0xae,0x6e,0x72,0x96,0x58,0x1b,0x76,0x8f,0xdb,0xe3,0x5e,0xe6,0x31,0x16,0xd8,0x7d, >+ 0x8e,0xe5,0x05,0xc6,0x76,0x90,0x65,0x77,0x72,0x5e,0x51,0x7b,0x40,0xef,0x10,0xce, >+ 0x64,0x2f,0xf9,0x8b,0x6e,0x7d,0xc3,0xcc,0x69,0x31,0x6f,0x72,0x0f,0xf3,0xc9,0x99, >+ 0xdf,0x16,0x0e,0x73,0x4d,0xfc,0x1c,0xe6,0xff,0x32,0xc9,0x1a,0x62,0xed,0x77,0xa8, >+ 0x1d,0x66,0x5e,0xd8,0x63,0xee,0x3e,0xbc,0xab,0xcf,0xde,0x79,0x96,0x8a,0x64,0x7f, >+ 0x8f,0xf1,0x9c,0x0b,0xf3,0x67,0x92,0x4d,0xea,0xef,0xd3,0x42,0x8f,0x28,0x4b,0x86, >+ 0xfb,0x18,0x78,0x3e,0xff,0xaa,0x82,0x6f,0xab,0x91,0xe7,0x76,0x80,0xec,0x9d,0xfa, >+ 0xcd,0x61,0xde,0x1b,0xd4,0x0e,0x70,0x0e,0x78,0xf7,0x73,0x4d,0x07,0xe9,0xc7,0xda, >+ 0x5e,0xa7,0xf6,0x16,0x75,0x68,0x4d,0xaa,0xe1,0x2c,0x3f,0xe6,0x79,0x17,0x59,0x07, >+ 0xeb,0x1e,0xa7,0xde,0xa4,0x16,0xf6,0xf8,0x13,0x9e,0x4b,0x1f,0x7d,0x8d,0x3c,0xf7, >+ 0xe3,0xf4,0x75,0x69,0x2e,0xcc,0xfb,0x94,0x5a,0x70,0xda,0x67,0xd4,0xb0,0xb6,0x8f, >+ 0x54,0xc3,0xf9,0x7c,0xce,0x58,0xf8,0x66,0x75,0xa5,0x93,0x9c,0x73,0x5d,0xf3,0xc2, >+ 0x37,0xa1,0x63,0x92,0xeb,0x9f,0x70,0xeb,0x3d,0xc1,0x5c,0xc7,0xdd,0x7a,0x91,0x13, >+ 0xe7,0xfe,0x05,0xfd,0x58,0xe3,0x88,0xe6,0x41,0x9d,0x2f,0xa9,0xcf,0x69,0x1e,0xcb, >+ 0x87,0xe7,0xdf,0x9a,0x0f,0xfe,0x93,0x64,0x29,0x67,0xec,0x04,0x79,0xa6,0x1c,0x0f, >+ 0x62,0x4e,0xe9,0x98,0xe2,0xfc,0x53,0x8e,0xe7,0x2b,0xc7,0x93,0xe1,0x99,0x7d,0x48, >+ 0x9e,0xaf,0xe9,0x3f,0xe8,0x78,0xbe,0xa1,0x0e,0x1e,0xcb,0x37,0xe5,0x78,0xbe,0x25, >+ 0xd3,0x24,0x63,0x51,0xeb,0x7d,0xdd,0x45,0xec,0xe3,0x77,0xf4,0x17,0x78,0x56,0x93, >+ 0xdc,0xdf,0xef,0xe9,0x1b,0xe7,0x99,0xa2,0x3f,0x9c,0x66,0xcf,0x80,0xf6,0xa4,0x52, >+ 0x9d,0x66,0x9c,0xed,0xff,0xcf,0xf4,0xad,0xe1,0x7a,0xcb,0x65,0x61,0xbd,0xf0,0x9d, >+ 0xc1,0x9e,0x48,0xe4,0x3b,0xc3,0xfb,0x83,0x5a,0x67,0xdd,0x3c,0xab,0xf5,0x0b,0x6b, >+ 0x9d,0x75,0xf7,0xe7,0x1c,0x75,0xb3,0x7f,0x25,0xd3,0x49,0xe6,0x39,0x4f,0xed,0x9c, >+ 0xe3,0x3b,0xef,0xf8,0x7e,0x63,0x9d,0x3c,0xf9,0xca,0x1c,0x1f,0x7c,0x17,0xf0,0x9d, >+ 0x90,0xef,0x82,0xe3,0xbb,0xe8,0xe6,0x19,0xdf,0xef,0xe4,0xbb,0xe8,0x78,0x2e,0x51, >+ 0x37,0xfb,0x8f,0x14,0xdf,0x65,0x6a,0x97,0x1c,0xdf,0x65,0xc7,0xf7,0x27,0xeb,0xd4, >+ 0x91,0x2f,0xeb,0xf8,0xe0,0xbb,0x82,0xbb,0x40,0xbe,0x2b,0x8e,0xef,0xaa,0x9b,0x67, >+ 0x7c,0x7f,0x91,0xef,0xaa,0xe3,0xb9,0x46,0xdd,0xec,0x7f,0x52,0x7c,0xb3,0xd4,0xae, >+ 0x39,0xbe,0x59,0xc7,0x37,0xc7,0x3a,0x05,0xf2,0x65,0x1c,0xdf,0x5c,0xf2,0x0c,0x89, >+ 0x06,0xbe,0xeb,0x8e,0xef,0x86,0x9b,0x67,0x7c,0xff,0x91,0xef,0x86,0xe3,0xb9,0x49, >+ 0xdd,0xec,0x5b,0x29,0x3e,0x7c,0x98,0xb7,0x18,0x67,0x7c,0xd0,0x70,0xef,0xad,0x6e, >+ 0x86,0xb6,0xed,0x53,0x96,0xb6,0x9d,0x6b,0x19,0x6d,0xbb,0x87,0x78,0x7e,0xc0,0xf5, >+ 0xfd,0x40,0xce,0x22,0xd7,0x37,0xe3,0xbe,0x57,0xf8,0xa6,0x75,0xcc,0xf0,0xfb,0x9a, >+ 0x76,0x6b,0xf9,0x91,0x6b,0xe9,0x73,0xec,0x3f,0x51,0x2f,0xa9,0x85,0x6f,0x7a,0xa7, >+ 0x44,0x6d,0x1f,0xf7,0x0c,0x0c,0x96,0x6b,0x86,0xdf,0x2a,0xe2,0xf6,0x48,0xfc,0xdf, >+ 0x02,0x2e,0xcc,0x99,0x76,0x3d,0xef,0x6d,0xfa,0x83,0xdb,0xdb,0x95,0x12,0x7b,0xff, >+ 0xb8,0xeb,0xab,0xab,0x64,0xa1,0xaf,0xc2,0x6f,0x7d,0x75,0xb5,0x44,0x9f,0xe5,0xab, >+ 0x94,0xa8,0xf9,0xbe,0xba,0x96,0x9a,0xef,0xab,0x77,0x49,0x8c,0x85,0x0f,0xfb,0x92, >+ 0x73,0xe7,0x0e,0x5f,0x95,0x8e,0x1c,0xf7,0x13,0xef,0xd6,0xc7,0xd6,0x31,0x97,0xd5, >+ 0xf0,0x7d,0xb5,0x5a,0xa2,0xdf,0xf7,0xd5,0xf5,0x12,0x75,0xec,0x8d,0xe5,0xc3,0xd3, >+ 0xfa,0xd8,0x3d,0x12,0x59,0x66,0x18,0x5b,0x45,0x9e,0xbc,0xe3,0x41,0x4c,0x8d,0x8e, >+ 0x3c,0xe7,0xd7,0x38,0x9e,0x0d,0x8e,0x27,0xdd,0x57,0x37,0x4a,0xf4,0xfb,0xbe,0x5a, >+ 0x2b,0x51,0x07,0x8f,0xe5,0xcb,0x3b,0x9e,0x7b,0x25,0x32,0x81,0xb1,0x96,0x75,0xad, >+ 0xaf,0xde,0x27,0xd1,0x9f,0xee,0xab,0x9b,0x24,0xfa,0x7c,0x0f,0xdd,0xc4,0x75,0x0c, >+ 0xa5,0xfa,0xe5,0xa3,0x6a,0x0f,0xb1,0x2e,0xde,0xed,0xcc,0x1b,0x64,0x69,0xbf,0x2c, >+ 0x48,0xbc,0x83,0x0d,0xb2,0x70,0x07,0x1f,0x93,0xa8,0x9b,0xfd,0x84,0x2c,0xfe,0x9e, >+ 0x1a,0x25,0x6a,0x88,0x33,0x16,0x68,0x76,0xee,0x4f,0xc9,0xe2,0x7e,0x39,0xe8,0xf8, >+ 0xe0,0xdb,0xaa,0x63,0x90,0x7c,0x5b,0x1d,0x5f,0x93,0x2c,0xed,0x97,0x4f,0x93,0xaf, >+ 0xc9,0xf1,0x6c,0x93,0xa8,0x9b,0xfd,0x4c,0x8a,0xaf,0x59,0xa2,0xb6,0xcd,0xf1,0x35, >+ 0x3b,0xbe,0x56,0x59,0xdc,0x2f,0x07,0x1c,0x1f,0x7c,0x45,0x1d,0x03,0xe4,0x2b,0x3a, >+ 0xbe,0x36,0x59,0xda,0x2f,0x9f,0x25,0x5f,0x9b,0xe3,0x69,0x97,0xa8,0x9b,0xfd,0x5c, >+ 0x8a,0xaf,0x53,0xa2,0xd6,0xee,0xf8,0x3a,0x1d,0x5f,0x97,0x2c,0xee,0x97,0xfd,0x8e, >+ 0x0f,0xbe,0x92,0x8e,0x7e,0xf2,0x95,0x1c,0x5f,0xb7,0x2c,0xed,0x97,0x3d,0xe4,0xeb, >+ 0x76,0x3c,0xbd,0x12,0x75,0xb3,0x9f,0x4f,0xf1,0xed,0x90,0xa8,0xf5,0x3a,0xbe,0x1d, >+ 0xbc,0xcf,0x56,0xb7,0x9f,0xb6,0xed,0xd3,0x00,0x6d,0x3b,0xd7,0x41,0xda,0x76,0x0f, >+ 0x87,0x78,0x57,0xeb,0x65,0x71,0x6f,0xdc,0xac,0x76,0x3d,0x63,0xf0,0x6e,0xdc,0x5b, >+ 0x64,0x69,0x6f,0x7c,0x50,0xa2,0x6e,0xbd,0x71,0xb7,0x44,0xcd,0xf7,0x46,0xcb,0x55, >+ 0x2f,0x0b,0xbd,0xf1,0x55,0xf6,0x46,0x30,0x60,0xce,0x66,0xd7,0xcb,0x46,0xe8,0x0f, >+ 0xdc,0xeb,0xd1,0x54,0xef,0x3e,0xa4,0x63,0x94,0xfd,0xf6,0x10,0x59,0xf0,0x1b,0xfb, >+ 0x08,0x7f,0x5f,0xbf,0xc6,0xdf,0xd6,0xef,0xf1,0xf7,0xed,0x76,0xad,0x89,0x9e,0x79, >+ 0x94,0x7d,0x77,0xc4,0xfd,0xde,0xdf,0xa5,0xb1,0x47,0x18,0x7b,0x94,0xbc,0x96,0x7b, >+ 0x34,0xf9,0xff,0x24,0xa1,0x41,0xc7,0xff,0x7e,0xc7,0xe2,0x37,0x04,0x0f,0x00,0x00 > }; > > // Generated from: >@@ -66,17 +101,37 @@ constexpr uint8_t kOverlayCull_comp_00000002[] = { > // > // #extension GL_EXT_samplerless_texture_functions : require > // >-// #extension GL_KHR_shader_subgroup_arithmetic : require >-// >-// layout(local_size_x = 32, local_size_y = 1, local_size_z = 1)in; >+// layout(local_size_x = 16, local_size_y = 1, local_size_z = 1)in; > // > // layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimage2D culledWidgetsOut; > // > // layout(set = 0, binding = 1)uniform WidgetCoordinates > // { >-// uvec4 coordinates[32 + 32]; >+// uvec4 coordinates[16 + 16]; > // }; > // >+// shared uint intersectingWidgets[16]; >+// >+// void accumulateWidgets(const uint localId) >+// { >+// if(localId < 8) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 8]; >+// if(localId < 4) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 4]; >+// if(localId < 2) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 2]; >+// if(localId < 1) >+// { >+// intersectingWidgets[localId]|= intersectingWidgets[localId + 1]; >+// } >+// } >+// } >+// } >+// } >+// > // uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 blockCoordHigh) > // { > // const uint localId = gl_LocalInvocationID . x; >@@ -86,21 +141,29 @@ constexpr uint8_t kOverlayCull_comp_00000002[] = { > // all(lessThan(widgetCoords . xy, blockCoordHigh))&& > // all(greaterThanEqual(widgetCoords . zw, blockCoordLow)); > // >-// return uvec2(subgroupOr(uint(intersects)<< localId), 0); >+// uvec2 ballot = uvec2(0, 0); >+// >+// intersectingWidgets[localId]= uint(intersects)<< localId; >+// accumulateWidgets(localId); >+// if(localId == 0) >+// { >+// ballot . x = intersectingWidgets[0]; >+// } > // >+// return ballot; > // } > // > // void main() > // { > // > // const uvec2 outCoord = gl_WorkGroupID . xy; >-// const uvec2 blockCoordLow = outCoord * uvec2(8, 4); >-// const uvec2 blockCoordHigh = blockCoordLow + uvec2(8, 4); >+// const uvec2 blockCoordLow = outCoord * uvec2(4, 4); >+// const uvec2 blockCoordHigh = blockCoordLow + uvec2(4, 4); > // > // uvec2 culledWidgets; > // > // culledWidgets . x = cullWidgets(0, blockCoordLow, blockCoordHigh). x; >-// culledWidgets . y = cullWidgets(32, blockCoordLow, blockCoordHigh). x; >+// culledWidgets . y = cullWidgets(16, blockCoordLow, blockCoordHigh). x; > // > // if(gl_LocalInvocationID . x == 0) > // { >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000003.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000003.inc >deleted file mode 100644 >index 16674042091dca8968a4432a252a6c42950c9e7b..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000003.inc >+++ /dev/null >@@ -1,110 +0,0 @@ >-// GENERATED FILE - DO NOT EDIT. >-// Generated by gen_vk_internal_shaders.py. >-// >-// 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. >-// >-// shaders/gen/OverlayCull.comp.00000003.inc: >-// Pre-generated shader for the ANGLE Vulkan back-end. >- >-#pragma once >-constexpr uint8_t kOverlayCull_comp_00000003[] = { >- 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x5d,0x94,0xcb,0x6b,0x13,0x51, >- 0x14,0xc6,0x6f,0x26,0x69,0x52,0x15,0xb4,0x26,0x4a,0xb0,0x4d,0x1b,0x35,0x90,0x8d, >- 0xa5,0x08,0x3e,0x10,0x24,0x98,0x6e,0x52,0x17,0x05,0x15,0x77,0xee,0x24,0x11,0xd2, >- 0x42,0xdd,0xd8,0x87,0x91,0x16,0x34,0xb8,0xb4,0x60,0x11,0x0d,0x6a,0x0c,0x6a,0xc4, >- 0xa2,0x26,0x62,0x90,0xda,0x80,0x74,0xe1,0xe3,0x5f,0x12,0x1f,0x20,0x78,0xce,0x9d, >- 0xdf,0xd4,0xdb,0x09,0x1c,0x4e,0xce,0xeb,0xbb,0xdf,0x77,0xee,0xcc,0x44,0xbd,0x5c, >- 0xc2,0x44,0x23,0x66,0xb7,0x19,0x34,0xdf,0x8c,0xff,0xdb,0x6f,0x3c,0x13,0xc1,0x17, >- 0xf0,0xe7,0xc4,0xef,0x31,0x71,0x9b,0x9f,0x9a,0xbe,0x3c,0x3d,0x71,0x63,0xbe,0x32, >- 0x71,0xf2,0xd4,0x71,0xed,0xdf,0x6b,0xa2,0x76,0x4e,0x6b,0xfb,0x4c,0xc2,0x0c,0x88, >- 0x8f,0x89,0xcd,0x5d,0x9d,0xb9,0xae,0xf9,0xa4,0x58,0x59,0x6c,0x48,0xe6,0x63,0x16, >- 0xcf,0x98,0x22,0xfd,0x16,0x4f,0xb2,0x49,0x8b,0x6f,0xcc,0x08,0xb1,0xfa,0xb8,0x9d, >- 0x31,0xe6,0xbc,0x20,0x66,0xe0,0x96,0xc3,0x4f,0xc9,0x99,0x9a,0xf3,0xe8,0x1f,0x13, >- 0x7f,0x74,0xbb,0xe6,0xc7,0x47,0x1c,0xfc,0x32,0xf8,0xc3,0xc4,0xb5,0x50,0x7f,0x8d, >- 0xfe,0x00,0x5b,0xe3,0x43,0xd4,0xea,0xcc,0x6a,0x9c,0x92,0x13,0x3d,0xdb,0x1b,0xb5, >- 0xaa,0xf5,0xff,0x41,0xe9,0x51,0xae,0x87,0x99,0x4f,0x4b,0x9c,0x80,0xbf,0x47,0x3c, >- 0x44,0x1c,0xb5,0x7d,0x31,0xbb,0x83,0x08,0xfa,0xce,0x12,0x27,0xc9,0x1d,0x03,0x2f, >- 0x05,0x9e,0xf6,0x1f,0xa0,0x16,0x07,0x2f,0xcd,0xff,0x98,0xd3,0x3f,0xcc,0x5e,0x33, >- 0xec,0x2f,0x4d,0x6e,0x8c,0x5d,0x8d,0x80,0x35,0x0a,0xaf,0x0c,0x67,0x8f,0xda,0x9e, >- 0xff,0x5a,0xb2,0x68,0x09,0xb8,0x64,0x1d,0x6d,0x3a,0x9f,0xdb,0xd6,0x65,0x84,0x97, >- 0x67,0xf2,0x70,0x3a,0x21,0x3e,0x4f,0x2d,0xe0,0x54,0x64,0x36,0x88,0x4b,0x21,0x8d, >- 0x57,0xd8,0x49,0xb0,0x83,0x72,0xa8,0x5e,0x15,0x1b,0x14,0x1b,0x97,0x67,0x40,0x77, >- 0x3a,0x43,0xae,0x6a,0xef,0x63,0x97,0x59,0x62,0x0f,0x11,0xb3,0xf3,0xe7,0xa1,0x49, >- 0xf9,0xde,0x24,0xb7,0xc4,0x39,0x1a,0xd7,0x9c,0xbb,0x5a,0x16,0x9f,0x65,0x66,0x5c, >- 0xd0,0xf4,0x4e,0xea,0xec,0xae,0x84,0x9d,0x96,0xf3,0x3d,0xf6,0x6d,0xe0,0xfc,0x4b, >- 0x32,0xfa,0xac,0x17,0xb8,0xdf,0x0a,0xfc,0x2f,0x08,0x53,0xe5,0x7a,0x8d,0x5c,0x85, >- 0x19,0xe5,0x78,0x17,0x1d,0xb3,0xd4,0x55,0xcf,0x6d,0x72,0x73,0xe4,0x35,0x37,0x29, >- 0x39,0xbd,0xf3,0x7b,0x3c,0x17,0x29,0xce,0x51,0xad,0xab,0xe4,0x27,0x25,0xd2,0xbb, >- 0xb8,0xbf,0xad,0xd5,0xaf,0x15,0x78,0x3e,0xd6,0xa8,0x5d,0x12,0x2c,0x9d,0x7b,0x40, >- 0xce,0x38,0xb9,0x87,0xe4,0x54,0xdb,0x07,0xc9,0xe9,0xfd,0x3d,0xa2,0x57,0x6b,0x3f, >- 0x45,0x69,0x93,0x99,0x3f,0x82,0xab,0xb5,0x86,0x58,0x13,0xfd,0x0d,0x47,0xef,0x63, >- 0xb0,0xd6,0x1c,0xbd,0x8a,0xa9,0xcf,0xc5,0x13,0xea,0xaa,0xf1,0xa9,0xe0,0xe4,0xad, >- 0xf7,0xf3,0xbf,0x05,0x27,0xc0,0x53,0xff,0x43,0xd0,0xb4,0xfe,0x0c,0x2e,0x03,0xf4, >- 0x36,0xe0,0xd3,0x76,0xf8,0x68,0x4f,0x4b,0xac,0xcd,0x7c,0xcb,0xe1,0xf3,0xdc,0xe1, >- 0xe3,0x71,0x67,0xef,0xe1,0xf3,0x82,0xfa,0xac,0xc3,0xe7,0x25,0x79,0xe5,0x13,0xe0, >- 0xb5,0x1d,0x3e,0xaf,0xe0,0xd4,0xa4,0xb7,0xe5,0xec,0xec,0x35,0xbb,0x2f,0xc2,0xb1, >- 0xeb,0x70,0xd4,0xda,0xba,0x58,0x07,0x4c,0xfd,0xff,0x46,0xb6,0x1f,0xb7,0xde,0xc7, >- 0x2d,0x71,0xc7,0xdf,0xb9,0x97,0x77,0xd4,0x56,0xe1,0xd3,0x65,0xb6,0x13,0x8a,0xbb, >- 0xf0,0xd3,0x99,0x2f,0xcc,0xad,0x83,0xd5,0x41,0x6f,0xde,0xf2,0xdc,0xc9,0xaf,0xef, >- 0xf0,0xd3,0x5a,0x4f,0x6c,0x13,0xcc,0x9e,0xc3,0xef,0x63,0x88,0x5f,0x1d,0x7e,0x1b, >- 0x0e,0x5e,0xc0,0xf9,0x13,0xfd,0x1b,0x70,0xec,0x83,0xb7,0x19,0x8a,0xfb,0x0e,0xe7, >- 0xaf,0xcc,0xf5,0xc0,0xd7,0xde,0x6a,0xc4,0x3f,0xfb,0x33,0xdf,0x07,0x83,0xb6,0x20, >- 0xbf,0xe5,0xe4,0x75,0xfe,0x2d,0x1a,0xe7,0xe1,0x94,0x42,0xe3,0xa2,0xa3,0x51,0x6b, >- 0x0b,0x62,0x8b,0x70,0x58,0xe0,0x3d,0xd1,0x6f,0xc2,0x2d,0xbe,0x07,0xcb,0x7c,0x0b, >- 0x56,0x78,0x37,0x2f,0x0a,0x47,0x7d,0x8f,0xee,0xc0,0x65,0x0b,0xec,0x94,0x7d,0xcf, >- 0x63,0x76,0x6e,0x85,0xba,0xea,0x0b,0xb0,0xd5,0xff,0x95,0xa7,0xff,0x8c,0xd8,0x3f, >- 0xf1,0x3e,0x45,0x91,0x60,0x07,0x00,0x00 >-}; >- >-// Generated from: >-// >-// #version 450 core >-// >-// #extension GL_EXT_samplerless_texture_functions : require >-// >-// #extension GL_KHR_shader_subgroup_arithmetic : require >-// >-// layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in; >-// >-// layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimage2D culledWidgetsOut; >-// >-// layout(set = 0, binding = 1)uniform WidgetCoordinates >-// { >-// uvec4 coordinates[32 + 32]; >-// }; >-// >-// uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 blockCoordHigh) >-// { >-// const uint localId = gl_LocalInvocationID . x; >-// const uvec4 widgetCoords = coordinates[offset + localId]; >-// >-// const bool intersects = widgetCoords . x < widgetCoords . z && >-// all(lessThan(widgetCoords . xy, blockCoordHigh))&& >-// all(greaterThanEqual(widgetCoords . zw, blockCoordLow)); >-// >-// const uint textWidgetBit = >-// localId < 32 ? uint(intersects)<< localId : 0; >-// const uint graphWidgetBit = >-// localId >= 32 ? uint(intersects)<<(localId - 32): 0; >-// return uvec2(subgroupOr(textWidgetBit), subgroupOr(graphWidgetBit)); >-// >-// } >-// >-// void main() >-// { >-// >-// const uvec2 outCoord = gl_WorkGroupID . xy; >-// const uvec2 blockCoordLow = outCoord * uvec2(8, 8); >-// const uvec2 blockCoordHigh = blockCoordLow + uvec2(8, 8); >-// >-// uvec2 culledWidgets; >-// >-// culledWidgets = cullWidgets(0, blockCoordLow, blockCoordHigh); >-// >-// if(gl_LocalInvocationID . x == 0) >-// { >-// imageStore(culledWidgetsOut, ivec2(outCoord), uvec4(culledWidgets, 0, 0)); >-// } >-// } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000004.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000004.inc >deleted file mode 100644 >index 23836835c9ac6a2f86fd058b3cf196790a0ab37b..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000004.inc >+++ /dev/null >@@ -1,185 +0,0 @@ >-// GENERATED FILE - DO NOT EDIT. >-// Generated by gen_vk_internal_shaders.py. >-// >-// 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. >-// >-// shaders/gen/OverlayCull.comp.00000004.inc: >-// Pre-generated shader for the ANGLE Vulkan back-end. >- >-#pragma once >-constexpr uint8_t kOverlayCull_comp_00000004[] = { >- 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x6d,0x97,0x5b,0x4c,0x9c,0x55, >- 0x10,0xc7,0xcf,0xec,0xc2,0x82,0x25,0x42,0x29,0x95,0x05,0x6c,0x8c,0x96,0x6a,0x8c, >- 0x90,0xb5,0xb5,0xb6,0x85,0x68,0x89,0x4d,0x56,0xcb,0x03,0x2d,0x65,0x59,0xea,0x46, >- 0xca,0x65,0x53,0x62,0x2f,0x11,0x6d,0x8b,0x36,0xdc,0x12,0xfb,0x60,0x7c,0xf4,0x85, >- 0x9a,0xd8,0xa8,0x0f,0xbe,0x60,0xb4,0x50,0x1a,0x7d,0x68,0xdf,0x4a,0x52,0x34,0x4a, >- 0x54,0x6c,0x54,0x4c,0x8c,0x7d,0x10,0x0d,0x89,0xad,0x8d,0x8d,0xbd,0x58,0x7a,0xb1, >- 0xce,0x7c,0xe7,0x3f,0x30,0x7c,0x94,0xe4,0xe4,0xfb,0xe6,0x3f,0xe7,0xcc,0xfc,0xce, >- 0x39,0xdf,0x99,0xc3,0x46,0x23,0x95,0x79,0xce,0x91,0x5b,0xe6,0xf2,0xdd,0xc7,0xe4, >- 0x82,0xbf,0x62,0x17,0x71,0xf2,0x5a,0xe0,0x62,0xc1,0x73,0x6b,0x43,0x73,0x43,0xa2, >- 0xe7,0xf5,0xae,0xc4,0xd3,0x1b,0xd6,0x8a,0xbf,0xd0,0x45,0x83,0x7e,0xe2,0x2b,0x72, >- 0x79,0x2e,0x97,0x9f,0x39,0xdc,0xba,0xb3,0xfb,0x5e,0x15,0xbd,0x99,0xdb,0x10,0xb7, >- 0xe5,0x3c,0x3e,0x27,0x88,0xe7,0xdc,0xc3,0xe8,0x1f,0xc4,0x63,0xb5,0x39,0x88,0xef, >- 0xdc,0x83,0xb0,0x77,0xf1,0x33,0x16,0x8c,0x71,0xae,0x9e,0x23,0xb6,0x79,0x14,0x57, >- 0x89,0xe7,0x56,0xce,0x29,0x5a,0x04,0xfd,0x3b,0xf8,0xb9,0x7a,0xde,0xe7,0xed,0x47, >- 0x4c,0xfc,0x21,0xc4,0xaf,0x80,0x3d,0x16,0xea,0x3f,0x86,0xfe,0x1a,0x5b,0xec,0x72, >- 0xf8,0x4e,0x63,0xac,0xd8,0x25,0x9c,0x31,0x12,0xf4,0x8d,0x06,0xb3,0x96,0xf7,0x07, >- 0xb8,0x4f,0x0c,0x73,0x92,0xbf,0x38,0xdb,0x05,0xe0,0x17,0x7f,0x15,0xfc,0x2b,0x30, >- 0x9f,0x95,0xac,0x96,0x18,0x3d,0x8e,0xb1,0xab,0xd8,0x2e,0xc3,0x38,0xaf,0xe5,0x04, >- 0x39,0x65,0xcd,0x44,0x7f,0x06,0x76,0x05,0x34,0xf1,0xaf,0xc2,0x7b,0xcc,0xc4,0x93, >- 0x35,0xca,0x37,0x76,0x02,0x7d,0xd4,0xae,0x0d,0x71,0x25,0xb1,0x4e,0xc2,0xdd,0x84, >- 0x58,0x51,0xc4,0x4f,0xc1,0xd7,0x84,0xfc,0x29,0xec,0x27,0x99,0xf1,0x69,0xcc,0x5b, >- 0xfa,0xb7,0xc0,0x17,0x43,0xbc,0x0c,0xde,0x6d,0xfe,0x56,0x6e,0xcf,0x61,0xbe,0xb2, >- 0xcf,0x19,0x68,0x0f,0x61,0x4f,0x77,0x21,0x56,0x3b,0x38,0xdb,0x90,0x5b,0xec,0x0e, >- 0xb3,0xe6,0x9d,0xe6,0x3b,0xaa,0x82,0x9d,0x35,0x2c,0x5d,0xe8,0x9b,0x01,0xcb,0xa1, >- 0x60,0xff,0xbc,0x56,0xcd,0xdf,0x94,0xec,0xd1,0x9b,0xe0,0x4f,0x9b,0xf9,0x0d,0x21, >- 0xa6,0xf6,0x79,0x0f,0x6b,0x9a,0x08,0xbe,0x81,0xfb,0xdc,0x28,0xe6,0x84,0xe3,0x31, >- 0xff,0x17,0x09,0xe6,0xe0,0x73,0x9f,0x80,0x36,0x8a,0xb8,0x62,0x8f,0x99,0xef,0xe3, >- 0x33,0x7e,0x76,0xce,0xb3,0xc4,0x82,0xf5,0x3d,0x8d,0x7d,0x4f,0xce,0xef,0x49,0x34, >- 0xc8,0x3f,0xcc,0x89,0x36,0x32,0x4b,0x04,0xeb,0xe8,0xb0,0x3f,0x37,0x58,0x91,0xb3, >- 0xb6,0x19,0xfb,0x76,0x14,0xec,0x8d,0x7c,0x06,0x65,0xdc,0xbb,0xd0,0x8e,0x62,0x8c, >- 0xf0,0xbe,0x85,0x39,0x1d,0x83,0x5f,0xe6,0x76,0x04,0xda,0x07,0xd0,0x45,0xdb,0xc2, >- 0x9a,0xec,0xe5,0x19,0xec,0x77,0x1a,0x79,0x64,0xde,0xe3,0xd0,0xb7,0xb0,0x25,0x6b, >- 0x7c,0x16,0xfb,0x92,0x85,0x6f,0x33,0xf6,0x7d,0x02,0xbe,0x26,0x8e,0x25,0xe3,0xbe, >- 0x84,0xe6,0x8c,0xf6,0x15,0x34,0x99,0xdb,0x49,0xd6,0x64,0x7f,0xbe,0x46,0x5f,0xf1, >- 0xfd,0xcb,0x33,0x9d,0xc2,0x98,0x9b,0x1c,0x57,0x7c,0x93,0xdc,0xa6,0x30,0xff,0x49, >- 0x33,0xdf,0x6f,0x10,0x6b,0xc2,0xcc,0x57,0x62,0xca,0xbe,0x7f,0x0b,0xbf,0xcc,0xf1, >- 0x7d,0x8e,0x23,0x79,0xbe,0x83,0x3e,0xc7,0x71,0x34,0x9e,0x3c,0xaf,0x71,0x3c,0xf1, >- 0x7f,0x0f,0x96,0x5c,0xf4,0x9d,0x04,0xcf,0xb4,0xe1,0x91,0x3e,0xe7,0xb8,0x4d,0x63, >- 0xfc,0x39,0xc3,0xf3,0x83,0xe1,0x89,0x60,0xcf,0x4e,0x80,0xe7,0x47,0xf8,0x8f,0x19, >- 0x9e,0x9f,0xa0,0x0b,0x8f,0xc6,0x9b,0x36,0x3c,0x3f,0x83,0x69,0x0a,0x7d,0x25,0xd7, >- 0x27,0xbc,0x8a,0xb2,0x8e,0xbf,0xc0,0x9f,0xc4,0x5e,0x4d,0x60,0x7d,0x7f,0x85,0x6f, >- 0x1c,0x7b,0x2a,0xf5,0xe2,0x3c,0x6a,0x88,0x68,0x75,0x4c,0x75,0x1e,0xfd,0x74,0xfd, >- 0xff,0x84,0x6f,0x05,0xe6,0x5b,0x41,0x0b,0xf3,0x15,0xdf,0x05,0x19,0x4f,0x9e,0xef, >- 0x02,0xbe,0x1f,0xc9,0x75,0xd1,0x8c,0xd3,0x5c,0x7f,0x21,0xd7,0x45,0xf3,0xfd,0x5c, >- 0x82,0xae,0xf6,0xdf,0x60,0xfa,0x02,0x71,0x2e,0x43,0xbb,0x64,0xf8,0x2e,0x1b,0xbe, >- 0x7f,0x90,0xa7,0x12,0x7c,0xe5,0x86,0x4f,0x7c,0x57,0xe4,0x9c,0x82,0xef,0x8a,0xe1, >- 0xbb,0x6a,0xc6,0x29,0xdf,0x35,0xf0,0x5d,0x35,0x3c,0xd7,0xa1,0xab,0x7d,0x23,0xc4, >- 0x37,0x07,0xed,0xba,0xe1,0x9b,0x33,0x7c,0xb7,0x90,0x27,0x01,0xbe,0x32,0xc3,0x27, >- 0xbe,0xdb,0x52,0xcf,0xc1,0x77,0xdb,0xf0,0xdd,0x31,0xe3,0x94,0xef,0x3f,0xf0,0xdd, >- 0x31,0x3c,0x77,0xa1,0xab,0x4d,0xb4,0x98,0x2f,0x42,0x5e,0xbb,0x6b,0xf8,0x44,0x53, >- 0xbe,0x1c,0xf2,0x79,0x6a,0xc1,0x17,0x37,0x7c,0xe2,0xcb,0xe5,0x16,0x07,0x9f,0xbc, >- 0x2b,0x5f,0xcc,0x8c,0x53,0xbe,0x3c,0xf2,0x7c,0xe2,0x53,0x9e,0x7c,0xf2,0xba,0xda, >- 0xcb,0x42,0x7c,0x05,0xe4,0x35,0xe9,0xa7,0x7c,0x05,0x86,0xef,0x7e,0xe4,0x49,0x82, >- 0xaf,0xd4,0xf0,0x89,0xaf,0x90,0x5b,0x29,0xf8,0x0a,0x0d,0x5f,0x91,0x19,0xa7,0x7c, >- 0xcb,0xc1,0x57,0x64,0x78,0x8a,0xc9,0xeb,0x6a,0x97,0x84,0xf8,0x56,0x92,0xd7,0x8a, >- 0x0d,0x9f,0x68,0x72,0x2e,0x35,0x6f,0x29,0x6c,0x5d,0xa7,0x38,0x6c,0xdd,0xd7,0x32, >- 0xd8,0xfa,0x1d,0x96,0xc3,0xd6,0x73,0x23,0xcf,0x4f,0x31,0xdf,0xdf,0xb0,0xef,0x69, >- 0xcc,0x77,0xd6,0xd4,0x17,0xf1,0xcd,0x70,0x9b,0x45,0x3d,0x98,0x31,0x73,0xfb,0x1d, >- 0xdf,0x46,0xd6,0x7c,0x0b,0x7f,0x40,0x4f,0xb1,0x25,0x35,0xe8,0x08,0x79,0x6d,0x18, >- 0x6b,0x28,0x0c,0x1a,0x6b,0x16,0xb5,0x45,0xfa,0xbd,0x43,0xfe,0x2e,0x14,0x2e,0x19, >- 0x33,0x63,0x6a,0xf4,0x47,0xf0,0x3b,0xf3,0xad,0xae,0x21,0x7f,0x57,0x8d,0x9b,0x7b, >- 0xe0,0x51,0x5a,0xb8,0x07,0xd6,0xd0,0xc2,0x3d,0xf0,0x18,0x79,0x9f,0xc6,0x7b,0x9c, >- 0xbc,0x66,0xef,0x81,0x27,0xa0,0xd9,0x7b,0xa0,0x8a,0x7c,0x5f,0xf1,0xc9,0xba,0xac, >- 0x33,0xdf,0x81,0xf8,0xaa,0xb9,0xad,0xc3,0x7a,0xca,0xbb,0xd6,0xdd,0x04,0x62,0x69, >- 0x0e,0x7b,0x0f,0x3c,0x49,0xde,0x6f,0xef,0x81,0xb5,0xe4,0x75,0x59,0x1b,0x8d,0x27, >- 0x4f,0xad,0xbb,0x4f,0x91,0x67,0x99,0x45,0xdf,0x6a,0xf0,0xd4,0x18,0x1e,0xe9,0xb3, >- 0x9e,0x5b,0x0d,0xc6,0xaf,0x37,0x3c,0x1b,0x0c,0x4f,0xf8,0x1e,0xd8,0x48,0xde,0x6f, >- 0xef,0x81,0x4d,0xe4,0x75,0xe1,0xd1,0x78,0x35,0x86,0xa7,0x96,0x3c,0x93,0x30,0x6e, >- 0x42,0x5e,0xbd,0x07,0x9e,0x25,0xef,0x0f,0xdf,0x03,0x75,0xe4,0x7d,0xb6,0xe6,0xd7, >- 0x61,0x1e,0x83,0xa1,0xfa,0xde,0xc0,0xf6,0x20,0xf2,0x36,0x98,0xf3,0xb5,0x8d,0x96, >- 0xd6,0xf7,0xed,0x38,0x5f,0xdb,0xcc,0x79,0x6a,0x24,0xaf,0xab,0xdd,0x14,0x3a,0x5f, >- 0x29,0xf2,0x5a,0xa3,0x39,0x5f,0x29,0x73,0xfe,0xd3,0xb4,0xb8,0xbe,0x0f,0x18,0x3e, >- 0xf1,0xb5,0x70,0x1b,0x00,0x5f,0x8b,0xe1,0xdb,0x49,0x4b,0xeb,0xfb,0x8b,0xe0,0xdb, >- 0x69,0x78,0x32,0xe4,0x75,0xb5,0x5f,0x0a,0xf1,0xb5,0x92,0xd7,0x32,0x86,0xaf,0xd5, >- 0xf0,0xb5,0xd1,0xe2,0xfa,0xde,0x6f,0xf8,0xc4,0xd7,0xce,0xad,0x1f,0x7c,0xed,0x86, >- 0xaf,0x83,0x96,0xd6,0xf7,0x4e,0xf0,0x75,0x18,0x9e,0x2c,0x79,0x5d,0xed,0xdd,0x21, >- 0xbe,0x2e,0xf2,0x5a,0xd6,0xf0,0x75,0x19,0xbe,0x97,0x43,0xf5,0xbd,0xcf,0xf0,0x89, >- 0x6f,0x0f,0xb7,0x3e,0xf0,0xed,0x31,0x7c,0x7b,0xef,0x51,0xdf,0xf7,0x81,0x6f,0xaf, >- 0xe1,0xd9,0x4f,0x5e,0x57,0xfb,0x95,0x10,0x5f,0x37,0x79,0x6d,0xbf,0xe1,0xeb,0x36, >- 0x7c,0xaf,0x85,0xea,0x7b,0xaf,0xe1,0x13,0xdf,0x01,0x6e,0xbd,0xe0,0x3b,0x60,0xf8, >- 0x0e,0xde,0xa3,0xbe,0x1f,0x02,0xdf,0x41,0xc3,0xd3,0x43,0x5e,0x57,0xfb,0x8d,0x10, >- 0xdf,0x61,0xf2,0x5a,0x8f,0xe1,0x3b,0x8c,0xf3,0xa6,0x79,0x7b,0x61,0xeb,0x3a,0xf5, >- 0xc1,0xd6,0x7d,0xed,0x87,0xad,0xdf,0xe1,0x00,0x6c,0x3d,0x37,0x83,0x38,0x5b,0xf5, >- 0xb4,0xb8,0x96,0x27,0xd9,0xae,0x47,0x1f,0x79,0xd7,0x79,0x3c,0x4f,0x4b,0x6b,0xf9, >- 0x0b,0xe4,0x75,0xad,0xe5,0x6f,0x93,0xd7,0x6c,0x2d,0xd7,0x58,0xf5,0xb4,0x50,0xcb, >- 0x3f,0x44,0x2d,0x17,0x06,0x19,0x93,0x34,0xb5,0x77,0x18,0x7e,0x87,0xb5,0x1f,0x09, >- 0xdd,0x35,0xc7,0xb9,0x8d,0xe0,0x7e,0x38,0x0e,0x96,0xd1,0xa0,0x7e,0xfa,0xdf,0x2f, >- 0x83,0xf8,0xed,0xf2,0x39,0x7e,0x3f,0xec,0xe0,0x9c,0x52,0xe3,0x4f,0xe1,0x9e,0x18, >- 0x36,0xbf,0xa7,0x76,0x73,0xdf,0x93,0xe8,0x7b,0x0a,0xbc,0x1a,0x7b,0x24,0xf8,0x9f, >- 0x86,0x5c,0x0d,0xb7,0xff,0x01,0x0a,0x64,0x63,0x51,0x74,0x10,0x00,0x00 >-}; >- >-// Generated from: >-// >-// #version 450 core >-// >-// #extension GL_EXT_samplerless_texture_functions : require >-// >-// layout(local_size_x = 32, local_size_y = 1, local_size_z = 1)in; >-// >-// layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimage2D culledWidgetsOut; >-// >-// layout(set = 0, binding = 1)uniform WidgetCoordinates >-// { >-// uvec4 coordinates[32 + 32]; >-// }; >-// >-// shared uint intersectingWidgets[32]; >-// >-// void accumulateWidgets(const uint localId) >-// { >-// >-// if(localId < 16) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 16]; >-// if(localId < 8) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 8]; >-// if(localId < 4) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 4]; >-// if(localId < 2) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 2]; >-// if(localId < 1) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 1]; >-// } >-// } >-// } >-// } >-// } >-// } >-// >-// uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 blockCoordHigh) >-// { >-// const uint localId = gl_LocalInvocationID . x; >-// const uvec4 widgetCoords = coordinates[offset + localId]; >-// >-// const bool intersects = widgetCoords . x < widgetCoords . z && >-// all(lessThan(widgetCoords . xy, blockCoordHigh))&& >-// all(greaterThanEqual(widgetCoords . zw, blockCoordLow)); >-// >-// uvec2 ballot = uvec2(0, 0); >-// >-// intersectingWidgets[localId]= uint(intersects)<< localId; >-// accumulateWidgets(localId); >-// if(localId == 0) >-// { >-// ballot . x = intersectingWidgets[0]; >-// } >-// >-// return ballot; >-// >-// } >-// >-// void main() >-// { >-// >-// const uvec2 outCoord = gl_WorkGroupID . xy; >-// const uvec2 blockCoordLow = outCoord * uvec2(8, 4); >-// const uvec2 blockCoordHigh = blockCoordLow + uvec2(8, 4); >-// >-// uvec2 culledWidgets; >-// >-// culledWidgets . x = cullWidgets(0, blockCoordLow, blockCoordHigh). x; >-// culledWidgets . y = cullWidgets(32, blockCoordLow, blockCoordHigh). x; >-// >-// if(gl_LocalInvocationID . x == 0) >-// { >-// imageStore(culledWidgetsOut, ivec2(outCoord), uvec4(culledWidgets, 0, 0)); >-// } >-// } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000005.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000005.inc >deleted file mode 100644 >index b029663d6de3a7214b32881c24756ebae09d64e8..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000005.inc >+++ /dev/null >@@ -1,195 +0,0 @@ >-// GENERATED FILE - DO NOT EDIT. >-// Generated by gen_vk_internal_shaders.py. >-// >-// 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. >-// >-// shaders/gen/OverlayCull.comp.00000005.inc: >-// Pre-generated shader for the ANGLE Vulkan back-end. >- >-#pragma once >-constexpr uint8_t kOverlayCull_comp_00000005[] = { >- 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x6d,0x97,0xff,0x4f,0xd5,0x65, >- 0x14,0xc7,0x9f,0xe7,0x02,0x57,0x90,0x51,0x0a,0x16,0x09,0x58,0xe4,0x35,0x97,0x13, >- 0xaf,0xe5,0x84,0x30,0xc7,0xb7,0x75,0x8d,0x72,0xa8,0xc0,0x45,0xc5,0x89,0x02,0x86, >- 0x4b,0x72,0x32,0xbe,0xdc,0x1f,0x9a,0xa1,0xb8,0x56,0xfd,0x54,0x7f,0x41,0x7f,0x41, >- 0xd8,0xca,0xcd,0x1f,0xc5,0x70,0x95,0x5f,0x7e,0xcc,0x2d,0xd7,0x8a,0x55,0xc8,0x2c, >- 0x5c,0x6d,0x4d,0x7f,0x10,0x8d,0xc6,0xe8,0x9c,0xcf,0xf3,0x3e,0xf8,0xe6,0x16,0xdb, >- 0xb3,0xcf,0xe7,0xbc,0xcf,0xf3,0x9c,0xf3,0x7a,0x9e,0xf3,0xf9,0x1c,0x3e,0x37,0x27, >- 0x96,0x58,0xe1,0x9c,0x77,0x2b,0x5d,0xbe,0xfb,0xc4,0xbb,0xe8,0x6f,0xb5,0x8b,0x39, >- 0xbd,0x2d,0x74,0xf1,0xe8,0xda,0xdc,0x92,0x6e,0x49,0x8e,0x64,0xfa,0x92,0xdb,0xab, >- 0x5f,0x52,0xff,0x13,0x2e,0x27,0x9a,0xa7,0xbe,0x27,0xdd,0x0a,0x97,0x27,0xd7,0x5c, >- 0x19,0xa7,0x7a,0xfb,0x07,0x54,0x4f,0xcb,0x18,0x97,0xb1,0x4a,0xd6,0xe7,0x46,0xf1, >- 0x9c,0x6b,0xc4,0xfc,0x28,0x9e,0xa8,0xe9,0x28,0xbe,0x73,0xe5,0xb0,0xbb,0xe4,0x1a, >- 0x8f,0xd6,0x38,0xf7,0x86,0x44,0x3c,0x12,0x50,0x5c,0x02,0xd7,0x66,0xc9,0xa9,0x5a, >- 0x0c,0xf3,0xbb,0xe5,0xba,0x7e,0xc9,0x17,0xec,0xe7,0x29,0xfe,0x38,0xe2,0x97,0xc1, >- 0x9e,0xcc,0x9a,0x3f,0x89,0xf9,0x16,0x5b,0xed,0xb5,0xf0,0xdd,0xc0,0x5a,0xb5,0x4b, >- 0x24,0x63,0x2c,0x9a,0x9b,0x13,0xed,0x5a,0xef,0x9f,0x92,0x39,0xca,0x5a,0x89,0xf5, >- 0xa5,0x62,0x17,0x82,0x5f,0xfd,0x9b,0xe1,0x2f,0xc6,0x7e,0xd6,0x88,0x5a,0x42,0x7a, >- 0x29,0xd6,0x56,0x88,0xfd,0x0c,0xd6,0x05,0x2d,0x37,0xca,0xa9,0x67,0xa6,0xfa,0x4e, >- 0xd8,0x65,0xd0,0xd4,0x5f,0x81,0xfb,0x38,0xc5,0xd3,0x33,0xca,0x27,0x3b,0x89,0x39, >- 0x66,0xef,0xc8,0xe2,0x4a,0xe1,0x9c,0x94,0xbb,0x0d,0xb1,0x72,0x10,0xbf,0x1d,0xbe, >- 0x36,0xe4,0x6f,0x47,0x3d,0x3d,0xad,0xef,0xc0,0xbe,0x75,0xfe,0x7e,0xf8,0xe2,0x88, >- 0xd7,0x89,0x7b,0xce,0x7f,0x18,0xf5,0xaf,0x40,0x9d,0x3b,0xa1,0x3d,0x8b,0x9a,0x76, >- 0x21,0xd6,0x51,0x70,0x1e,0x41,0x6e,0xb5,0xbb,0xe9,0xcc,0x7b,0x70,0x6e,0xc6,0xa2, >- 0x76,0x2f,0xb1,0xf4,0x61,0x6e,0x27,0x58,0x86,0xa3,0xfa,0x05,0xad,0x4a,0x9e,0x29, >- 0xad,0xd1,0x18,0xf8,0x3b,0x68,0x7f,0xe3,0x88,0x69,0x73,0xbe,0xc4,0x99,0x26,0xa2, >- 0x67,0xa0,0xc0,0x5d,0xc6,0x9e,0xf0,0x7a,0x2c,0xfd,0xc5,0xa2,0x3d,0x84,0xdc,0x5f, >- 0x41,0xbb,0x8c,0xb8,0x6a,0x4f,0xd2,0xf3,0xf1,0xb5,0x5c,0x7b,0x96,0x58,0xe2,0xd1, >- 0xf9,0xde,0xc0,0x39,0xa4,0x30,0xec,0xbc,0xde,0x93,0x44,0xf7,0x16,0x17,0x17,0xcd, >- 0x1e,0x15,0xfb,0x2e,0xd9,0x67,0xc4,0xbe,0x43,0xf6,0x59,0xb1,0x67,0xc8,0x1e,0x13, >- 0xfb,0xb6,0xd8,0x35,0xb2,0x9f,0x18,0x6a,0xe1,0x50,0xe3,0x47,0xa2,0xe8,0xfb,0x5a, >- 0x87,0xda,0x9f,0xc7,0xfe,0xf7,0xc9,0x7b,0xac,0x7b,0xff,0x1c,0xda,0x79,0xac,0xd1, >- 0x3d,0x7f,0x80,0x73,0xb9,0x00,0xbf,0x9e,0xcf,0x39,0x68,0x17,0xa1,0xab,0xd6,0x24, >- 0x9a,0x3e,0x0f,0xdf,0xe1,0x99,0xe9,0x40,0x1e,0x65,0xba,0x09,0xbd,0x49,0x2c,0xad, >- 0xd3,0xf7,0xa8,0x6d,0x2f,0x7c,0x75,0x78,0x76,0x6e,0xc1,0xd7,0x26,0xb1,0x74,0xdd, >- 0x0f,0xd0,0x1c,0x69,0x3f,0x42,0x8b,0x45,0xb9,0xf3,0xa2,0x1a,0xff,0x84,0xb9,0xea, >- 0x7b,0x28,0x3b,0x9d,0xc6,0x9a,0x79,0x89,0xab,0xbe,0x29,0x19,0xd3,0xd8,0xff,0x14, >- 0xed,0xf7,0x67,0xc4,0xba,0x45,0xfb,0xd5,0x98,0xfa,0xec,0xfc,0x02,0xbf,0xee,0xf1, >- 0x53,0x89,0xa3,0x79,0x7e,0x85,0xfe,0xb7,0xc4,0xb1,0x78,0x7a,0x7d,0x20,0xf1,0xd4, >- 0x7f,0x1b,0x2c,0x79,0x98,0x3b,0x05,0x9e,0x59,0xe2,0xd1,0x39,0x33,0x32,0x66,0xb1, >- 0x7e,0x86,0x78,0xee,0x10,0x4f,0x0c,0x35,0xfb,0x02,0x3c,0xbf,0xc1,0x7f,0x81,0x78, >- 0x7e,0x87,0xae,0x3c,0x16,0x6f,0x96,0x78,0xee,0x82,0x69,0x1a,0x73,0x67,0xe8,0xcc, >- 0xfe,0xc0,0xd9,0x97,0x82,0x31,0xee,0x1f,0x33,0xaa,0xef,0x4f,0x19,0xff,0x20,0xa6, >- 0xde,0x7f,0x26,0xa7,0xaf,0xe7,0xff,0x17,0xe2,0xa6,0x50,0xe3,0x6f,0x51,0x97,0x7b, >- 0xf0,0xdd,0xc4,0xb3,0xa0,0xbd,0xea,0x3e,0xfa,0x97,0x6a,0xf5,0x92,0xe3,0x3e,0xe6, >- 0x19,0xc3,0x2a,0x1f,0x7c,0xc5,0x60,0x68,0x22,0x06,0xf5,0xad,0x96,0xa1,0x9a,0x32, >- 0xe8,0xfd,0x39,0xe4,0x2a,0xa6,0x75,0x96,0xab,0xc4,0x87,0x5c,0xea,0xb3,0xe7,0x6e, >- 0x8d,0x0f,0xba,0xd9,0x4f,0xfb,0xc0,0x74,0x15,0x71,0x4a,0x7d,0xd0,0x74,0x9e,0xf1, >- 0xa9,0x66,0x7c,0x6b,0x91,0x27,0x01,0xbe,0x46,0xe2,0x53,0x5f,0x99,0x8c,0x46,0xf0, >- 0x95,0x11,0x5f,0x39,0xad,0x33,0xbe,0x0a,0xf0,0x95,0x13,0xcf,0x3a,0x1f,0x74,0xb3, >- 0x9f,0xcb,0xe2,0xab,0xf4,0x41,0x5b,0x47,0x7c,0x95,0xc4,0xb7,0x1e,0x79,0x92,0xe0, >- 0x6b,0x20,0x3e,0xf5,0x25,0x64,0x34,0x80,0x2f,0x41,0x7c,0x1b,0x68,0x9d,0xf1,0xbd, >- 0x00,0xbe,0x0d,0xc4,0xb3,0xd1,0x07,0xdd,0xec,0x17,0xb3,0xf8,0x36,0xf9,0xa0,0x6d, >- 0x24,0xbe,0x4d,0xc4,0xb7,0x19,0x79,0x76,0x80,0xaf,0x9e,0xf8,0xd4,0x57,0xa5,0xeb, >- 0xc0,0x57,0x45,0x7c,0x5b,0x68,0x9d,0xf1,0x25,0xc1,0xb7,0x85,0x78,0xb6,0xfa,0xa0, >- 0x9b,0xfd,0x72,0x16,0xdf,0x36,0x1f,0xb4,0xad,0xc4,0xb7,0x8d,0xf8,0xb6,0x23,0x4f, >- 0x0a,0x7c,0x75,0xc4,0xa7,0xbe,0x6a,0x8d,0x0d,0xbe,0x6a,0xe2,0xab,0xa1,0x75,0xc6, >- 0xf7,0x0a,0xf8,0x6a,0x88,0xa7,0xd6,0x07,0xdd,0xec,0x57,0xb3,0xf8,0x76,0xfa,0xa0, >- 0xd5,0x12,0x9f,0x6a,0xfa,0x3e,0x5b,0xde,0x3a,0xd8,0x76,0x4e,0xf5,0xb0,0xad,0xae, >- 0x0d,0xb0,0xed,0x39,0x6c,0x84,0x6d,0xef,0x8d,0x5e,0xc7,0xb1,0xdf,0x07,0x78,0x17, >- 0x3b,0xb0,0xdf,0x79,0xea,0x4b,0xea,0x9b,0x8b,0xee,0xc3,0xba,0x39,0xda,0xdb,0x43, >- 0xbc,0xc7,0xbd,0xd4,0xd3,0x1f,0x41,0x6f,0x17,0x4b,0x7b,0xd7,0xbb,0x3e,0x68,0x63, >- 0x88,0xa9,0x0c,0x16,0x6b,0x1e,0x3d,0x49,0xe7,0x7d,0xe4,0xc3,0x1c,0xe5,0xd2,0x35, >- 0x73,0x98,0x1b,0x07,0xaf,0xf6,0x9c,0xf7,0x71,0x3e,0x0b,0xd4,0xa3,0xac,0xff,0x68, >- 0x93,0xfe,0xbf,0xfe,0x13,0xc3,0x07,0xe6,0x02,0x71,0xe7,0xa0,0x26,0x0b,0xe8,0x3f, >- 0x6a,0xc7,0xa8,0xfe,0xaf,0x61,0xbe,0xf5,0x9f,0x0c,0xd5,0x5f,0x7d,0x29,0x19,0x19, >- 0x70,0xa5,0xa8,0xfe,0xbb,0x50,0x7f,0xfd,0x5f,0x6d,0xb9,0x5e,0x47,0xae,0x5d,0x54, >- 0xef,0x66,0x1f,0x74,0xb3,0xdf,0xf4,0x81,0xc9,0xea,0xbf,0xdb,0x07,0xad,0xd9,0x3f, >- 0xe6,0xdb,0x4d,0x7c,0x2d,0xe0,0xb3,0xfe,0x33,0x42,0x7c,0xea,0xdb,0x23,0x63,0x04, >- 0x7c,0x7b,0x88,0x6f,0x2f,0xf8,0x46,0x89,0x6f,0x1f,0xf8,0xf6,0x12,0x4f,0xab,0x0f, >- 0xba,0xd9,0xed,0x59,0x7c,0x69,0x1f,0xb4,0x56,0xe2,0x4b,0x13,0xdf,0x7e,0xf0,0x59, >- 0xff,0x19,0x26,0x3e,0xf5,0x1d,0x90,0x31,0x0c,0xbe,0x03,0xc4,0x77,0x10,0x7c,0x67, >- 0x88,0xaf,0x13,0x7c,0x07,0x89,0xe7,0x90,0x0f,0xba,0xd9,0x87,0xb3,0xf8,0xba,0x7c, >- 0xd0,0x0e,0x11,0x5f,0x17,0xf1,0x1d,0x05,0x9f,0xf5,0x9f,0x21,0xe2,0x53,0x5f,0xb7, >- 0x8c,0x21,0xf0,0x75,0x13,0x5f,0x0f,0xf8,0xce,0x12,0x5f,0x2f,0xf8,0x7a,0x88,0xe7, >- 0x98,0x0f,0xba,0xd9,0x7d,0x59,0x7c,0xc7,0x7d,0xd0,0x8e,0x11,0xdf,0x71,0xe2,0x7b, >- 0x1b,0x7c,0xd6,0x7f,0x06,0x89,0x4f,0x7d,0x27,0x64,0x0c,0x82,0xef,0x04,0xf1,0xf5, >- 0x83,0x6f,0x8c,0xf8,0xde,0x01,0x5f,0x3f,0xf1,0x9c,0xf4,0x41,0x37,0xfb,0x54,0x16, >- 0xdf,0x80,0x0f,0xda,0x49,0xe2,0x1b,0x40,0xff,0xb0,0xbc,0x83,0xb0,0xed,0x9c,0x86, >- 0x60,0x5b,0x5d,0x87,0x61,0xdb,0x73,0x38,0x02,0xdb,0xde,0x9b,0x8c,0x5f,0xfe,0x7e, >- 0xeb,0xd5,0x7a,0xc1,0x87,0x3e,0xf4,0x83,0x79,0xf4,0x8d,0x0c,0xf5,0xaa,0x7c,0xbf, >- 0xbc,0x57,0x15,0xd1,0xd9,0xa8,0xaf,0x40,0x46,0x11,0x62,0x16,0xd0,0x39,0xac,0xf4, >- 0xff,0xed,0x55,0x85,0x3e,0xe8,0xd6,0xab,0x4e,0xfb,0xa0,0x69,0x7e,0x8f,0xfe,0x63, >- 0xb1,0x8a,0x88,0xef,0x63,0xcc,0x51,0xe6,0xd3,0xc8,0xa9,0x2c,0x13,0x6e,0x39,0xcb, >- 0x25,0xb9,0x9f,0x40,0xaf,0xbb,0x84,0xbc,0xfa,0x5b,0xe0,0x0a,0x7e,0x07,0x8c,0xe2, >- 0x37,0xc0,0x37,0xf8,0x86,0xb6,0x6f,0xd9,0xab,0xc8,0xc1,0xdf,0xb7,0xd7,0xa0,0xa9, >- 0xdc,0x2a,0x1c,0xfa,0x5d,0x7c,0x1d,0x73,0xaf,0xd1,0xef,0x97,0xb7,0x24,0xe6,0x15, >- 0xc4,0xbc,0x8e,0x3d,0x18,0xc3,0x44,0xd4,0xf3,0xbc,0xab,0x95,0xf1,0x2f,0x51,0xce, >- 0x09,0xfc,0xe4,0x0f,0x00,0x00 >-}; >- >-// Generated from: >-// >-// #version 450 core >-// >-// #extension GL_EXT_samplerless_texture_functions : require >-// >-// layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in; >-// >-// layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimage2D culledWidgetsOut; >-// >-// layout(set = 0, binding = 1)uniform WidgetCoordinates >-// { >-// uvec4 coordinates[32 + 32]; >-// }; >-// >-// shared uint intersectingWidgets[32]; >-// >-// void accumulateWidgets(const uint localId) >-// { >-// >-// if(localId < 16) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 16]; >-// if(localId < 8) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 8]; >-// if(localId < 4) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 4]; >-// if(localId < 2) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 2]; >-// if(localId < 1) >-// { >-// intersectingWidgets[localId]|= intersectingWidgets[localId + 1]; >-// } >-// } >-// } >-// } >-// } >-// } >-// >-// uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 blockCoordHigh) >-// { >-// const uint localId = gl_LocalInvocationID . x; >-// const uvec4 widgetCoords = coordinates[offset + localId]; >-// >-// const bool intersects = widgetCoords . x < widgetCoords . z && >-// all(lessThan(widgetCoords . xy, blockCoordHigh))&& >-// all(greaterThanEqual(widgetCoords . zw, blockCoordLow)); >-// >-// uvec2 ballot = uvec2(0, 0); >-// >-// if(localId < 32) >-// { >-// intersectingWidgets[localId]= uint(intersects)<< localId; >-// accumulateWidgets(localId); >-// if(localId == 0) >-// { >-// ballot . x = intersectingWidgets[0]; >-// } >-// } >-// else >-// { >-// const uint graphLocalId = localId - 32; >-// intersectingWidgets[graphLocalId]= uint(intersects)<< graphLocalId; >-// accumulateWidgets(graphLocalId); >-// } >-// if(localId == 0) >-// { >-// ballot . y = intersectingWidgets[0]; >-// } >-// >-// return ballot; >-// >-// } >-// >-// void main() >-// { >-// >-// const uvec2 outCoord = gl_WorkGroupID . xy; >-// const uvec2 blockCoordLow = outCoord * uvec2(8, 8); >-// const uvec2 blockCoordHigh = blockCoordLow + uvec2(8, 8); >-// >-// uvec2 culledWidgets; >-// >-// culledWidgets = cullWidgets(0, blockCoordLow, blockCoordHigh); >-// >-// if(gl_LocalInvocationID . x == 0) >-// { >-// imageStore(culledWidgetsOut, ivec2(outCoord), uvec4(culledWidgets, 0, 0)); >-// } >-// } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000002.inc b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000002.inc >new file mode 100644 >index 0000000000000000000000000000000000000000..ae8919ac90f80a9f95aa1371bcc6c7edf81f5b54 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000002.inc >@@ -0,0 +1,413 @@ >+// GENERATED FILE - DO NOT EDIT. >+// Generated by gen_vk_internal_shaders.py. >+// >+// 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. >+// >+// shaders/gen/OverlayDraw.comp.00000002.inc: >+// Pre-generated shader for the ANGLE Vulkan back-end. >+ >+#pragma once >+constexpr uint8_t kOverlayDraw_comp_00000002[] = { >+ 0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x75,0x58,0x7b,0x90,0x97,0x55, >+ 0x19,0xfe,0xde,0xf3,0x5b,0x76,0x17,0xd8,0x84,0x52,0x28,0x14,0x51,0x58,0x31,0x18, >+ 0x70,0xb9,0x0c,0x2c,0x9b,0xcb,0x6d,0x41,0x58,0x4c,0x47,0xee,0xcd,0xb4,0x4c,0x81, >+ 0x8b,0x95,0xca,0x80,0x31,0x2c,0x18,0xcc,0x72,0x59,0x40,0xc3,0x08,0xd2,0x29,0x59, >+ 0x16,0x02,0x64,0xa4,0x91,0x94,0x49,0xe4,0xaf,0xa6,0x9a,0xa9,0xa0,0xe9,0xc2,0xc5, >+ 0x60,0x4c,0x2e,0x46,0x16,0xb7,0x0c,0x54,0x42,0xc8,0x94,0xbb,0xe7,0xf9,0xde,0xe7, >+ 0xe5,0xf7,0xee,0x37,0xcb,0x6f,0xe6,0xcc,0xf7,0x9d,0xe7,0xbd,0x3d,0xe7,0x9c,0xf7, >+ 0x9c,0xf3,0xfe,0xbe,0x5c,0x28,0x2d,0x4a,0x12,0x49,0xda,0x24,0xc5,0xc9,0xad,0xb9, >+ 0x24,0xfd,0x7d,0x3e,0x09,0x11,0x49,0x92,0xb6,0x49,0x61,0xfa,0xac,0x7e,0x78,0xe2, >+ 0xc3,0x65,0x73,0xea,0x1e,0x2b,0x1b,0x30,0xb0,0x2f,0xe4,0xb7,0x24,0xaa,0x08,0x59, >+ 0xbb,0xa4,0x28,0x69,0x15,0x9f,0x05,0xb1,0xcd,0x7c,0xf4,0x89,0x59,0xc0,0x0f,0xc7, >+ 0x76,0x2e,0xb6,0xf6,0xd1,0xbe,0x20,0xf5,0xa7,0xf2,0x02,0xda,0x54,0xc7,0xb7,0xe1, >+ 0xf1,0x59,0x98,0xea,0x24,0xc9,0x98,0xe8,0xa1,0x4a,0x43,0x27,0xa5,0x7c,0x1a,0x26, >+ 0xc4,0xbc,0x5e,0x20,0x76,0xb7,0xc3,0x72,0xc4,0xfa,0xd2,0xff,0x08,0xfa,0xef,0x2b, >+ 0xaa,0x33,0x32,0xe3,0xbf,0x3a,0x5a,0x8c,0xa4,0x2f,0xe8,0x8f,0x8a,0xcf,0x6e,0x37, >+ 0x64,0xda,0xef,0xea,0xf8,0x2e,0xcb,0xc8,0x97,0x51,0x5e,0xc0,0xfe,0xda,0xcc,0x78, >+ 0x9a,0x5a,0x18,0x4f,0x53,0x0b,0xe3,0x69,0x6a,0x61,0x3c,0x4d,0x2d,0x8c,0x67,0x9d, >+ 0x8d,0xa7,0x40,0x75,0xd6,0xb7,0x30,0x9e,0xf5,0x6e,0x3c,0x1b,0x32,0x7c,0x37,0x90, >+ 0xaf,0xc9,0x0f,0xa7,0xeb,0x9b,0x24,0x9d,0x19,0xf3,0x68,0x0b,0x7c,0x8f,0x3a,0xbe, >+ 0xc5,0x8c,0x71,0xd4,0xf9,0x38,0x9b,0x89,0x71,0x96,0x31,0x72,0xec,0x9f,0x63,0x8c, >+ 0xdb,0xd9,0x7f,0x4f,0x9a,0xeb,0xa3,0xdf,0xd5,0xf5,0x2f,0x8b,0xea,0x77,0x8a,0xed, >+ 0xd6,0x18,0x25,0xa4,0xfe,0x72,0xa9,0x3f,0xbc,0x77,0x88,0x3a,0x85,0x9c,0x27,0xfc, >+ 0xbe,0x18,0xfb,0x45,0x9c,0x97,0xc0,0x7e,0x31,0xfb,0x58,0x97,0xdb,0x22,0xda,0x3a, >+ 0x3e,0x3b,0x46,0x0f,0x1d,0x68,0x07,0x9d,0x6e,0xa9,0x2f,0xd5,0x41,0xbf,0x67,0x7c, >+ 0xb6,0xa6,0x8f,0x5e,0x8c,0x51,0xce,0x18,0xd6,0xaf,0xa4,0xbe,0xf5,0x87,0x71,0x0d, >+ 0x3b,0x33,0x97,0x8b,0x89,0x75,0x89,0xd2,0x2a,0xf6,0xbb,0xf1,0x39,0x9c,0x7a,0xc8, >+ 0xc9,0xaa,0x1b,0x7a,0x9a,0x7f,0x23,0x52,0x5e,0x05,0xc9,0x03,0x8c,0x3f,0x32,0x8d, >+ 0xa5,0xfd,0x51,0x6e,0xdc,0xa3,0xc9,0x5f,0xc8,0x61,0x74,0x3a,0x67,0x79,0x8e,0xa3, >+ 0xd3,0x35,0xd3,0xb9,0x87,0xbf,0x87,0x68,0x5b,0xec,0x38,0xd7,0x38,0x7b,0xf4,0x6b, >+ 0x33,0x63,0x7e,0x2a,0xa3,0x5f,0x17,0xdb,0x75,0xd7,0xaf,0x27,0x87,0x4e,0x71,0xb6, >+ 0x1a,0x38,0x87,0x42,0x0e,0xd9,0x27,0x38,0x2c,0xe5,0x7b,0x03,0xc7,0x84,0xfe,0x32, >+ 0xb7,0x76,0x2b,0xe2,0x73,0xb4,0x5b,0xbb,0x95,0xec,0xe7,0x5c,0xcc,0x46,0x37,0x7f, >+ 0x6b,0xc9,0xaf,0x91,0xf3,0xdc,0x94,0x99,0xe7,0xb5,0xd4,0xc3,0x5e,0x69,0x72,0xf3, >+ 0x8c,0x7d,0xb1,0x8e,0x9c,0x7e,0xca,0x78,0xeb,0xc9,0x09,0xfd,0x0d,0x8e,0xc3,0xef, >+ 0x39,0x2e,0xe3,0x80,0xf7,0x5d,0x29,0xe3,0x25,0xc3,0x20,0x3f,0xc8,0xfc,0xb2,0x79, >+ 0x3e,0xc4,0x31,0x1f,0xa4,0xbf,0x43,0x3c,0xff,0x24,0x8d,0x5d,0x90,0xee,0x17,0xcb, >+ 0x51,0xe8,0xff,0x83,0xb9,0x76,0x94,0xfa,0xe8,0xbf,0x4b,0x0c,0xf2,0x7f,0xf2,0xbd, >+ 0xc8,0xc5,0x3f,0xcd,0x39,0xeb,0x1d,0x51,0x8c,0xf5,0x0c,0x31,0x6b,0xbb,0xb8,0x26, >+ 0x1f,0x30,0x8e,0xad,0x41,0xd2,0xc2,0x9a,0x7c,0xc8,0xf7,0x0f,0x18,0x1f,0xfd,0xb3, >+ 0xc4,0x8c,0xff,0xb9,0x4c,0x9e,0x15,0x89,0xf6,0x2d,0xfe,0x60,0x69,0x1e,0xff,0xb4, >+ 0xd3,0x1d,0x25,0x3a,0x97,0x88,0x35,0x9a,0xef,0x36,0xf6,0xef,0xb1,0xdf,0xcd,0xad, >+ 0xef,0xeb,0x11,0x9b,0xe6,0xc6,0xfa,0xeb,0xd8,0xdf,0xb7,0x77,0xef,0x50,0x8b,0xf5, >+ 0x9b,0x4c,0x2c,0xc8,0xe1,0x6b,0xaf,0xe8,0x3c,0x15,0x72,0xec,0xa7,0xa4,0x79,0x3e, >+ 0xda,0x2f,0x10,0x83,0xcd,0xbf,0x29,0x84,0x6e,0x25,0xfb,0xef,0x89,0xcd,0x6d,0x61, >+ 0xba,0x86,0x97,0x45,0xf7,0x7a,0x25,0xf7,0x4b,0x59,0x5c,0x69,0xac,0xc5,0x17,0x72, >+ 0x38,0x13,0x5a,0xa5,0xfe,0x0a,0xe8,0x1b,0x39,0xf0,0x69,0x44,0x70,0xff,0x7d,0x12, >+ 0x7b,0x57,0xe8,0xeb,0x72,0x7c,0xc7,0xf9,0x71,0x55,0x54,0x8e,0xe7,0x10,0xe6,0xce, >+ 0x11,0xe6,0xc7,0xd8,0xe8,0x15,0x7e,0xdf,0x21,0x76,0xc4,0xad,0x55,0x55,0xf4,0x88, >+ 0x3c,0xf8,0x17,0x73,0x03,0xfb,0x7c,0x08,0xcf,0xba,0x63,0xc4,0x7f,0x11,0x75,0x70, >+ 0x6e,0x1d,0xa7,0x8f,0x63,0x69,0x8e,0x17,0xa4,0x73,0x72,0x82,0x38,0x38,0x9d,0xa2, >+ 0xdf,0x4b,0x51,0x06,0xfc,0x24,0xc6,0x4f,0xde,0x78,0xbf,0x18,0x9f,0x57,0xc8,0xf3, >+ 0x14,0xe3,0x20,0x37,0xfe,0xcb,0xbc,0x30,0xde,0x1f,0x31,0x2f,0x8c,0xf7,0x79,0x62, >+ 0x1f,0x39,0xde,0xf5,0xdc,0xd3,0x17,0x28,0x9f,0x1a,0x35,0xb1,0x2f,0xff,0x47,0x7f, >+ 0x17,0x6e,0xdc,0x1d,0x49,0x32,0x3e,0xf2,0x2f,0x4c,0x79,0xa8,0x3c,0x71,0xd8,0x65, >+ 0x62,0x62,0xfc,0xc8,0x17,0xcf,0x8f,0x99,0x17,0x07,0x82,0xee,0x03,0x70,0x2e,0xc8, >+ 0xe9,0x39,0x05,0x19,0xec,0xf7,0x05,0xf5,0x01,0x59,0x89,0xa8,0xec,0xb5,0xe8,0x3b, >+ 0x3d,0xe3,0x45,0xe5,0x58,0x9f,0xff,0x47,0xbe,0xd7,0x78,0xc6,0xd9,0x1c,0x41,0x7e, >+ 0x35,0xbe,0x5f,0x63,0x4c,0xbc,0x97,0x44,0xaf,0xc8,0xed,0x56,0xdc,0x07,0x0f,0x32, >+ 0x46,0x3d,0x73,0xb8,0x50,0x54,0xf6,0x87,0x18,0x03,0x7a,0xad,0x45,0xf7,0x0c,0x70, >+ 0xd3,0x69,0x23,0x8a,0xff,0x91,0x63,0x2c,0x21,0x0f,0xe0,0x55,0x91,0x37,0xce,0xeb, >+ 0x76,0xa2,0x67,0x51,0x35,0x7d,0xda,0xba,0x63,0x0e,0xdb,0x8b,0xca,0x6d,0xfe,0x8b, >+ 0x83,0x62,0xed,0x25,0x3f,0xff,0x96,0x13,0xad,0x83,0xe6,0x04,0x74,0xd6,0x33,0x27, >+ 0xda,0x04,0xc5,0x91,0x13,0xed,0x42,0x7e,0xbc,0xc0,0xdb,0xc6,0x06,0x0c,0xe3,0xc5, >+ 0xbb,0xc5,0x28,0x71,0x31,0x02,0xf3,0x7d,0x3b,0x63,0x7c,0x8e,0x31,0x4a,0x5c,0x8c, >+ 0x5b,0x82,0xe2,0x58,0x33,0xf3,0x87,0x27,0xd6,0x05,0xf2,0xf6,0x41,0x79,0x5c,0xa5, >+ 0x2e,0x62,0x6d,0xa5,0xed,0x6d,0xa2,0x72,0xf0,0xeb,0x28,0x79,0x7e,0xc0,0x3b,0xc4, >+ 0xd6,0x91,0x39,0x8a,0x77,0xf8,0xbf,0xce,0xf5,0x01,0x6e,0x79,0xd3,0x49,0xf2,0xfb, >+ 0xc8,0xb0,0x3b,0xdc,0x1c,0xbd,0xca,0x1c,0xe8,0x2c,0xaa,0x0b,0x99,0xc5,0xbf,0x53, >+ 0x14,0x47,0xfc,0xbb,0x5c,0x7c,0xe0,0x5d,0x62,0xbb,0x8b,0xf1,0xbb,0xb8,0x78,0x5d, >+ 0x19,0x4f,0x5c,0xbc,0x52,0xc6,0x13,0x17,0xef,0x1e,0x51,0xdd,0x52,0x72,0x37,0x5f, >+ 0x78,0xda,0xdc,0x74,0x67,0x7c,0x8c,0xe7,0x1e,0xc6,0x34,0x6e,0xf7,0x8a,0xca,0xc1, >+ 0xad,0x87,0xe3,0x06,0xfc,0xcb,0xb1,0xf5,0xa0,0x3f,0xbc,0x2f,0x21,0x8f,0x5e,0x1c, >+ 0x63,0x8d,0xe3,0x76,0x9f,0x5b,0x4b,0xe3,0x56,0x26,0xaa,0x7b,0x1f,0xb9,0x99,0xaf, >+ 0x1e,0x8e,0x5b,0x1f,0xc6,0x07,0xdf,0x32,0xc6,0x34,0x6e,0xa8,0xaf,0xfb,0x90,0x5b, >+ 0x7f,0xc7,0x0d,0x78,0xbf,0xd8,0xfa,0xd3,0x5f,0x3f,0x37,0x6f,0x03,0xdc,0xbc,0x19, >+ 0xdf,0x81,0xa2,0xb8,0xe7,0x3b,0x88,0x7c,0x73,0x8e,0x6f,0x85,0xa8,0xee,0x20,0xf2, >+ 0x35,0xff,0xfd,0x1d,0xdf,0xaf,0x90,0x13,0xc6,0x50,0x41,0x1e,0xe0,0x57,0xe9,0xf8, >+ 0x41,0xe7,0x7e,0x9c,0xf5,0xb4,0xbf,0x3f,0x93,0x57,0xc0,0x97,0xc6,0x98,0xd8,0x07, >+ 0x23,0x24,0xbf,0x9f,0xaa,0xe2,0x6e,0xc4,0xbd,0x56,0x9d,0xd9,0xab,0xb8,0xf7,0xca, >+ 0xb9,0x5f,0xc1,0x7d,0x0c,0x75,0x10,0xb7,0x22,0x34,0xbf,0x17,0xbe,0xc4,0xbd,0x81, >+ 0xe7,0x8d,0xdc,0x0d,0x1a,0x07,0xbf,0x67,0x89,0xdd,0x1e,0x14,0x87,0x2f,0xc3,0x3a, >+ 0x07,0xc5,0x2b,0x13,0xe5,0x82,0x73,0xe3,0xce,0xd0,0x9c,0xcb,0x18,0xea,0xd9,0xd9, >+ 0xd1,0x25,0xa8,0xce,0x73,0xf4,0x71,0xb7,0xf3,0x61,0xf3,0xda,0x2d,0x28,0x5e,0xce, >+ 0x7b,0x63,0x90,0x3b,0x23,0x20,0x2b,0x8d,0xed,0x5e,0xf2,0xc6,0xd3,0xec,0x7a,0xd0, >+ 0xae,0x86,0x76,0xe5,0xce,0x0e,0xb2,0x9e,0xb1,0xf5,0xa6,0x5d,0x6f,0x67,0x57,0x46, >+ 0xbb,0x5a,0xda,0x0d,0x74,0x76,0x90,0xf5,0x89,0xad,0x3f,0xed,0xfa,0xbb,0x79,0x1a, >+ 0x10,0x74,0x3c,0x39,0xde,0x0d,0x15,0xd4,0xe9,0xe3,0x74,0xfa,0x51,0x27,0x64,0x74, >+ 0x10,0xe3,0x7a,0xcc,0x3a,0xbc,0xf7,0x74,0xfa,0xbd,0xa8,0x2f,0x19,0xfd,0x72,0xa7, >+ 0x5f,0xea,0xf4,0xbb,0x53,0x3f,0xc9,0xe8,0x0f,0x72,0xfa,0x15,0xe9,0xb9,0xd7,0x36, >+ 0xd5,0x3f,0x19,0x94,0x37,0xc6,0xd1,0x8f,0x63,0xeb,0xc5,0xb9,0xe9,0xce,0xb9,0x35, >+ 0xdf,0xe3,0x5d,0xce,0x1b,0x36,0xd1,0x9d,0x29,0x4b,0x89,0x4d,0x12,0xd5,0x85,0x6c, >+ 0x1b,0xe7,0xf4,0xeb,0xa2,0xb1,0x26,0x31,0xef,0xa6,0xb8,0x7c,0x87,0xac,0x26,0xb6, >+ 0x29,0xcc,0xf7,0x1a,0xb7,0x1f,0xbf,0x21,0x9a,0x7b,0x7e,0x3f,0x7e,0x53,0x14,0xaf, >+ 0xe4,0xbd,0x02,0xff,0xd3,0x44,0xf1,0x49,0xdc,0x2b,0xe6,0x6b,0x8a,0xdb,0x7b,0x8f, >+ 0x8a,0xf2,0xc0,0xf8,0xa7,0x31,0x26,0xb8,0x4c,0x77,0x5c,0xa0,0x53,0x1b,0xdb,0x74, >+ 0xda,0xd7,0x3a,0x2e,0xdf,0x71,0x5c,0xec,0xae,0x7c,0x5c,0x74,0x1f,0x40,0xf6,0x27, >+ 0x62,0x4f,0x88,0xe2,0x35,0x2e,0x87,0x9f,0x14,0xc5,0xcb,0xb9,0x2e,0xe6,0x7f,0xba, >+ 0xe3,0x37,0x43,0x94,0x23,0x38,0x3f,0x49,0x1e,0x16,0x7b,0x96,0x8b,0x6d,0xf3,0xfc, >+ 0x14,0xc7,0x0b,0xd9,0x76,0xc6,0x99,0x2d,0x8a,0x9f,0x74,0xf7,0xd7,0x1c,0x51,0xdf, >+ 0xaf,0x50,0xa7,0x4e,0x54,0x6f,0x0e,0xc7,0x3f,0xcf,0x8d,0x1f,0xb2,0xb9,0xb1,0xcd, >+ 0x23,0xbf,0xb9,0xac,0x01,0x50,0x1f,0xcf,0xcf,0x9c,0x2b,0x45,0xac,0x1d,0x51,0xf3, >+ 0x2c,0xa0,0x7c,0x6c,0xdc,0xd5,0xf8,0x9f,0x32,0x38,0x68,0x1d,0x74,0x20,0xe4,0x6b, >+ 0x80,0xc0,0xbc,0x41,0x2d,0x3c,0x24,0xa8,0x4d,0x2e,0xfd,0xdf,0xa5,0xd8,0xd0,0xa0, >+ 0xff,0x17,0x20,0x5b,0x1d,0x31,0xf8,0x19,0x16,0xd4,0xd7,0xd0,0x90,0xf7,0x3d,0x9c, >+ 0xb6,0x0b,0xa4,0xb9,0x6f,0xb3,0x19,0x11,0x54,0x07,0x7e,0x1a,0x88,0x8d,0x0c,0xea, >+ 0x6b,0x44,0xc8,0x73,0x78,0x80,0xfc,0xc0,0xe1,0x19,0x62,0xd5,0x41,0xf1,0xa1,0x4e, >+ 0x6f,0x4c,0x50,0xfb,0xc4,0xf1,0x7f,0x90,0x98,0x38,0xec,0xab,0xc4,0xa0,0x3a,0x8e, >+ 0xb5,0xe0,0x43,0x41,0xed,0xa1,0x0f,0x79,0x35,0x6b,0x10,0x9b,0xdf,0x79,0x92,0xaf, >+ 0x1b,0x5b,0xe5,0x94,0x0f,0x72,0x02,0x76,0x73,0x33,0xe7,0xbe,0xd6,0x91,0xad,0x53, >+ 0xdd,0x02,0xea,0xa2,0xe6,0x18,0xcc,0xfb,0x02,0xf6,0xf3,0xa4,0x79,0x5d,0x7a,0x8d, >+ 0xf9,0xb6,0x88,0xf1,0x16,0xb9,0x78,0xfb,0x39,0x7e,0xe8,0x14,0x46,0xdb,0x06,0xc9, >+ 0xd7,0xa9,0x6f,0x06,0xad,0x7f,0x21,0x5b,0x25,0x2a,0xb3,0x3a,0x75,0xb9,0xa8,0xdc, >+ 0xea,0xd4,0x25,0x94,0x5b,0x0e,0x41,0xbe,0x18,0xf7,0x3d,0x63,0xe2,0xdd,0xea,0xd4, >+ 0xef,0xbb,0x3a,0xf5,0x4d,0x57,0xa7,0xae,0x10,0x95,0x59,0x9d,0xfa,0x03,0xe6,0xd7, >+ 0x0a,0x57,0xa7,0xae,0x14,0xc5,0x6d,0xef,0xad,0x22,0x8f,0x95,0xae,0x4e,0x7d,0x5e, >+ 0xf4,0xdb,0x44,0x35,0x7d,0xfa,0x3a,0xf5,0x05,0x51,0xb9,0xd5,0x90,0x8f,0x04,0xc5, >+ 0x5e,0x68,0xa1,0x4e,0x1d,0xcb,0x1a,0xf2,0x11,0x57,0x43,0x8e,0x0b,0x8a,0x63,0xcf, >+ 0x4c,0x76,0x77,0x02,0xf0,0xf1,0xb1,0x4d,0xe6,0x59,0x3b,0xde,0xd5,0xa9,0x13,0x5c, >+ 0x8c,0x6c,0x9d,0x3a,0x91,0x31,0x26,0xb8,0x18,0x93,0x82,0xe2,0x58,0x33,0xf3,0x37, >+ 0xd9,0xd5,0xa9,0x5f,0x0b,0xca,0x03,0x73,0x3a,0x89,0x71,0x6d,0x9f,0xbf,0x28,0x2a, >+ 0x07,0xbf,0x46,0xb7,0x1e,0xc0,0xd7,0xc4,0xd6,0xc8,0xf5,0x58,0xc3,0x1c,0x69,0x60, >+ 0xbf,0xd1,0xd5,0x13,0x1b,0x24,0x3f,0x6e,0x9b,0xd3,0x97,0x32,0x73,0x3a,0x4a,0xf2, >+ 0x73,0xba,0x59,0x54,0x6e,0xe3,0xdd,0x22,0x8a,0x6d,0x76,0x73,0x6a,0x67,0xd8,0x2b, >+ 0xc4,0x83,0xc3,0xb6,0x39,0x5d,0xc3,0xa6,0x06,0xe5,0xe1,0xeb,0x8d,0x69,0x41,0xf1, >+ 0x6d,0xae,0xde,0xa8,0x0d,0x8a,0x57,0x3a,0xbd,0xc7,0x82,0xe2,0xbe,0x06,0xf9,0x56, >+ 0x68,0xce,0x7f,0x0c,0xf5,0x6c,0x0c,0xdf,0x0e,0xaa,0x63,0x35,0xc8,0xe3,0xce,0xc7, >+ 0x8d,0xf3,0x3b,0x28,0x6e,0x35,0xc8,0x62,0xb7,0xfe,0x90,0xcd,0x88,0x6d,0x16,0xd7, >+ 0x6b,0x96,0xab,0x25,0xbe,0x4b,0x3b,0xab,0x41,0x16,0x39,0x3b,0xc8,0x66,0xc7,0x56, >+ 0x47,0xbb,0x3a,0x67,0x37,0x8f,0x76,0x56,0x83,0x2c,0x74,0x76,0x90,0x3d,0x8d,0x33, >+ 0x90,0x76,0x0b,0xdc,0x1d,0x5d,0x1f,0x74,0x3c,0x56,0x83,0x2c,0xa4,0xce,0xd3,0x4e, >+ 0x67,0x3e,0x75,0x42,0x46,0x67,0x61,0xc8,0xef,0xff,0xbf,0x07,0xf5,0x05,0xdf,0xf3, >+ 0x19,0x2f,0x3d,0x47,0xa8,0x3b,0xdb,0xf9,0x9b,0x43,0x7f,0x56,0xa3,0x98,0xce,0x22, >+ 0xe7,0xef,0x9d,0xa0,0x3e,0x11,0x63,0x0e,0xc7,0x0d,0xdd,0xc5,0xd4,0x9d,0xe1,0xfc, >+ 0xcd,0xa4,0x3f,0xab,0x61,0x4c,0x67,0xb1,0xf3,0x77,0x24,0xa8,0x4f,0xc4,0x98,0xc9, >+ 0xf9,0xb7,0xf5,0x6b,0x70,0x79,0xb1,0x9c,0xd8,0xd2,0xa0,0x38,0xbe,0x23,0xee,0x24, >+ 0xf6,0x4c,0x50,0x3f,0x90,0xd9,0xdd,0xfd,0x6c,0x50,0xbc,0x2e,0xc9,0xdf,0xa9,0xdb, >+ 0x45,0xf1,0xd7,0x79,0x5f,0xee,0x70,0x7b,0x0b,0xb2,0x37,0x62,0xdb,0xc1,0xbd,0x84, >+ 0xf7,0xe7,0xb8,0x97,0x56,0x32,0x8f,0xb7,0x48,0x9e,0xdb,0x0f,0x83,0xfa,0xaa,0x77, >+ 0x39,0xbb,0xca,0x61,0xe3,0x68,0xbb,0x3a,0xa8,0x2e,0x64,0xcb,0x89,0xfd,0x28,0xa8, >+ 0xaf,0xd5,0xcc,0x5d,0x7c,0xbb,0x7c,0x3e,0xe8,0x77,0xcb,0x25,0xd4,0xf9,0x71,0x50, >+ 0xbd,0x95,0x21,0xff,0xcd,0xe3,0x27,0x41,0xf1,0x7a,0x7e,0x07,0x7b,0x31,0xe8,0x5e, >+ 0x1c,0xcf,0xb3,0x76,0x4d,0x50,0x1d,0xdb,0x83,0xc0,0x1a,0x89,0x49,0xca,0xa9,0x30, >+ 0xfd,0xfe,0xb9,0x36,0xa8,0x2e,0x64,0xf0,0x31,0x95,0xf7,0x48,0x53,0x50,0x1e,0x6b, >+ 0x43,0xf3,0x6f,0x28,0xb8,0x13,0xd7,0x05,0x95,0x27,0x49,0xbe,0x8e,0xf8,0x6d,0xe6, >+ 0x3c,0xf1,0x75,0xc4,0xef,0x28,0xb7,0xfb,0x73,0xa7,0xa8,0x0f,0xdf,0x4a,0xe2,0xae, >+ 0x85,0x6c,0x17,0xef,0x92,0x32,0x7e,0x8b,0x83,0xed,0x4e,0x57,0x83,0x6c,0x08,0x7a, >+ 0xc7,0xed,0xbf,0x49,0x0d,0xb2,0x31,0xa8,0x0f,0x5f,0x83,0x6c,0x62,0x0d,0xb2,0xd1, >+ 0xd5,0x20,0x2f,0x05,0xf5,0xb5,0xc9,0xd5,0x20,0x9b,0x69,0xbb,0xeb,0x26,0x35,0xc8, >+ 0xcb,0x41,0x75,0x36,0xba,0x1a,0x64,0x4b,0x50,0x5f,0x2f,0xbb,0xda,0xe2,0x67,0xe4, >+ 0xe7,0x6b,0x90,0xad,0x41,0xf1,0x4d,0x4e,0xef,0xe7,0x41,0xed,0x7d,0x0d,0xf2,0x2a, >+ 0x31,0x5f,0x83,0xbc,0x46,0xcc,0xd7,0x20,0xdb,0x82,0xda,0x43,0x1f,0xf2,0xad,0xdc, >+ 0x7b,0x96,0xb3,0x3b,0x5c,0x4d,0x50,0x94,0x53,0x3e,0xd8,0x6b,0xb0,0x7b,0x23,0x73, >+ 0x57,0x34,0x38,0xdd,0x42,0xea,0xe2,0x3e,0x81,0xdd,0x0e,0x69,0x5e,0x6b,0x2c,0x91, >+ 0x3c,0xaf,0x3f,0x4b,0x7e,0x9c,0xbf,0xe4,0xbe,0xfa,0x8b,0x28,0xbe,0x8b,0x67,0xdc, >+ 0x1e,0xb7,0xaf,0x20,0xdb,0x1d,0xdb,0x1e,0xfa,0xda,0x2d,0xfa,0xed,0x11,0xdf,0x56, >+ 0xf7,0x89,0x7e,0x7b,0xb4,0xbc,0x49,0xeb,0x15,0xe2,0x56,0xa3,0xfc,0x55,0x14,0xb3, >+ 0xf3,0xfa,0x80,0xf3,0x0d,0xd9,0xfe,0xd8,0x0e,0xd0,0xf7,0x7e,0x77,0x7f,0xbd,0xc5, >+ 0xff,0xff,0xf8,0xa6,0x6a,0xdf,0x6b,0xab,0x62,0x04,0xc4,0xfd,0x9b,0xe4,0xbf,0x79, >+ 0xd6,0xb8,0xff,0xd3,0x6f,0x53,0x66,0x75,0xf9,0x41,0x51,0xcc,0x7f,0x2f,0x38,0xec, >+ 0xbe,0x2b,0x98,0xde,0x11,0x51,0x5d,0xc8,0x26,0x44,0x04,0xf1,0x77,0x07,0xc5,0xdf, >+ 0x92,0xfc,0xf9,0x67,0x3c,0x0f,0x70,0xee,0xa1,0xf7,0x36,0x6b,0x07,0xcc,0x0b,0x6c, >+ 0xf6,0xbb,0xbc,0x7f,0x57,0x5a,0xce,0xfb,0x5f,0x71,0x6e,0x8e,0x71,0xde,0x4f,0x73, >+ 0x6e,0x4e,0xb8,0xb9,0x81,0xec,0x78,0x6c,0x27,0x18,0xf3,0x38,0xe7,0x18,0xdf,0xa5, >+ 0xff,0xc3,0x6f,0xd2,0x76,0xae,0x9c,0x11,0xe5,0x51,0x1b,0xfd,0x22,0x1f,0xde,0xa7, >+ 0xce,0x19,0xc7,0xe5,0x43,0x51,0xfc,0xfd,0x9b,0xec,0x93,0x73,0xa2,0x3a,0xe0,0x63, >+ 0xfb,0xe4,0xbc,0xe8,0x18,0xce,0x31,0x9f,0x8c,0xcb,0x09,0x8e,0x1f,0x3a,0x87,0x82, >+ 0xea,0x60,0x4e,0xce,0x93,0xb3,0xf1,0xbc,0x90,0xe1,0xf9,0x31,0x79,0x5a,0x2e,0x7e, >+ 0x22,0x6a,0xef,0xf7,0xd2,0xa7,0xc4,0xfc,0x5e,0xba,0x48,0xcc,0xef,0xa5,0x4b,0xa2, >+ 0xf6,0xd0,0xbf,0xc8,0xdc,0x9d,0x1e,0xe3,0x20,0x26,0xe2,0x5c,0x22,0x67,0xcb,0xdb, >+ 0x3d,0xd2,0xfc,0x3b,0xf6,0x95,0xf4,0x1b,0xae,0x24,0x15,0xb1,0x7d,0x06,0x23,0x9d, >+ 0x6f,0x31,0xe0,0x1e,0x00,0x00 >+}; >+ >+// Generated from: >+// >+// #version 450 core >+// >+// #extension GL_EXT_samplerless_texture_functions : require >+// >+// layout(local_size_x = 4, local_size_y = 4, local_size_z = 1)in; >+// >+// struct TextWidgetData >+// { >+// uvec4 coordinates; >+// vec4 color; >+// uvec4 fontSize; >+// uvec4 text[256 / 16]; >+// }; >+// >+// struct GraphWidgetData >+// { >+// uvec4 coordinates; >+// vec4 color; >+// uvec4 valueWidth; >+// uvec4 values[256 / 4]; >+// }; >+// >+// layout(set = 0, binding = 0, rgba32f)uniform image2D blendOutput; >+// >+// layout(set = 0, binding = 1)uniform TextWidgets >+// { >+// TextWidgetData textWidgetsData[16]; >+// }; >+// >+// layout(set = 0, binding = 2)uniform GraphWidgets >+// { >+// GraphWidgetData graphWidgetsData[16]; >+// }; >+// >+// layout(set = 0, binding = 3)uniform utexture2D culledWidgets; >+// layout(set = 0, binding = 4)uniform texture2DArray font; >+// >+// layout(push_constant)uniform PushConstants >+// { >+// uvec2 outputSize; >+// >+// bool rotateXY; >+// } params; >+// >+// bool intersects(const uvec2 imageCoords, const uvec4 widgetCoords) >+// { >+// return all(greaterThanEqual(imageCoords, widgetCoords . xy))&& >+// all(lessThan(imageCoords, widgetCoords . zw)); >+// } >+// >+// uint getChar(const uint textWidget, const uvec2 coordInWidget, const uint fontGlyphWidth) >+// { >+// const uint charIndex = coordInWidget . x / fontGlyphWidth; >+// const uint packIndex = charIndex / 4; >+// const uvec4 arrayItem = textWidgetsData[textWidget]. text[packIndex / 4]; >+// const uint col = packIndex % 4; >+// >+// uint packedChars; >+// if(col == 0) >+// { >+// packedChars = arrayItem[0]; >+// } >+// else if(col == 1) >+// { >+// packedChars = arrayItem[1]; >+// } >+// else if(col == 2) >+// { >+// packedChars = arrayItem[2]; >+// } >+// else >+// { >+// packedChars = arrayItem[3]; >+// } >+// >+// const uint shift =(charIndex % 4)* 8; >+// >+// return(packedChars >> shift)& 0xFF; >+// >+// } >+// >+// float sampleFont(const uint textChar, >+// const uvec2 coordInWidget, >+// const uvec2 fontGlyphSize, >+// const uint fontLayer) >+// { >+// const uvec2 coordInGlyph = coordInWidget % fontGlyphSize; >+// const uvec2 glyphOffset = fontGlyphSize * >+// uvec2(textChar % 32, textChar / 32); >+// >+// return texelFetch(font, ivec3(glyphOffset + coordInGlyph, fontLayer), 0). x; >+// } >+// >+// uint getValue(const uint graphWidget, const uvec2 coordInWidget, const uint valueWidth) >+// { >+// const uint valueIndex = coordInWidget . x / valueWidth . x; >+// const uvec4 arrayItem = graphWidgetsData[graphWidget]. values[valueIndex / 4]; >+// const uint col = valueIndex % 4; >+// >+// if(col == 0) >+// { >+// return arrayItem[0]; >+// } >+// else if(col == 1) >+// { >+// return arrayItem[1]; >+// } >+// else if(col == 2) >+// { >+// return arrayItem[2]; >+// } >+// else >+// { >+// return arrayItem[3]; >+// } >+// } >+// >+// vec4 blend(const vec4 blendedSoFar, const vec4 color) >+// { >+// >+// return vec4(blendedSoFar . rgb *(1 - color . a)+ color . rgb * color . a, >+// blendedSoFar . a *(1 - color . a)); >+// } >+// >+// void main() >+// { >+// uvec2 imageCoords = gl_GlobalInvocationID . xy; >+// if(any(greaterThanEqual(imageCoords, params . outputSize))) >+// { >+// return; >+// } >+// >+// vec4 blendedWidgets = vec4(0, 0, 0, 1); >+// >+// const uvec2 subgroupWidgets = texelFetch(culledWidgets, ivec2(gl_WorkGroupID . xy), 0). xy; >+// uint textWidgets = subgroupWidgets . x; >+// uint graphWidgets = subgroupWidgets . y; >+// >+// while(graphWidgets != 0) >+// { >+// const uint graphWidget = findLSB(graphWidgets); >+// graphWidgets ^= 1 << graphWidget; >+// >+// const uvec4 widgetCoords = graphWidgetsData[graphWidget]. coordinates; >+// if(! intersects(imageCoords, widgetCoords)) >+// { >+// continue; >+// } >+// >+// if(imageCoords . x == widgetCoords . x || imageCoords . y == widgetCoords . y || >+// imageCoords . x + 1 == widgetCoords . z || imageCoords . y + 1 == widgetCoords . w) >+// { >+// >+// blendedWidgets = vec4(0); >+// continue; >+// } >+// >+// const uvec2 coordInWidget = imageCoords - widgetCoords . xy; >+// const uint valueWidth = graphWidgetsData[graphWidget]. valueWidth . x; >+// >+// const uint value = getValue(graphWidget, coordInWidget, valueWidth); >+// >+// vec4 color = vec4(0); >+// const uint widgetHeight = widgetCoords . w - widgetCoords . y; >+// >+// bool indicateOverflow = value > widgetHeight && coordInWidget . y + 4 >= widgetHeight >+// &&((coordInWidget . x ^ coordInWidget . y)& 1)== 0; >+// >+// if((widgetHeight - coordInWidget . y)< value && ! indicateOverflow) >+// { >+// color = graphWidgetsData[graphWidget]. color; >+// blendedWidgets = blend(blendedWidgets, color); >+// } >+// } >+// >+// while(textWidgets != 0) >+// { >+// const uint textWidget = findLSB(textWidgets); >+// textWidgets ^= 1 << textWidget; >+// >+// const uvec4 widgetCoords = textWidgetsData[textWidget]. coordinates; >+// if(! intersects(imageCoords, widgetCoords)) >+// { >+// continue; >+// } >+// >+// const uvec2 coordInWidget = imageCoords - widgetCoords . xy; >+// const uvec4 fontSizePacked = textWidgetsData[textWidget]. fontSize; >+// const uvec2 fontGlyphSize = fontSizePacked . xy; >+// const uint fontLayer = fontSizePacked . z; >+// >+// const uint textChar = getChar(textWidget, coordInWidget, fontGlyphSize . x); >+// >+// if(textChar <(32 * 3)) >+// { >+// >+// const float sampleValue = sampleFont(textChar, coordInWidget, fontGlyphSize, fontLayer); >+// >+// vec4 color = vec4(0, 0, 0, 0.4); >+// color = mix(color, textWidgetsData[textWidget]. color, sampleValue); >+// >+// blendedWidgets = blend(blendedWidgets, color); >+// } >+// } >+// >+// if(blendedWidgets . a < 1) >+// { >+// >+// if(params . rotateXY) >+// { >+// >+// imageCoords . xy = imageCoords . yx; >+// imageCoords . x = params . outputSize . y - 1 - imageCoords . x; >+// } >+// >+// vec3 blendedColor = blendedWidgets . rgb; >+// if(blendedWidgets . a > 0) >+// { >+// const vec4 color = imageLoad(blendOutput, ivec2(imageCoords)); >+// >+// blendedColor += color . rgb * blendedWidgets . a; >+// } >+// >+// imageStore(blendOutput, ivec2(imageCoords), vec4(blendedColor, 1)); >+// } >+// } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp >index 3413f07c27e855a3df50c45207217e9d084433f8..537a017977883db7bc775d8d35bef2cc84d273c7 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp >@@ -9,12 +9,8 @@ > #version 450 core > > #extension GL_EXT_samplerless_texture_functions : require >-#if SupportsBallot >-#extension GL_KHR_shader_subgroup_ballot: require >-#elif SupportsArithmetic >-#extension GL_KHR_shader_subgroup_arithmetic: require >-#endif > >+// Currently, only subgroupSize of 16, 32 and 64 are supported > #if Is8x4 > #define WORKGROUP_WIDTH 32 > #define BLOCK_WIDTH 8 >@@ -23,13 +19,22 @@ > #define WORKGROUP_WIDTH 64 > #define BLOCK_WIDTH 8 > #define BLOCK_HEIGHT 8 >+#elif Is4x4 >+#define WORKGROUP_WIDTH 16 >+#define BLOCK_WIDTH 4 >+#define BLOCK_HEIGHT 4 > #else > #error "Not all subgroup sizes are accounted for" > #endif > > // Limits: >+#if Is4x4 >+#define MAX_TEXT_WIDGETS 16 >+#define MAX_GRAPH_WIDGETS 16 >+#else > #define MAX_TEXT_WIDGETS 32 > #define MAX_GRAPH_WIDGETS 32 >+#endif > > layout (local_size_x = WORKGROUP_WIDTH, local_size_y = 1, local_size_z = 1) in; > >@@ -40,7 +45,30 @@ layout (set = 0, binding = 1) uniform WidgetCoordinates > uvec4 coordinates[MAX_TEXT_WIDGETS + MAX_GRAPH_WIDGETS]; > }; > >-#if SupportsNone >+#if Is4x4 >+shared uint intersectingWidgets[16]; >+ >+void accumulateWidgets(const uint localId) >+{ >+ if(localId < 8) >+ { >+ intersectingWidgets[localId] |= intersectingWidgets[localId + 8]; >+ if(localId < 4) >+ { >+ intersectingWidgets[localId] |= intersectingWidgets[localId + 4]; >+ if(localId < 2) >+ { >+ intersectingWidgets[localId] |= intersectingWidgets[localId + 2]; >+ if(localId < 1) >+ { >+ intersectingWidgets[localId] |= intersectingWidgets[localId+1]; >+ } >+ } >+ } >+ } >+} >+ >+#else > shared uint intersectingWidgets[32]; > > void accumulateWidgets(const uint localId) >@@ -67,7 +95,7 @@ void accumulateWidgets(const uint localId) > } > } > } >-#endif >+#endif // #if Is4x4 > > uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 blockCoordHigh) > { >@@ -78,26 +106,6 @@ uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 bloc > all(lessThan(widgetCoords.xy, blockCoordHigh)) && > all(greaterThanEqual(widgetCoords.zw, blockCoordLow)); > >-#if SupportsBallot >- >- return subgroupBallot(intersects).xy; >- >-#elif SupportsArithmetic >- >-#if Is8x8 >- const uint textWidgetBit = >- localId < MAX_TEXT_WIDGETS ? uint(intersects) << localId : 0; >- const uint graphWidgetBit = >- localId >= MAX_TEXT_WIDGETS ? uint(intersects) << (localId - MAX_TEXT_WIDGETS) : 0; >- return uvec2(subgroupOr(textWidgetBit), subgroupOr(graphWidgetBit)); >-#elif Is8x4 >- return uvec2(subgroupOr(uint(intersects) << localId), 0); >-#else >-#error "Not all subgroup sizes are accounted for" >-#endif >- >-#elif SupportsNone >- > uvec2 ballot = uvec2(0, 0); > #if Is8x8 > if (localId < MAX_TEXT_WIDGETS) >@@ -119,7 +127,7 @@ uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 bloc > { > ballot.y = intersectingWidgets[0]; > } >-#elif Is8x4 >+#elif Is8x4 || Is4x4 > intersectingWidgets[localId] = uint(intersects) << localId; > accumulateWidgets(localId); > if (localId == 0) >@@ -131,10 +139,6 @@ uvec2 cullWidgets(const uint offset, const uvec2 blockCoordLow, const uvec2 bloc > #endif > > return ballot; >- >-#else >-#error "Not all subgroup operations are accounted for" >-#endif > } > > void main() >@@ -150,7 +154,7 @@ void main() > > #if Is8x8 > culledWidgets = cullWidgets(0, blockCoordLow, blockCoordHigh); >-#elif Is8x4 >+#elif Is8x4 || Is4x4 > culledWidgets.x = cullWidgets(0, blockCoordLow, blockCoordHigh).x; > culledWidgets.y = cullWidgets(MAX_TEXT_WIDGETS, blockCoordLow, blockCoordHigh).x; > #else >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json >index 5764856440102b37f8245c6d83531cafd2377b3c..3a3099e4abb035d77c2d04d21529de19ba41a2ac 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayCull.comp.json >@@ -11,11 +11,7 @@ > ], > "SubgroupSize": [ > "Is8x4", >- "Is8x8" >- ], >- "SubgroupOp": [ >- [ "SupportsBallot", "--target-env", "vulkan1.1" ], >- [ "SupportsArithmetic", "--target-env", "vulkan1.1" ], >- "SupportsNone" >+ "Is8x8", >+ "Is4x4" > ] > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp >index 52d9357a2efba11fb1e8baaee0c66a18109a5b2c..23675cde254efa43c763d35e365603b4455794e6 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp >@@ -10,12 +10,16 @@ > > #extension GL_EXT_samplerless_texture_functions : require > >+// Currently, only subgroupSize of 16, 32 and 64 are supported > #if Is8x4 > #define BLOCK_WIDTH 8 > #define BLOCK_HEIGHT 4 > #elif Is8x8 > #define BLOCK_WIDTH 8 > #define BLOCK_HEIGHT 8 >+#elif Is4x4 >+#define BLOCK_WIDTH 4 >+#define BLOCK_HEIGHT 4 > #else > #error "Not all subgroup sizes are accounted for" > #endif >@@ -23,8 +27,14 @@ > // Limits: > // Note that max length and size is defined such that each buffer length is below 16KB, the minimum > // guaranteed supported size for uniform buffers. >+#if Is4x4 >+#define MAX_TEXT_WIDGETS 16 >+#define MAX_GRAPH_WIDGETS 16 >+#else > #define MAX_TEXT_WIDGETS 32 > #define MAX_GRAPH_WIDGETS 32 >+#endif >+ > #define MAX_TEXT_LENGTH 256 > #define MAX_GRAPH_SIZE 256 > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json >index 119157af7d4d884a73304bcda2375b2f0050b9cc..0ef58eee00eee52a3914a295f191123156c11ecd 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp.json >@@ -8,6 +8,7 @@ > ], > "SubgroupSize": [ > "Is8x4", >- "Is8x8" >+ "Is8x8", >+ "Is4x4" > ] > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp >index 2d1a7ece40e5363fdee37bf04a69fb07ad1bd08b..1ecb43a44f704ddf348e4f4017a2568f17e6a77f 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp >@@ -2341,6 +2341,7 @@ void GraphicsPipelineDesc::updateBlendFuncs(GraphicsPipelineTransitionBits *tran > } > > void GraphicsPipelineDesc::resetBlendFuncsAndEquations(GraphicsPipelineTransitionBits *transition, >+ const gl::BlendStateExt &blendStateExt, > gl::DrawBufferMask previousAttachmentsMask, > gl::DrawBufferMask newAttachmentsMask) > { >@@ -2348,7 +2349,9 @@ void GraphicsPipelineDesc::resetBlendFuncsAndEquations(GraphicsPipelineTransitio > // We need to clear blend funcs and equations for attachments in P that are not in N. That is > // attachments in P&~N. > const gl::DrawBufferMask attachmentsToClear = previousAttachmentsMask & ~newAttachmentsMask; >- constexpr size_t kSizeBits = sizeof(PackedColorBlendAttachmentState) * 8; >+ // We also need to restore blend funcs and equations for attachments in N that are not in P. >+ const gl::DrawBufferMask attachmentsToAdd = newAttachmentsMask & ~previousAttachmentsMask; >+ constexpr size_t kSizeBits = sizeof(PackedColorBlendAttachmentState) * 8; > > for (size_t attachmentIndex : attachmentsToClear) > { >@@ -2365,6 +2368,12 @@ void GraphicsPipelineDesc::resetBlendFuncsAndEquations(GraphicsPipelineTransitio > transition->set(ANGLE_GET_INDEXED_TRANSITION_BIT(mInputAssemblyAndColorBlendStateInfo, > attachments, attachmentIndex, kSizeBits)); > } >+ >+ if (attachmentsToAdd.any()) >+ { >+ updateBlendFuncs(transition, blendStateExt, attachmentsToAdd); >+ updateBlendEquations(transition, blendStateExt, attachmentsToAdd); >+ } > } > > void GraphicsPipelineDesc::setColorWriteMasks(gl::BlendStateExt::ColorMaskStorage::Type colorMasks, >@@ -3404,16 +3413,6 @@ angle::Result SamplerDesc::init(ContextVk *contextVk, Sampler *sampler) const > createInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; > createInfo.anisotropyEnable = VK_FALSE; > createInfo.unnormalizedCoordinates = VK_FALSE; >- // VUID-VkSamplerCreateInfo-minFilter VkCreateSampler: >- // VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT >- // specifies that the format can have different chroma, min, and mag filters. However, >- // VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT is >- // not supported for VkSamplerYcbcrConversionCreateInfo.format = VK_FORMAT_UNDEFINED so >- // minFilter/magFilter needs to be equal to chromaFilter. >- // HardwareBufferImageSiblingVkAndroid() forces VK_FILTER_NEAREST, so force >- // VK_FILTER_NEAREST here too. >- createInfo.magFilter = VK_FILTER_NEAREST; >- createInfo.minFilter = VK_FILTER_NEAREST; > } > > VkSamplerCustomBorderColorCreateInfoEXT customBorderColorInfo = {}; >@@ -3421,7 +3420,7 @@ angle::Result SamplerDesc::init(ContextVk *contextVk, Sampler *sampler) const > createInfo.addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER || > createInfo.addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) > { >- ASSERT((contextVk->getRenderer()->getFeatures().supportsCustomBorderColorEXT.enabled)); >+ ASSERT((contextVk->getRenderer()->getFeatures().supportsCustomBorderColor.enabled)); > customBorderColorInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT; > > customBorderColorInfo.customBorderColor.float32[0] = mBorderColor.red; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.h >index 206951d6fe9750de3f2f4564eb816cfc75a62a96..33383f860ae2838343dce42efd798c5d8e5751fd 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_cache_utils.h >@@ -632,6 +632,7 @@ class GraphicsPipelineDesc final > const gl::BlendStateExt &blendStateExt, > gl::DrawBufferMask attachmentMask); > void resetBlendFuncsAndEquations(GraphicsPipelineTransitionBits *transition, >+ const gl::BlendStateExt &blendStateExt, > gl::DrawBufferMask previousAttachmentsMask, > gl::DrawBufferMask newAttachmentsMask); > void setColorWriteMasks(gl::BlendStateExt::ColorMaskStorage::Type colorMasks, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp >index 3869bf3d4ec6258c2a2fc754d38bb4df366db9b5..aead7db204af0564b5d39901596998b496e0ac75 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp >@@ -24,13 +24,6 @@ > namespace > { > constexpr unsigned int kComponentsPerVector = 4; >- >-// Environment variable and Android property to remove the restriction on exposing >-// GL_EXT_shader_framebuffer_fetch_non_coherent on ARM and Qualcomm. >-constexpr char kEnableExtShaderFramebufferFetchNonCoherentOverrideVarName[] = >- "ANGLE_ENABLE_EXT_SHADER_FRAMEBUFFER_FETCH_NON_COHERENT_OVERRIDE"; >-constexpr char kEnableExtShaderFramebufferFetchNonCoherentOverridePropertyName[] = >- "debug.angle.enable.ext_shader_framebuffer_fetch_non_coherent_override"; > } // anonymous namespace > > namespace rx >@@ -369,12 +362,10 @@ void RendererVk::ensureCapsInitialized() const > mNativeExtensions.copyTexture3dANGLE = true; > mNativeExtensions.copyCompressedTextureCHROMIUM = true; > mNativeExtensions.debugMarkerEXT = true; >- mNativeExtensions.robustnessEXT = >- !IsSwiftshader(mPhysicalDeviceProperties.vendorID, mPhysicalDeviceProperties.deviceID) && >- !IsARM(mPhysicalDeviceProperties.vendorID); >- mNativeExtensions.discardFramebufferEXT = true; >- mNativeExtensions.textureBorderClampOES = getFeatures().supportsCustomBorderColorEXT.enabled; >- mNativeExtensions.textureBorderClampEXT = getFeatures().supportsCustomBorderColorEXT.enabled; >+ mNativeExtensions.robustnessEXT = !IsARM(mPhysicalDeviceProperties.vendorID); >+ mNativeExtensions.discardFramebufferEXT = true; >+ mNativeExtensions.textureBorderClampOES = getFeatures().supportsCustomBorderColor.enabled; >+ mNativeExtensions.textureBorderClampEXT = getFeatures().supportsCustomBorderColor.enabled; > // Enable EXT_texture_type_2_10_10_10_REV > mNativeExtensions.textureType2101010REVEXT = true; > >@@ -441,7 +432,8 @@ void RendererVk::ensureCapsInitialized() const > // We use secondary command buffers almost everywhere and they require a feature to be > // able to execute in the presence of queries. As a result, we won't support timestamp queries > // unless that feature is available. >- if (vk::CommandBuffer::SupportsQueries(mPhysicalDeviceFeatures)) >+ if (vk::OutsideRenderPassCommandBuffer::SupportsQueries(mPhysicalDeviceFeatures) && >+ vk::RenderPassCommandBuffer::SupportsQueries(mPhysicalDeviceFeatures)) > { > mNativeExtensions.disjointTimerQueryEXT = queueFamilyProperties.timestampValidBits > 0; > mNativeCaps.queryCounterBitsTimeElapsed = queueFamilyProperties.timestampValidBits; >@@ -614,19 +606,19 @@ void RendererVk::ensureCapsInitialized() const > // Looks like all floats are IEEE according to the docs here: > // https://www.khronos.org/registry/vulkan/specs/1.0-wsi_extensions/html/vkspec.html#spirvenv-precision-operation > mNativeCaps.vertexHighpFloat.setIEEEFloat(); >- mNativeCaps.vertexMediumpFloat.setIEEEFloat(); >- mNativeCaps.vertexLowpFloat.setIEEEFloat(); >+ mNativeCaps.vertexMediumpFloat.setIEEEHalfFloat(); >+ mNativeCaps.vertexLowpFloat.setIEEEHalfFloat(); > mNativeCaps.fragmentHighpFloat.setIEEEFloat(); >- mNativeCaps.fragmentMediumpFloat.setIEEEFloat(); >- mNativeCaps.fragmentLowpFloat.setIEEEFloat(); >+ mNativeCaps.fragmentMediumpFloat.setIEEEHalfFloat(); >+ mNativeCaps.fragmentLowpFloat.setIEEEHalfFloat(); > >- // Can't find documentation on the int precision in Vulkan. >+ // Vulkan doesn't provide such information. We provide the spec-required minimum here. > mNativeCaps.vertexHighpInt.setTwosComplementInt(32); >- mNativeCaps.vertexMediumpInt.setTwosComplementInt(32); >- mNativeCaps.vertexLowpInt.setTwosComplementInt(32); >+ mNativeCaps.vertexMediumpInt.setTwosComplementInt(16); >+ mNativeCaps.vertexLowpInt.setTwosComplementInt(16); > mNativeCaps.fragmentHighpInt.setTwosComplementInt(32); >- mNativeCaps.fragmentMediumpInt.setTwosComplementInt(32); >- mNativeCaps.fragmentLowpInt.setTwosComplementInt(32); >+ mNativeCaps.fragmentMediumpInt.setTwosComplementInt(16); >+ mNativeCaps.fragmentLowpInt.setTwosComplementInt(16); > > // Compute shader limits. > mNativeCaps.maxComputeWorkGroupCount[0] = LimitToInt(limitsVk.maxComputeWorkGroupCount[0]); >@@ -914,18 +906,15 @@ void RendererVk::ensureCapsInitialized() const > > mNativeCaps.subPixelBits = limitsVk.subPixelPrecisionBits; > >- // Important games are not checking supported extensions properly, and are confusing the >- // GL_EXT_shader_framebuffer_fetch_non_coherent as the GL_EXT_shader_framebuffer_fetch >- // extension. Therefore, don't enable the extension on Arm and Qualcomm by default. >- // https://issuetracker.google.com/issues/186643966 >- // However, it can be enabled by using an environment variable or Android property as below. >- const std::string enableOverrideValue = angle::GetEnvironmentVarOrAndroidProperty( >- kEnableExtShaderFramebufferFetchNonCoherentOverrideVarName, >- kEnableExtShaderFramebufferFetchNonCoherentOverridePropertyName); >- const bool enableOverride = >- !enableOverrideValue.empty() && enableOverrideValue.compare("0") != 0; >- if (enableOverride || (!(IsARM(mPhysicalDeviceProperties.vendorID) || >- IsQualcomm(mPhysicalDeviceProperties.vendorID)))) >+ if (getFeatures().supportsShaderFramebufferFetch.enabled) >+ { >+ // Enable GL_EXT_shader_framebuffer_fetch >+ // gl::IMPLEMENTATION_MAX_DRAW_BUFFERS is used to support the extension. >+ mNativeExtensions.shaderFramebufferFetchEXT = >+ mNativeCaps.maxDrawBuffers >= gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; >+ } >+ >+ if (getFeatures().supportsShaderFramebufferFetchNonCoherent.enabled) > { > // Enable GL_EXT_shader_framebuffer_fetch_non_coherent > // For supporting this extension, gl::IMPLEMENTATION_MAX_DRAW_BUFFERS is used. >@@ -1000,10 +989,13 @@ void RendererVk::ensureCapsInitialized() const > mNativeCaps.maxGeometryOutputVertices = LimitToInt(limitsVk.maxGeometryOutputVertices); > mNativeCaps.maxGeometryTotalOutputComponents = > LimitToInt(limitsVk.maxGeometryTotalOutputComponents); >- mNativeCaps.maxShaderStorageBlocks[gl::ShaderType::Geometry] = >- mNativeCaps.maxCombinedShaderOutputResources; >- mNativeCaps.maxShaderAtomicCounterBuffers[gl::ShaderType::Geometry] = >- maxCombinedAtomicCounterBuffers; >+ if (mPhysicalDeviceFeatures.vertexPipelineStoresAndAtomics) >+ { >+ mNativeCaps.maxShaderStorageBlocks[gl::ShaderType::Geometry] = >+ mNativeCaps.maxCombinedShaderOutputResources; >+ mNativeCaps.maxShaderAtomicCounterBuffers[gl::ShaderType::Geometry] = >+ maxCombinedAtomicCounterBuffers; >+ } > mNativeCaps.maxGeometryShaderInvocations = > LimitToInt(limitsVk.maxGeometryShaderInvocations); > } >@@ -1039,15 +1031,18 @@ void RendererVk::ensureCapsInitialized() const > mNativeCaps.maxUniformBufferBindings = LimitToInt( > mNativeCaps.maxUniformBufferBindings + kReservedTessellationDefaultUniformBindingCount); > >- mNativeCaps.maxShaderStorageBlocks[gl::ShaderType::TessControl] = >- mNativeCaps.maxCombinedShaderOutputResources; >- mNativeCaps.maxShaderAtomicCounterBuffers[gl::ShaderType::TessControl] = >- maxCombinedAtomicCounterBuffers; >- >- mNativeCaps.maxShaderStorageBlocks[gl::ShaderType::TessEvaluation] = >- mNativeCaps.maxCombinedShaderOutputResources; >- mNativeCaps.maxShaderAtomicCounterBuffers[gl::ShaderType::TessEvaluation] = >- maxCombinedAtomicCounterBuffers; >+ if (mPhysicalDeviceFeatures.vertexPipelineStoresAndAtomics) >+ { >+ mNativeCaps.maxShaderStorageBlocks[gl::ShaderType::TessControl] = >+ mNativeCaps.maxCombinedShaderOutputResources; >+ mNativeCaps.maxShaderAtomicCounterBuffers[gl::ShaderType::TessControl] = >+ maxCombinedAtomicCounterBuffers; >+ >+ mNativeCaps.maxShaderStorageBlocks[gl::ShaderType::TessEvaluation] = >+ mNativeCaps.maxCombinedShaderOutputResources; >+ mNativeCaps.maxShaderAtomicCounterBuffers[gl::ShaderType::TessEvaluation] = >+ maxCombinedAtomicCounterBuffers; >+ } > } > > // GL_APPLE_clip_distance/GL_EXT_clip_cull_distance >@@ -1112,6 +1107,9 @@ void RendererVk::ensureCapsInitialized() const > > // GL_ANGLE_texture_usage > mNativeExtensions.textureUsageANGLE = true; >+ >+ // GL_KHR_parallel_shader_compile >+ mNativeExtensions.parallelShaderCompileKHR = false; > } > > namespace vk >@@ -1160,6 +1158,22 @@ EGLint ComputeMaximumPBufferPixels(const VkPhysicalDeviceProperties &physicalDev > return static_cast<EGLint>(std::min(maxDimensionsSquared, kMaxValueForEGLint)); > } > >+EGLint GetMatchFormat(GLenum internalFormat) >+{ >+ // Lock Surface match format >+ switch (internalFormat) >+ { >+ case GL_RGBA8: >+ return EGL_FORMAT_RGBA_8888_KHR; >+ case GL_BGRA8_EXT: >+ return EGL_FORMAT_RGBA_8888_EXACT_KHR; >+ case GL_RGB565: >+ return EGL_FORMAT_RGB_565_EXACT_KHR; >+ default: >+ return EGL_NONE; >+ } >+} >+ > // Generates a basic config for a combination of color format, depth stencil format and sample > // count. > egl::Config GenerateDefaultConfig(DisplayVk *display, >@@ -1222,6 +1236,12 @@ egl::Config GenerateDefaultConfig(DisplayVk *display, > config.transparentBlueValue = 0; > config.colorComponentType = > gl_egl::GLComponentTypeToEGLColorComponentType(colorFormat.componentType); >+ // LockSurface matching >+ config.matchFormat = GetMatchFormat(colorFormat.internalFormat); >+ if (config.matchFormat != EGL_NONE) >+ { >+ config.surfaceType |= EGL_LOCK_SURFACE_BIT_KHR; >+ } > > // Vulkan always supports off-screen rendering. Check the config with display to see if it can > // also have window support. If not, the following call should automatically remove >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp >index bb6257aba8ce371ad8ffb67ee5091bce4ec54f7a..a0dc294ecb107171ec346a08f53c886a93c3be9c 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp >@@ -875,7 +875,8 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat) > { > static constexpr ImageFormatInitInfo kInfo[] = { > {angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK, nullptr}, >- {angle::FormatID::R8G8B8A8_UNORM_SRGB, nullptr}}; >+ {angle::FormatID::R8G8B8A8_UNORM_SRGB, >+ Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}}; > initImageFallback(renderer, kInfo, ArraySize(kInfo)); > } > mActualBufferFormatID = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK; >@@ -888,8 +889,7 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat) > mIntendedGLFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2; > { > static constexpr ImageFormatInitInfo kInfo[] = { >- {angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK, >- Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}, >+ {angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK, nullptr}, > {angle::FormatID::R8G8B8A8_UNORM, > Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}}; > initImageFallback(renderer, kInfo, ArraySize(kInfo)); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.cpp >index ea7ad52c069e5a3b00462f50079015c59e2cda01..672542d0728cd1f21563175b327b7ceefafc4e83 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.cpp >@@ -7,12 +7,12 @@ > // Helper utility classes that manage Vulkan resources. > > #include "libANGLE/renderer/vulkan/vk_helpers.h" >-#include "libANGLE/renderer/driver_utils.h" > > #include "common/utilities.h" > #include "common/vulkan/vk_headers.h" > #include "image_util/loadimage.h" > #include "libANGLE/Context.h" >+#include "libANGLE/renderer/driver_utils.h" > #include "libANGLE/renderer/renderer_utils.h" > #include "libANGLE/renderer/vulkan/BufferVk.h" > #include "libANGLE/renderer/vulkan/ContextVk.h" >@@ -41,15 +41,6 @@ constexpr VkClearDepthStencilValue kRobustInitDepthStencilValue = {1.0f, 0}; > constexpr VkImageAspectFlags kDepthStencilAspects = > VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; > >-constexpr VkBufferUsageFlags kLineLoopDynamicBufferUsage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | >- VK_BUFFER_USAGE_TRANSFER_DST_BIT | >- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; >-constexpr int kLineLoopDynamicBufferInitialSize = 1024 * 1024; >-constexpr VkBufferUsageFlags kLineLoopDynamicIndirectBufferUsage = >- VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | >- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; >-constexpr int kLineLoopDynamicIndirectBufferInitialSize = sizeof(VkDrawIndirectCommand) * 16; >- > constexpr angle::PackedEnumMap<PipelineStage, VkPipelineStageFlagBits> kPipelineStageFlagBitMap = { > {PipelineStage::TopOfPipe, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT}, > {PipelineStage::DrawIndirect, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT}, >@@ -94,7 +85,7 @@ struct ImageMemoryBarrierData > VkAccessFlags srcAccessMask; > // Read or write. > ResourceAccess type; >- // CommandBufferHelper tracks an array of PipelineBarriers. This indicates which array element >+ // *CommandBufferHelper track an array of PipelineBarriers. This indicates which array element > // this should be merged into. Right now we track individual barrier for every PipelineStage. If > // layout has a single stage mask bit, we use that stage as index. If layout has multiple stage > // mask bits, we pick the lowest stage as the index since it is the first stage that needs >@@ -820,6 +811,71 @@ bool ShouldReleaseFreeBuffer(const vk::BufferHelper &buffer, > > return sizeMismatch || releaseByPolicy; > } >+ >+// Helper functions used below >+char GetLoadOpShorthand(RenderPassLoadOp loadOp) >+{ >+ switch (loadOp) >+ { >+ case RenderPassLoadOp::Clear: >+ return 'C'; >+ case RenderPassLoadOp::Load: >+ return 'L'; >+ case RenderPassLoadOp::None: >+ return 'N'; >+ default: >+ return 'D'; >+ } >+} >+ >+char GetStoreOpShorthand(RenderPassStoreOp storeOp) >+{ >+ switch (storeOp) >+ { >+ case RenderPassStoreOp::Store: >+ return 'S'; >+ case RenderPassStoreOp::None: >+ return 'N'; >+ default: >+ return 'D'; >+ } >+} >+ >+template <typename CommandBufferHelperT> >+void RecycleCommandBufferHelper(VkDevice device, >+ std::vector<CommandBufferHelperT *> *freeList, >+ CommandBufferHelperT **commandBufferHelper, >+ priv::SecondaryCommandBuffer *commandBuffer) >+{ >+ freeList->push_back(*commandBufferHelper); >+} >+ >+template <typename CommandBufferHelperT> >+void RecycleCommandBufferHelper(VkDevice device, >+ std::vector<CommandBufferHelperT *> *freeList, >+ CommandBufferHelperT **commandBufferHelper, >+ VulkanSecondaryCommandBuffer *commandBuffer) >+{ >+ CommandPool *pool = (*commandBufferHelper)->getCommandPool(); >+ >+ pool->freeCommandBuffers(device, 1, commandBuffer->ptr()); >+ commandBuffer->releaseHandle(); >+ SafeDelete(*commandBufferHelper); >+} >+ >+ANGLE_MAYBE_UNUSED void ResetSecondaryCommandBuffer( >+ std::vector<priv::SecondaryCommandBuffer> *resetList, >+ priv::SecondaryCommandBuffer &&commandBuffer) >+{ >+ commandBuffer.reset(); >+} >+ >+ANGLE_MAYBE_UNUSED void ResetSecondaryCommandBuffer( >+ std::vector<VulkanSecondaryCommandBuffer> *resetList, >+ VulkanSecondaryCommandBuffer &&commandBuffer) >+{ >+ resetList->push_back(std::move(commandBuffer)); >+} > } // anonymous namespace > > // This is an arbitrary max. We can change this later if necessary. >@@ -962,45 +1018,18 @@ void PackedClearValuesArray::storeNoDepthStencil(PackedAttachmentIndex index, > mValues[index.get()] = clearValue; > } > >-// CommandBufferHelper implementation. >-CommandBufferHelper::CommandBufferHelper() >+// CommandBufferHelperCommon implementation. >+CommandBufferHelperCommon::CommandBufferHelperCommon() > : mPipelineBarriers(), > mPipelineBarrierMask(), > mCommandPool(nullptr), >- mCounter(0), >- mClearValues{}, >- mRenderPassStarted(false), >- mTransformFeedbackCounterBuffers{}, >- mValidTransformFeedbackBufferCount(0), >- mRebindTransformFeedbackBuffers(false), >- mIsTransformFeedbackActiveUnpaused(false), >- mIsRenderPassCommandBuffer(false), > mHasShaderStorageOutput(false), >- mHasGLMemoryBarrierIssued(false), >- mDepthAccess(ResourceAccess::Unused), >- mStencilAccess(ResourceAccess::Unused), >- mDepthCmdCountInvalidated(kInfiniteCmdCount), >- mDepthCmdCountDisabled(kInfiniteCmdCount), >- mStencilCmdCountInvalidated(kInfiniteCmdCount), >- mStencilCmdCountDisabled(kInfiniteCmdCount), >- mDepthStencilAttachmentIndex(kAttachmentIndexInvalid), >- mDepthStencilImage(nullptr), >- mDepthStencilResolveImage(nullptr), >- mDepthStencilLevelIndex(0), >- mDepthStencilLayerIndex(0), >- mDepthStencilLayerCount(0), >- mColorImagesCount(0), >- mImageOptimizeForPresent(nullptr) >+ mHasGLMemoryBarrierIssued(false) > {} > >-CommandBufferHelper::~CommandBufferHelper() >-{ >- mFramebuffer.setHandle(VK_NULL_HANDLE); >-} >+CommandBufferHelperCommon::~CommandBufferHelperCommon() {} > >-angle::Result CommandBufferHelper::initialize(Context *context, >- bool isRenderPassCommandBuffer, >- CommandPool *commandPool) >+void CommandBufferHelperCommon::initializeImpl(Context *context, CommandPool *commandPool) > { > ASSERT(mUsedBuffers.empty()); > constexpr size_t kInitialBufferCount = 128; >@@ -1010,82 +1039,21 @@ angle::Result CommandBufferHelper::initialize(Context *context, > // Push a scope into the pool allocator so we can easily free and re-init on reset() > mAllocator.push(); > >- mIsRenderPassCommandBuffer = isRenderPassCommandBuffer; >- mCommandPool = commandPool; >- >- return initializeCommandBuffer(context); >+ mCommandPool = commandPool; > } > >-angle::Result CommandBufferHelper::initializeCommandBuffer(Context *context) >-{ >- return mCommandBuffer.initialize(context, mCommandPool, mIsRenderPassCommandBuffer, >- &mAllocator); >-} >- >-angle::Result CommandBufferHelper::reset(Context *context) >+void CommandBufferHelperCommon::resetImpl() > { > mAllocator.pop(); > mAllocator.push(); > >- // Reset and re-initialize the command buffer >- context->getRenderer()->resetSecondaryCommandBuffer(std::move(mCommandBuffer)); >- ANGLE_TRY(initializeCommandBuffer(context)); >- > mUsedBuffers.clear(); >- >- if (mIsRenderPassCommandBuffer) >- { >- mRenderPassStarted = false; >- mValidTransformFeedbackBufferCount = 0; >- mRebindTransformFeedbackBuffers = false; >- mHasShaderStorageOutput = false; >- mHasGLMemoryBarrierIssued = false; >- mDepthAccess = ResourceAccess::Unused; >- mStencilAccess = ResourceAccess::Unused; >- mDepthCmdCountInvalidated = kInfiniteCmdCount; >- mDepthCmdCountDisabled = kInfiniteCmdCount; >- mStencilCmdCountInvalidated = kInfiniteCmdCount; >- mStencilCmdCountDisabled = kInfiniteCmdCount; >- mColorImagesCount = PackedAttachmentCount(0); >- mDepthStencilAttachmentIndex = kAttachmentIndexInvalid; >- mDepthInvalidateArea = gl::Rectangle(); >- mStencilInvalidateArea = gl::Rectangle(); >- mRenderPassUsedImages.clear(); >- mDepthStencilImage = nullptr; >- mDepthStencilResolveImage = nullptr; >- mColorImages.reset(); >- mColorResolveImages.reset(); >- mImageOptimizeForPresent = nullptr; >- } >- // This state should never change for non-renderPass command buffer >- ASSERT(mRenderPassStarted == false); >- ASSERT(mValidTransformFeedbackBufferCount == 0); >- ASSERT(!mRebindTransformFeedbackBuffers); >- ASSERT(!mIsTransformFeedbackActiveUnpaused); >- ASSERT(mRenderPassUsedImages.empty()); >- >- return angle::Result::Continue; >-} >- >-bool CommandBufferHelper::usesBuffer(const BufferHelper &buffer) const >-{ >- return mUsedBuffers.contains(buffer.getBufferSerial().getValue()); >-} >- >-bool CommandBufferHelper::usesBufferForWrite(const BufferHelper &buffer) const >-{ >- BufferAccess access; >- if (!mUsedBuffers.get(buffer.getBufferSerial().getValue(), &access)) >- { >- return false; >- } >- return access == BufferAccess::Write; > } > >-void CommandBufferHelper::bufferRead(ContextVk *contextVk, >- VkAccessFlags readAccessType, >- PipelineStage readStage, >- BufferHelper *buffer) >+void CommandBufferHelperCommon::bufferRead(ContextVk *contextVk, >+ VkAccessFlags readAccessType, >+ PipelineStage readStage, >+ BufferHelper *buffer) > { > VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[readStage]; > if (buffer->recordReadBarrier(readAccessType, stageBits, &mPipelineBarriers[readStage])) >@@ -1101,11 +1069,11 @@ void CommandBufferHelper::bufferRead(ContextVk *contextVk, > } > } > >-void CommandBufferHelper::bufferWrite(ContextVk *contextVk, >- VkAccessFlags writeAccessType, >- PipelineStage writeStage, >- AliasingMode aliasingMode, >- BufferHelper *buffer) >+void CommandBufferHelperCommon::bufferWrite(ContextVk *contextVk, >+ VkAccessFlags writeAccessType, >+ PipelineStage writeStage, >+ AliasingMode aliasingMode, >+ BufferHelper *buffer) > { > buffer->retainReadWrite(&contextVk->getResourceUseList()); > VkPipelineStageFlagBits stageBits = kPipelineStageFlagBitMap[writeStage]; >@@ -1133,70 +1101,306 @@ void CommandBufferHelper::bufferWrite(ContextVk *contextVk, > } > } > >-void CommandBufferHelper::imageRead(ContextVk *contextVk, >- VkImageAspectFlags aspectFlags, >- ImageLayout imageLayout, >- ImageHelper *image) >+bool CommandBufferHelperCommon::usesBuffer(const BufferHelper &buffer) const > { >- if (image->isReadBarrierNecessary(imageLayout)) >+ return mUsedBuffers.contains(buffer.getBufferSerial().getValue()); >+} >+ >+bool CommandBufferHelperCommon::usesBufferForWrite(const BufferHelper &buffer) const >+{ >+ BufferAccess access; >+ if (!mUsedBuffers.get(buffer.getBufferSerial().getValue(), &access)) > { >- updateImageLayoutAndBarrier(contextVk, image, aspectFlags, imageLayout); >+ return false; >+ } >+ return access == BufferAccess::Write; >+} >+ >+void CommandBufferHelperCommon::executeBarriers(const angle::FeaturesVk &features, >+ PrimaryCommandBuffer *primary) >+{ >+ // make a local copy for faster access >+ PipelineStagesMask mask = mPipelineBarrierMask; >+ if (mask.none()) >+ { >+ return; > } > >- if (mIsRenderPassCommandBuffer) >+ if (features.preferAggregateBarrierCalls.enabled) > { >- // As noted in the header we don't support multiple read layouts for Images. >- // We allow duplicate uses in the RP to accommodate for normal GL sampler usage. >- if (!usesImageInRenderPass(*image)) >+ PipelineStagesMask::Iterator iter = mask.begin(); >+ PipelineBarrier &barrier = mPipelineBarriers[*iter]; >+ for (++iter; iter != mask.end(); ++iter) > { >- mRenderPassUsedImages.insert(image->getImageSerial().getValue()); >- image->retain(&contextVk->getResourceUseList()); >+ barrier.merge(&mPipelineBarriers[*iter]); > } >+ barrier.execute(primary); > } > else > { >- image->retain(&contextVk->getResourceUseList()); >+ for (PipelineStage pipelineStage : mask) >+ { >+ PipelineBarrier &barrier = mPipelineBarriers[pipelineStage]; >+ barrier.execute(primary); >+ } > } >+ mPipelineBarrierMask.reset(); > } > >-void CommandBufferHelper::imageWrite(ContextVk *contextVk, >- gl::LevelIndex level, >- uint32_t layerStart, >- uint32_t layerCount, >- VkImageAspectFlags aspectFlags, >- ImageLayout imageLayout, >- AliasingMode aliasingMode, >- ImageHelper *image) >+void CommandBufferHelperCommon::imageReadImpl(ContextVk *contextVk, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ ImageHelper *image) >+{ >+ if (image->isReadBarrierNecessary(imageLayout)) >+ { >+ updateImageLayoutAndBarrier(contextVk, image, aspectFlags, imageLayout); >+ } >+} >+ >+void CommandBufferHelperCommon::imageWriteImpl(ContextVk *contextVk, >+ gl::LevelIndex level, >+ uint32_t layerStart, >+ uint32_t layerCount, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ AliasingMode aliasingMode, >+ ImageHelper *image) > { > image->retain(&contextVk->getResourceUseList()); > image->onWrite(level, 1, layerStart, layerCount, aspectFlags); > // Write always requires a barrier > updateImageLayoutAndBarrier(contextVk, image, aspectFlags, imageLayout); >+} > >- if (mIsRenderPassCommandBuffer) >+void CommandBufferHelperCommon::updateImageLayoutAndBarrier(Context *context, >+ ImageHelper *image, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout) >+{ >+ PipelineStage barrierIndex = kImageMemoryBarrierData[imageLayout].barrierIndex; >+ ASSERT(barrierIndex != PipelineStage::InvalidEnum); >+ PipelineBarrier *barrier = &mPipelineBarriers[barrierIndex]; >+ if (image->updateLayoutAndBarrier(context, aspectFlags, imageLayout, barrier)) > { >- // When used as a storage image we allow for aliased writes. >- if (aliasingMode == AliasingMode::Disallowed) >- { >- ASSERT(!usesImageInRenderPass(*image)); >- } >- if (!usesImageInRenderPass(*image)) >+ mPipelineBarrierMask.set(barrierIndex); >+ } >+} >+ >+void CommandBufferHelperCommon::addCommandDiagnosticsCommon(std::ostringstream *out) >+{ >+ *out << "Memory Barrier: "; >+ for (PipelineBarrier &barrier : mPipelineBarriers) >+ { >+ if (!barrier.isEmpty()) > { >- mRenderPassUsedImages.insert(image->getImageSerial().getValue()); >+ barrier.addDiagnosticsString(*out); > } > } >+ *out << "\\l"; >+} >+ >+// OutsideRenderPassCommandBufferHelper implementation. >+OutsideRenderPassCommandBufferHelper::OutsideRenderPassCommandBufferHelper() {} >+ >+OutsideRenderPassCommandBufferHelper::~OutsideRenderPassCommandBufferHelper() {} >+ >+angle::Result OutsideRenderPassCommandBufferHelper::initialize(Context *context, >+ CommandPool *commandPool) >+{ >+ initializeImpl(context, commandPool); >+ return initializeCommandBuffer(context); >+} >+ >+angle::Result OutsideRenderPassCommandBufferHelper::initializeCommandBuffer(Context *context) >+{ >+ return mCommandBuffer.initialize(context, mCommandPool, false, &mAllocator); >+} >+ >+angle::Result OutsideRenderPassCommandBufferHelper::reset(Context *context) >+{ >+ resetImpl(); >+ >+ // Reset and re-initialize the command buffer >+ context->getRenderer()->resetOutsideRenderPassCommandBuffer(std::move(mCommandBuffer)); >+ return initializeCommandBuffer(context); >+} >+ >+void OutsideRenderPassCommandBufferHelper::imageRead(ContextVk *contextVk, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ ImageHelper *image) >+{ >+ imageReadImpl(contextVk, aspectFlags, imageLayout, image); >+ image->retain(&contextVk->getResourceUseList()); >+} >+ >+void OutsideRenderPassCommandBufferHelper::imageWrite(ContextVk *contextVk, >+ gl::LevelIndex level, >+ uint32_t layerStart, >+ uint32_t layerCount, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ AliasingMode aliasingMode, >+ ImageHelper *image) >+{ >+ imageWriteImpl(contextVk, level, layerStart, layerCount, aspectFlags, imageLayout, aliasingMode, >+ image); >+} >+ >+angle::Result OutsideRenderPassCommandBufferHelper::flushToPrimary(Context *context, >+ PrimaryCommandBuffer *primary) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "OutsideRenderPassCommandBufferHelper::flushToPrimary"); >+ ASSERT(!empty()); >+ >+ // Commands that are added to primary before beginRenderPass command >+ executeBarriers(context->getRenderer()->getFeatures(), primary); >+ >+ ANGLE_TRY(mCommandBuffer.end(context)); >+ mCommandBuffer.executeCommands(primary); >+ >+ // Restart the command buffer. >+ return reset(context); >+} >+ >+void OutsideRenderPassCommandBufferHelper::addCommandDiagnostics(ContextVk *contextVk) >+{ >+ std::ostringstream out; >+ addCommandDiagnosticsCommon(&out); >+ >+ out << mCommandBuffer.dumpCommands("\\l"); >+ contextVk->addCommandBufferDiagnostics(out.str()); >+} >+ >+// RenderPassCommandBufferHelper implementation. >+RenderPassCommandBufferHelper::RenderPassCommandBufferHelper() >+ : mCurrentSubpass(0), >+ mCounter(0), >+ mClearValues{}, >+ mRenderPassStarted(false), >+ mTransformFeedbackCounterBuffers{}, >+ mValidTransformFeedbackBufferCount(0), >+ mRebindTransformFeedbackBuffers(false), >+ mIsTransformFeedbackActiveUnpaused(false), >+ mDepthAccess(ResourceAccess::Unused), >+ mStencilAccess(ResourceAccess::Unused), >+ mPreviousSubpassesCmdCount(0), >+ mDepthCmdCountInvalidated(kInfiniteCmdCount), >+ mDepthCmdCountDisabled(kInfiniteCmdCount), >+ mStencilCmdCountInvalidated(kInfiniteCmdCount), >+ mStencilCmdCountDisabled(kInfiniteCmdCount), >+ mDepthStencilAttachmentIndex(kAttachmentIndexInvalid), >+ mDepthStencilImage(nullptr), >+ mDepthStencilResolveImage(nullptr), >+ mDepthStencilLevelIndex(0), >+ mDepthStencilLayerIndex(0), >+ mDepthStencilLayerCount(0), >+ mColorImagesCount(0), >+ mImageOptimizeForPresent(nullptr) >+{} >+ >+RenderPassCommandBufferHelper::~RenderPassCommandBufferHelper() >+{ >+ mFramebuffer.setHandle(VK_NULL_HANDLE); >+} >+ >+angle::Result RenderPassCommandBufferHelper::initialize(Context *context, CommandPool *commandPool) >+{ >+ initializeImpl(context, commandPool); >+ return initializeCommandBuffer(context); >+} >+ >+angle::Result RenderPassCommandBufferHelper::initializeCommandBuffer(Context *context) >+{ >+ return getCommandBuffer().initialize(context, mCommandPool, true, &mAllocator); >+} >+ >+angle::Result RenderPassCommandBufferHelper::reset(Context *context) >+{ >+ resetImpl(); >+ >+ mRenderPassStarted = false; >+ mValidTransformFeedbackBufferCount = 0; >+ mRebindTransformFeedbackBuffers = false; >+ mHasShaderStorageOutput = false; >+ mHasGLMemoryBarrierIssued = false; >+ mDepthAccess = ResourceAccess::Unused; >+ mStencilAccess = ResourceAccess::Unused; >+ mPreviousSubpassesCmdCount = 0; >+ mDepthCmdCountInvalidated = kInfiniteCmdCount; >+ mDepthCmdCountDisabled = kInfiniteCmdCount; >+ mStencilCmdCountInvalidated = kInfiniteCmdCount; >+ mStencilCmdCountDisabled = kInfiniteCmdCount; >+ mColorImagesCount = PackedAttachmentCount(0); >+ mDepthStencilAttachmentIndex = kAttachmentIndexInvalid; >+ mDepthInvalidateArea = gl::Rectangle(); >+ mStencilInvalidateArea = gl::Rectangle(); >+ mRenderPassUsedImages.clear(); >+ mDepthStencilImage = nullptr; >+ mDepthStencilResolveImage = nullptr; >+ mColorImages.reset(); >+ mColorResolveImages.reset(); >+ mImageOptimizeForPresent = nullptr; >+ >+ // Reset and re-initialize the command buffers >+ for (uint32_t subpass = 0; subpass <= mCurrentSubpass; ++subpass) >+ { >+ context->getRenderer()->resetRenderPassCommandBuffer(std::move(mCommandBuffers[subpass])); >+ } >+ >+ mCurrentSubpass = 0; >+ return initializeCommandBuffer(context); >+} >+ >+void RenderPassCommandBufferHelper::imageRead(ContextVk *contextVk, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ ImageHelper *image) >+{ >+ imageReadImpl(contextVk, aspectFlags, imageLayout, image); >+ >+ // As noted in the header we don't support multiple read layouts for Images. >+ // We allow duplicate uses in the RP to accommodate for normal GL sampler usage. >+ if (!usesImage(*image)) >+ { >+ mRenderPassUsedImages.insert(image->getImageSerial().getValue()); >+ image->retain(&contextVk->getResourceUseList()); >+ } >+} >+ >+void RenderPassCommandBufferHelper::imageWrite(ContextVk *contextVk, >+ gl::LevelIndex level, >+ uint32_t layerStart, >+ uint32_t layerCount, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ AliasingMode aliasingMode, >+ ImageHelper *image) >+{ >+ imageWriteImpl(contextVk, level, layerStart, layerCount, aspectFlags, imageLayout, aliasingMode, >+ image); >+ >+ // When used as a storage image we allow for aliased writes. >+ if (aliasingMode == AliasingMode::Disallowed) >+ { >+ ASSERT(!usesImage(*image)); >+ } >+ if (!usesImage(*image)) >+ { >+ mRenderPassUsedImages.insert(image->getImageSerial().getValue()); >+ } > } > >-void CommandBufferHelper::colorImagesDraw(ResourceUseList *resourceUseList, >- ImageHelper *image, >- ImageHelper *resolveImage, >- PackedAttachmentIndex packedAttachmentIndex) >+void RenderPassCommandBufferHelper::colorImagesDraw(ResourceUseList *resourceUseList, >+ ImageHelper *image, >+ ImageHelper *resolveImage, >+ PackedAttachmentIndex packedAttachmentIndex) > { >- ASSERT(mIsRenderPassCommandBuffer); > ASSERT(packedAttachmentIndex < mColorImagesCount); > > image->retain(resourceUseList); >- if (!usesImageInRenderPass(*image)) >+ if (!usesImage(*image)) > { > // This is possible due to different layers of the same texture being attached to different > // attachments >@@ -1209,7 +1413,7 @@ void CommandBufferHelper::colorImagesDraw(ResourceUseList *resourceUseList, > if (resolveImage) > { > resolveImage->retain(resourceUseList); >- if (!usesImageInRenderPass(*resolveImage)) >+ if (!usesImage(*resolveImage)) > { > mRenderPassUsedImages.insert(resolveImage->getImageSerial().getValue()); > } >@@ -1219,16 +1423,15 @@ void CommandBufferHelper::colorImagesDraw(ResourceUseList *resourceUseList, > } > } > >-void CommandBufferHelper::depthStencilImagesDraw(ResourceUseList *resourceUseList, >- gl::LevelIndex level, >- uint32_t layerStart, >- uint32_t layerCount, >- ImageHelper *image, >- ImageHelper *resolveImage) >+void RenderPassCommandBufferHelper::depthStencilImagesDraw(ResourceUseList *resourceUseList, >+ gl::LevelIndex level, >+ uint32_t layerStart, >+ uint32_t layerCount, >+ ImageHelper *image, >+ ImageHelper *resolveImage) > { >- ASSERT(mIsRenderPassCommandBuffer); >- ASSERT(!usesImageInRenderPass(*image)); >- ASSERT(!resolveImage || !usesImageInRenderPass(*resolveImage)); >+ ASSERT(!usesImage(*image)); >+ ASSERT(!resolveImage || !usesImage(*resolveImage)); > > // Because depthStencil buffer's read/write property can change while we build renderpass, we > // defer the image layout changes until endRenderPass time or when images going away so that we >@@ -1253,7 +1456,7 @@ void CommandBufferHelper::depthStencilImagesDraw(ResourceUseList *resourceUseLis > } > } > >-void CommandBufferHelper::onDepthAccess(ResourceAccess access) >+void RenderPassCommandBufferHelper::onDepthAccess(ResourceAccess access) > { > // Update the access for optimizing this render pass's loadOp > UpdateAccess(&mDepthAccess, access); >@@ -1266,7 +1469,7 @@ void CommandBufferHelper::onDepthAccess(ResourceAccess access) > } > } > >-void CommandBufferHelper::onStencilAccess(ResourceAccess access) >+void RenderPassCommandBufferHelper::onStencilAccess(ResourceAccess access) > { > // Update the access for optimizing this render pass's loadOp > UpdateAccess(&mStencilAccess, access); >@@ -1279,9 +1482,9 @@ void CommandBufferHelper::onStencilAccess(ResourceAccess access) > } > } > >-bool CommandBufferHelper::onDepthStencilAccess(ResourceAccess access, >- uint32_t *cmdCountInvalidated, >- uint32_t *cmdCountDisabled) >+bool RenderPassCommandBufferHelper::onDepthStencilAccess(ResourceAccess access, >+ uint32_t *cmdCountInvalidated, >+ uint32_t *cmdCountDisabled) > { > if (*cmdCountInvalidated == kInfiniteCmdCount) > { >@@ -1316,15 +1519,15 @@ bool CommandBufferHelper::onDepthStencilAccess(ResourceAccess access, > // Get the latest CmdCount at the start of being disabled. At the end of the render > // pass, cmdCountDisabled is <= the actual command buffer size, and so it's compared > // with cmdCountInvalidated. If the same, the attachment is still invalidated. >- *cmdCountDisabled = mCommandBuffer.getRenderPassWriteCommandCount(); >+ *cmdCountDisabled = getRenderPassWriteCommandCount(); > return false; > } > } > } > >-void CommandBufferHelper::updateStartedRenderPassWithDepthMode(bool readOnlyDepthStencilMode) >+void RenderPassCommandBufferHelper::updateStartedRenderPassWithDepthMode( >+ bool readOnlyDepthStencilMode) > { >- ASSERT(mIsRenderPassCommandBuffer); > ASSERT(mRenderPassStarted); > > if (mDepthStencilImage) >@@ -1353,7 +1556,7 @@ void CommandBufferHelper::updateStartedRenderPassWithDepthMode(bool readOnlyDept > } > } > >-void CommandBufferHelper::restoreDepthContent() >+void RenderPassCommandBufferHelper::restoreDepthContent() > { > // Note that the image may have been deleted since the render pass has started. > if (mDepthStencilImage) >@@ -1365,7 +1568,7 @@ void CommandBufferHelper::restoreDepthContent() > } > } > >-void CommandBufferHelper::restoreStencilContent() >+void RenderPassCommandBufferHelper::restoreStencilContent() > { > // Note that the image may have been deleted since the render pass has started. > if (mDepthStencilImage) >@@ -1377,57 +1580,12 @@ void CommandBufferHelper::restoreStencilContent() > } > } > >-void CommandBufferHelper::executeBarriers(const angle::FeaturesVk &features, >- PrimaryCommandBuffer *primary) >-{ >- // make a local copy for faster access >- PipelineStagesMask mask = mPipelineBarrierMask; >- if (mask.none()) >- { >- return; >- } >- >- if (features.preferAggregateBarrierCalls.enabled) >- { >- PipelineStagesMask::Iterator iter = mask.begin(); >- PipelineBarrier &barrier = mPipelineBarriers[*iter]; >- for (++iter; iter != mask.end(); ++iter) >- { >- barrier.merge(&mPipelineBarriers[*iter]); >- } >- barrier.execute(primary); >- } >- else >- { >- for (PipelineStage pipelineStage : mask) >- { >- PipelineBarrier &barrier = mPipelineBarriers[pipelineStage]; >- barrier.execute(primary); >- } >- } >- mPipelineBarrierMask.reset(); >-} >- >-void CommandBufferHelper::updateImageLayoutAndBarrier(Context *context, >- ImageHelper *image, >- VkImageAspectFlags aspectFlags, >- ImageLayout imageLayout) >-{ >- PipelineStage barrierIndex = kImageMemoryBarrierData[imageLayout].barrierIndex; >- ASSERT(barrierIndex != PipelineStage::InvalidEnum); >- PipelineBarrier *barrier = &mPipelineBarriers[barrierIndex]; >- if (image->updateLayoutAndBarrier(context, aspectFlags, imageLayout, barrier)) >- { >- mPipelineBarrierMask.set(barrierIndex); >- } >-} >- >-void CommandBufferHelper::finalizeColorImageLayout(Context *context, >- ImageHelper *image, >- PackedAttachmentIndex packedAttachmentIndex, >- bool isResolveImage) >+void RenderPassCommandBufferHelper::finalizeColorImageLayout( >+ Context *context, >+ ImageHelper *image, >+ PackedAttachmentIndex packedAttachmentIndex, >+ bool isResolveImage) > { >- ASSERT(mIsRenderPassCommandBuffer); > ASSERT(packedAttachmentIndex < mColorImagesCount); > ASSERT(image != nullptr); > >@@ -1455,7 +1613,7 @@ void CommandBufferHelper::finalizeColorImageLayout(Context *context, > { > ASSERT(packedAttachmentIndex == kAttachmentIndexZero); > // Use finalLayout instead of extra barrier for layout change to present >- mImageOptimizeForPresent->setCurrentImageLayout(vk::ImageLayout::Present); >+ mImageOptimizeForPresent->setCurrentImageLayout(ImageLayout::Present); > // TODO(syoussefi): We currently don't store the layout of the resolve attachments, so once > // multisampled backbuffers are optimized to use resolve attachments, this information needs > // to be stored somewhere. http://anglebug.com/4836 >@@ -1467,9 +1625,8 @@ void CommandBufferHelper::finalizeColorImageLayout(Context *context, > image->resetRenderPassUsageFlags(); > } > >-void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context) >+void RenderPassCommandBufferHelper::finalizeDepthStencilImageLayout(Context *context) > { >- ASSERT(mIsRenderPassCommandBuffer); > ASSERT(mDepthStencilImage); > > // Do depth stencil layout change. >@@ -1516,9 +1673,8 @@ void CommandBufferHelper::finalizeDepthStencilImageLayout(Context *context) > } > } > >-void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *context) >+void RenderPassCommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *context) > { >- ASSERT(mIsRenderPassCommandBuffer); > ASSERT(mDepthStencilImage); > ASSERT(!mDepthStencilResolveImage->hasRenderPassUsageFlag(RenderPassUsage::ReadOnlyAttachment)); > >@@ -1554,10 +1710,8 @@ void CommandBufferHelper::finalizeDepthStencilResolveImageLayout(Context *contex > mDepthStencilResolveImage->resetRenderPassUsageFlags(); > } > >-void CommandBufferHelper::finalizeImageLayout(Context *context, const ImageHelper *image) >+void RenderPassCommandBufferHelper::finalizeImageLayout(Context *context, const ImageHelper *image) > { >- ASSERT(mIsRenderPassCommandBuffer); >- > if (image->hasRenderPassUsageFlag(RenderPassUsage::RenderTargetAttachment)) > { > for (PackedAttachmentIndex index = kAttachmentIndexZero; index < mColorImagesCount; ++index) >@@ -1588,7 +1742,7 @@ void CommandBufferHelper::finalizeImageLayout(Context *context, const ImageHelpe > } > } > >-void CommandBufferHelper::finalizeDepthStencilLoadStore(Context *context) >+void RenderPassCommandBufferHelper::finalizeDepthStencilLoadStore(Context *context) > { > ASSERT(mDepthStencilAttachmentIndex != kAttachmentIndexInvalid); > >@@ -1665,10 +1819,10 @@ void CommandBufferHelper::finalizeDepthStencilLoadStore(Context *context) > SetBitField(dsOps.stencilStoreOp, stencilStoreOp); > } > >-void CommandBufferHelper::finalizeDepthStencilLoadStoreOps(Context *context, >- ResourceAccess access, >- RenderPassLoadOp *loadOp, >- RenderPassStoreOp *storeOp) >+void RenderPassCommandBufferHelper::finalizeDepthStencilLoadStoreOps(Context *context, >+ ResourceAccess access, >+ RenderPassLoadOp *loadOp, >+ RenderPassStoreOp *storeOp) > { > // For read only depth stencil, we can use StoreOpNone if available. DontCare is still > // preferred, so do this after handling DontCare. >@@ -1705,31 +1859,25 @@ void CommandBufferHelper::finalizeDepthStencilLoadStoreOps(Context *context, > } > } > >-void CommandBufferHelper::finalizeDepthStencilImageLayoutAndLoadStore(Context *context) >+void RenderPassCommandBufferHelper::finalizeDepthStencilImageLayoutAndLoadStore(Context *context) > { > finalizeDepthStencilImageLayout(context); > finalizeDepthStencilLoadStore(context); > mDepthStencilImage->resetRenderPassUsageFlags(); > } > >-angle::Result CommandBufferHelper::beginRenderPass( >+angle::Result RenderPassCommandBufferHelper::beginRenderPass( > ContextVk *contextVk, > const Framebuffer &framebuffer, > const gl::Rectangle &renderArea, > const RenderPassDesc &renderPassDesc, > const AttachmentOpsArray &renderPassAttachmentOps, >- const vk::PackedAttachmentCount colorAttachmentCount, >+ const PackedAttachmentCount colorAttachmentCount, > const PackedAttachmentIndex depthStencilAttachmentIndex, > const PackedClearValuesArray &clearValues, >- CommandBuffer **commandBufferOut) >+ RenderPassCommandBuffer **commandBufferOut) > { >- ASSERT(mIsRenderPassCommandBuffer); >- ASSERT(empty()); >- >- VkCommandBufferInheritanceInfo inheritanceInfo = {}; >- ANGLE_TRY(vk::CommandBuffer::InitializeRenderPassInheritanceInfo( >- contextVk, framebuffer, renderPassDesc, &inheritanceInfo)); >- ANGLE_TRY(mCommandBuffer.begin(contextVk, inheritanceInfo)); >+ ASSERT(!mRenderPassStarted); > > mRenderPassDesc = renderPassDesc; > mAttachmentOps = renderPassAttachmentOps; >@@ -1738,17 +1886,27 @@ angle::Result CommandBufferHelper::beginRenderPass( > mFramebuffer.setHandle(framebuffer.getHandle()); > mRenderArea = renderArea; > mClearValues = clearValues; >- *commandBufferOut = &mCommandBuffer; >+ *commandBufferOut = &getCommandBuffer(); > > mRenderPassStarted = true; > mCounter++; > >- return angle::Result::Continue; >+ return beginRenderPassCommandBuffer(contextVk); > } > >-angle::Result CommandBufferHelper::endRenderPass(ContextVk *contextVk) >+angle::Result RenderPassCommandBufferHelper::beginRenderPassCommandBuffer(ContextVk *contextVk) > { >- ANGLE_TRY(mCommandBuffer.end(contextVk)); >+ VkCommandBufferInheritanceInfo inheritanceInfo = {}; >+ ANGLE_TRY(RenderPassCommandBuffer::InitializeRenderPassInheritanceInfo( >+ contextVk, mFramebuffer, mRenderPassDesc, &inheritanceInfo)); >+ inheritanceInfo.subpass = mCurrentSubpass; >+ >+ return getCommandBuffer().begin(contextVk, inheritanceInfo); >+} >+ >+angle::Result RenderPassCommandBufferHelper::endRenderPass(ContextVk *contextVk) >+{ >+ ANGLE_TRY(endRenderPassCommandBuffer(contextVk)); > > for (PackedAttachmentIndex index = kAttachmentIndexZero; index < mColorImagesCount; ++index) > { >@@ -1780,11 +1938,55 @@ angle::Result CommandBufferHelper::endRenderPass(ContextVk *contextVk) > return angle::Result::Continue; > } > >-void CommandBufferHelper::beginTransformFeedback(size_t validBufferCount, >- const VkBuffer *counterBuffers, >- bool rebindBuffers) >+angle::Result RenderPassCommandBufferHelper::endRenderPassCommandBuffer(ContextVk *contextVk) >+{ >+ return getCommandBuffer().end(contextVk); >+} >+ >+angle::Result RenderPassCommandBufferHelper::nextSubpass(ContextVk *contextVk, >+ RenderPassCommandBuffer **commandBufferOut) >+{ >+ if (RenderPassCommandBuffer::ExecutesInline()) >+ { >+ // When using ANGLE secondary command buffers, the commands are inline and are executed on >+ // the primary command buffer. This means that vkCmdNextSubpass can be intermixed with the >+ // rest of the commands, and there is no need to split command buffers. >+ // >+ // Note also that the command buffer handle doesn't change in this case. >+ getCommandBuffer().nextSubpass(VK_SUBPASS_CONTENTS_INLINE); >+ return angle::Result::Continue; >+ } >+ >+ // When using Vulkan secondary command buffers, each subpass's contents must be recorded in a >+ // separate command buffer that is vkCmdExecuteCommands'ed in the primary command buffer. >+ // vkCmdNextSubpass calls must also be issued in the primary command buffer. >+ // >+ // To support this, a list of command buffers are kept, one for each subpass. When moving to >+ // the next subpass, the previous command buffer is ended and a new one is initialized and >+ // begun. >+ >+ // Accumulate command count for tracking purposes. >+ mPreviousSubpassesCmdCount = getRenderPassWriteCommandCount(); >+ >+ ANGLE_TRY(endRenderPassCommandBuffer(contextVk)); >+ markClosed(); >+ >+ ++mCurrentSubpass; >+ ASSERT(mCurrentSubpass < kMaxSubpassCount); >+ >+ ANGLE_TRY(initializeCommandBuffer(contextVk)); >+ ANGLE_TRY(beginRenderPassCommandBuffer(contextVk)); >+ markOpen(); >+ >+ // Return the new command buffer handle >+ *commandBufferOut = &getCommandBuffer(); >+ return angle::Result::Continue; >+} >+ >+void RenderPassCommandBufferHelper::beginTransformFeedback(size_t validBufferCount, >+ const VkBuffer *counterBuffers, >+ bool rebindBuffers) > { >- ASSERT(mIsRenderPassCommandBuffer); > mValidTransformFeedbackBufferCount = static_cast<uint32_t>(validBufferCount); > mRebindTransformFeedbackBuffers = rebindBuffers; > >@@ -1794,27 +1996,26 @@ void CommandBufferHelper::beginTransformFeedback(size_t validBufferCount, > } > } > >-void CommandBufferHelper::endTransformFeedback() >+void RenderPassCommandBufferHelper::endTransformFeedback() > { >- ASSERT(mIsRenderPassCommandBuffer); > pauseTransformFeedback(); > mValidTransformFeedbackBufferCount = 0; > } > >-void CommandBufferHelper::invalidateRenderPassColorAttachment(PackedAttachmentIndex attachmentIndex) >+void RenderPassCommandBufferHelper::invalidateRenderPassColorAttachment( >+ PackedAttachmentIndex attachmentIndex) > { >- ASSERT(mIsRenderPassCommandBuffer); > SetBitField(mAttachmentOps[attachmentIndex].storeOp, RenderPassStoreOp::DontCare); > mAttachmentOps[attachmentIndex].isInvalidated = true; > } > >-void CommandBufferHelper::invalidateRenderPassDepthAttachment(const gl::DepthStencilState &dsState, >- const gl::Rectangle &invalidateArea) >+void RenderPassCommandBufferHelper::invalidateRenderPassDepthAttachment( >+ const gl::DepthStencilState &dsState, >+ const gl::Rectangle &invalidateArea) > { >- ASSERT(mIsRenderPassCommandBuffer); > // Keep track of the size of commands in the command buffer. If the size grows in the > // future, that implies that drawing occured since invalidated. >- mDepthCmdCountInvalidated = mCommandBuffer.getRenderPassWriteCommandCount(); >+ mDepthCmdCountInvalidated = getRenderPassWriteCommandCount(); > > // Also track the size if the attachment is currently disabled. > const bool isDepthWriteEnabled = dsState.depthTest && dsState.depthMask; >@@ -1824,14 +2025,13 @@ void CommandBufferHelper::invalidateRenderPassDepthAttachment(const gl::DepthSte > ExtendRenderPassInvalidateArea(invalidateArea, &mDepthInvalidateArea); > } > >-void CommandBufferHelper::invalidateRenderPassStencilAttachment( >+void RenderPassCommandBufferHelper::invalidateRenderPassStencilAttachment( > const gl::DepthStencilState &dsState, > const gl::Rectangle &invalidateArea) > { >- ASSERT(mIsRenderPassCommandBuffer); > // Keep track of the size of commands in the command buffer. If the size grows in the > // future, that implies that drawing occured since invalidated. >- mStencilCmdCountInvalidated = mCommandBuffer.getRenderPassWriteCommandCount(); >+ mStencilCmdCountInvalidated = getRenderPassWriteCommandCount(); > > // Also track the size if the attachment is currently disabled. > const bool isStencilWriteEnabled = >@@ -1843,157 +2043,60 @@ void CommandBufferHelper::invalidateRenderPassStencilAttachment( > ExtendRenderPassInvalidateArea(invalidateArea, &mStencilInvalidateArea); > } > >-angle::Result CommandBufferHelper::flushToPrimary(Context *context, >- PrimaryCommandBuffer *primary, >- const RenderPass *renderPass) >+angle::Result RenderPassCommandBufferHelper::flushToPrimary(Context *context, >+ PrimaryCommandBuffer *primary, >+ const RenderPass *renderPass) > { >- ANGLE_TRACE_EVENT0("gpu.angle", "CommandBufferHelper::flushToPrimary"); >- ASSERT(!empty()); >+ ANGLE_TRACE_EVENT0("gpu.angle", "RenderPassCommandBufferHelper::flushToPrimary"); >+ ASSERT(mRenderPassStarted); > > // Commands that are added to primary before beginRenderPass command > executeBarriers(context->getRenderer()->getFeatures(), primary); > >- if (mIsRenderPassCommandBuffer) >- { >- ASSERT(renderPass != nullptr); >+ ASSERT(renderPass != nullptr); > >- VkRenderPassBeginInfo beginInfo = {}; >- beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; >- beginInfo.renderPass = renderPass->getHandle(); >- beginInfo.framebuffer = mFramebuffer.getHandle(); >- beginInfo.renderArea.offset.x = static_cast<uint32_t>(mRenderArea.x); >- beginInfo.renderArea.offset.y = static_cast<uint32_t>(mRenderArea.y); >- beginInfo.renderArea.extent.width = static_cast<uint32_t>(mRenderArea.width); >- beginInfo.renderArea.extent.height = static_cast<uint32_t>(mRenderArea.height); >- beginInfo.clearValueCount = static_cast<uint32_t>(mRenderPassDesc.attachmentCount()); >- beginInfo.pClearValues = mClearValues.data(); >+ VkRenderPassBeginInfo beginInfo = {}; >+ beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; >+ beginInfo.renderPass = renderPass->getHandle(); >+ beginInfo.framebuffer = mFramebuffer.getHandle(); >+ beginInfo.renderArea.offset.x = static_cast<uint32_t>(mRenderArea.x); >+ beginInfo.renderArea.offset.y = static_cast<uint32_t>(mRenderArea.y); >+ beginInfo.renderArea.extent.width = static_cast<uint32_t>(mRenderArea.width); >+ beginInfo.renderArea.extent.height = static_cast<uint32_t>(mRenderArea.height); >+ beginInfo.clearValueCount = static_cast<uint32_t>(mRenderPassDesc.attachmentCount()); >+ beginInfo.pClearValues = mClearValues.data(); > >- // Run commands inside the RenderPass. >- constexpr VkSubpassContents kSubpassContents = >- vk::CommandBuffer::ExecutesInline() ? VK_SUBPASS_CONTENTS_INLINE >- : VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS; >+ // Run commands inside the RenderPass. >+ constexpr VkSubpassContents kSubpassContents = >+ RenderPassCommandBuffer::ExecutesInline() ? VK_SUBPASS_CONTENTS_INLINE >+ : VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS; > >- primary->beginRenderPass(beginInfo, kSubpassContents); >- mCommandBuffer.executeCommands(primary); >- primary->endRenderPass(); >- } >- else >+ primary->beginRenderPass(beginInfo, kSubpassContents); >+ for (uint32_t subpass = 0; subpass <= mCurrentSubpass; ++subpass) > { >- ANGLE_TRY(mCommandBuffer.end(context)); >- mCommandBuffer.executeCommands(primary); >+ if (subpass > 0) >+ { >+ primary->nextSubpass(kSubpassContents); >+ } >+ mCommandBuffers[subpass].executeCommands(primary); > } >+ primary->endRenderPass(); > > // Restart the command buffer. > return reset(context); > } > >-void CommandBufferHelper::updateRenderPassForResolve(ContextVk *contextVk, >- Framebuffer *newFramebuffer, >- const RenderPassDesc &renderPassDesc) >+void RenderPassCommandBufferHelper::updateRenderPassForResolve(ContextVk *contextVk, >+ Framebuffer *newFramebuffer, >+ const RenderPassDesc &renderPassDesc) > { > ASSERT(newFramebuffer); > mFramebuffer.setHandle(newFramebuffer->getHandle()); > mRenderPassDesc = renderPassDesc; > } > >-// Helper functions used below >-char GetLoadOpShorthand(RenderPassLoadOp loadOp) >-{ >- switch (loadOp) >- { >- case RenderPassLoadOp::Clear: >- return 'C'; >- case RenderPassLoadOp::Load: >- return 'L'; >- case RenderPassLoadOp::None: >- return 'N'; >- default: >- return 'D'; >- } >-} >- >-char GetStoreOpShorthand(RenderPassStoreOp storeOp) >+void RenderPassCommandBufferHelper::resumeTransformFeedback() > { >- switch (storeOp) >- { >- case RenderPassStoreOp::Store: >- return 'S'; >- case RenderPassStoreOp::None: >- return 'N'; >- default: >- return 'D'; >- } >-} >- >-void CommandBufferHelper::addCommandDiagnostics(ContextVk *contextVk) >-{ >- std::ostringstream out; >- >- out << "Memory Barrier: "; >- for (PipelineBarrier &barrier : mPipelineBarriers) >- { >- if (!barrier.isEmpty()) >- { >- barrier.addDiagnosticsString(out); >- } >- } >- out << "\\l"; >- >- if (mIsRenderPassCommandBuffer) >- { >- size_t attachmentCount = mRenderPassDesc.attachmentCount(); >- size_t depthStencilAttachmentCount = mRenderPassDesc.hasDepthStencilAttachment() ? 1 : 0; >- size_t colorAttachmentCount = attachmentCount - depthStencilAttachmentCount; >- >- PackedAttachmentIndex attachmentIndexVk(0); >- std::string loadOps, storeOps; >- >- if (colorAttachmentCount > 0) >- { >- loadOps += " Color: "; >- storeOps += " Color: "; >- >- for (size_t i = 0; i < colorAttachmentCount; ++i) >- { >- loadOps += GetLoadOpShorthand( >- static_cast<RenderPassLoadOp>(mAttachmentOps[attachmentIndexVk].loadOp)); >- storeOps += GetStoreOpShorthand( >- static_cast<RenderPassStoreOp>(mAttachmentOps[attachmentIndexVk].storeOp)); >- ++attachmentIndexVk; >- } >- } >- >- if (depthStencilAttachmentCount > 0) >- { >- ASSERT(depthStencilAttachmentCount == 1); >- >- loadOps += " Depth/Stencil: "; >- storeOps += " Depth/Stencil: "; >- >- loadOps += GetLoadOpShorthand( >- static_cast<RenderPassLoadOp>(mAttachmentOps[attachmentIndexVk].loadOp)); >- loadOps += GetLoadOpShorthand( >- static_cast<RenderPassLoadOp>(mAttachmentOps[attachmentIndexVk].stencilLoadOp)); >- >- storeOps += GetStoreOpShorthand( >- static_cast<RenderPassStoreOp>(mAttachmentOps[attachmentIndexVk].storeOp)); >- storeOps += GetStoreOpShorthand( >- static_cast<RenderPassStoreOp>(mAttachmentOps[attachmentIndexVk].stencilStoreOp)); >- } >- >- if (attachmentCount > 0) >- { >- out << "LoadOp: " << loadOps << "\\l"; >- out << "StoreOp: " << storeOps << "\\l"; >- } >- } >- out << mCommandBuffer.dumpCommands("\\l"); >- contextVk->addCommandBufferDiagnostics(out.str()); >-} >- >-void CommandBufferHelper::resumeTransformFeedback() >-{ >- ASSERT(mIsRenderPassCommandBuffer); > ASSERT(isTransformFeedbackStarted()); > > uint32_t numCounterBuffers = >@@ -2002,28 +2105,28 @@ void CommandBufferHelper::resumeTransformFeedback() > mRebindTransformFeedbackBuffers = false; > mIsTransformFeedbackActiveUnpaused = true; > >- mCommandBuffer.beginTransformFeedback(0, numCounterBuffers, >- mTransformFeedbackCounterBuffers.data(), nullptr); >+ getCommandBuffer().beginTransformFeedback(0, numCounterBuffers, >+ mTransformFeedbackCounterBuffers.data(), nullptr); > } > >-void CommandBufferHelper::pauseTransformFeedback() >+void RenderPassCommandBufferHelper::pauseTransformFeedback() > { >- ASSERT(mIsRenderPassCommandBuffer); > ASSERT(isTransformFeedbackStarted() && isTransformFeedbackActiveUnpaused()); > mIsTransformFeedbackActiveUnpaused = false; >- mCommandBuffer.endTransformFeedback(0, mValidTransformFeedbackBufferCount, >- mTransformFeedbackCounterBuffers.data(), nullptr); >+ getCommandBuffer().endTransformFeedback(0, mValidTransformFeedbackBufferCount, >+ mTransformFeedbackCounterBuffers.data(), nullptr); > } > >-void CommandBufferHelper::updateRenderPassColorClear(PackedAttachmentIndex colorIndexVk, >- const VkClearValue &clearValue) >+void RenderPassCommandBufferHelper::updateRenderPassColorClear(PackedAttachmentIndex colorIndexVk, >+ const VkClearValue &clearValue) > { > mAttachmentOps.setClearOp(colorIndexVk); > mClearValues.store(colorIndexVk, VK_IMAGE_ASPECT_COLOR_BIT, clearValue); > } > >-void CommandBufferHelper::updateRenderPassDepthStencilClear(VkImageAspectFlags aspectFlags, >- const VkClearValue &clearValue) >+void RenderPassCommandBufferHelper::updateRenderPassDepthStencilClear( >+ VkImageAspectFlags aspectFlags, >+ const VkClearValue &clearValue) > { > // Don't overwrite prior clear values for individual aspects. > VkClearValue combinedClearValue = mClearValues[mDepthStencilAttachmentIndex]; >@@ -2044,10 +2147,9 @@ void CommandBufferHelper::updateRenderPassDepthStencilClear(VkImageAspectFlags a > mClearValues.storeNoDepthStencil(mDepthStencilAttachmentIndex, combinedClearValue); > } > >-void CommandBufferHelper::growRenderArea(ContextVk *contextVk, const gl::Rectangle &newRenderArea) >+void RenderPassCommandBufferHelper::growRenderArea(ContextVk *contextVk, >+ const gl::Rectangle &newRenderArea) > { >- ASSERT(mIsRenderPassCommandBuffer); >- > // The render area is grown such that it covers both the previous and the new render areas. > gl::GetEnclosingRectangle(mRenderArea, newRenderArea, &mRenderArea); > >@@ -2070,13 +2172,74 @@ void CommandBufferHelper::growRenderArea(ContextVk *contextVk, const gl::Rectang > } > } > >-// CommandBufferRecycler implementation. >-CommandBufferRecycler::CommandBufferRecycler() = default; >-CommandBufferRecycler::~CommandBufferRecycler() = default; >+void RenderPassCommandBufferHelper::addCommandDiagnostics(ContextVk *contextVk) >+{ >+ std::ostringstream out; >+ addCommandDiagnosticsCommon(&out); >+ >+ size_t attachmentCount = mRenderPassDesc.attachmentCount(); >+ size_t depthStencilAttachmentCount = mRenderPassDesc.hasDepthStencilAttachment() ? 1 : 0; >+ size_t colorAttachmentCount = attachmentCount - depthStencilAttachmentCount; >+ >+ PackedAttachmentIndex attachmentIndexVk(0); >+ std::string loadOps, storeOps; >+ >+ if (colorAttachmentCount > 0) >+ { >+ loadOps += " Color: "; >+ storeOps += " Color: "; >+ >+ for (size_t i = 0; i < colorAttachmentCount; ++i) >+ { >+ loadOps += GetLoadOpShorthand( >+ static_cast<RenderPassLoadOp>(mAttachmentOps[attachmentIndexVk].loadOp)); >+ storeOps += GetStoreOpShorthand( >+ static_cast<RenderPassStoreOp>(mAttachmentOps[attachmentIndexVk].storeOp)); >+ ++attachmentIndexVk; >+ } >+ } >+ >+ if (depthStencilAttachmentCount > 0) >+ { >+ ASSERT(depthStencilAttachmentCount == 1); >+ >+ loadOps += " Depth/Stencil: "; >+ storeOps += " Depth/Stencil: "; >+ >+ loadOps += GetLoadOpShorthand( >+ static_cast<RenderPassLoadOp>(mAttachmentOps[attachmentIndexVk].loadOp)); >+ loadOps += GetLoadOpShorthand( >+ static_cast<RenderPassLoadOp>(mAttachmentOps[attachmentIndexVk].stencilLoadOp)); >+ >+ storeOps += GetStoreOpShorthand( >+ static_cast<RenderPassStoreOp>(mAttachmentOps[attachmentIndexVk].storeOp)); >+ storeOps += GetStoreOpShorthand( >+ static_cast<RenderPassStoreOp>(mAttachmentOps[attachmentIndexVk].stencilStoreOp)); >+ } >+ >+ if (attachmentCount > 0) >+ { >+ out << "LoadOp: " << loadOps << "\\l"; >+ out << "StoreOp: " << storeOps << "\\l"; >+ } > >-void CommandBufferRecycler::onDestroy() >+ for (uint32_t subpass = 0; subpass <= mCurrentSubpass; ++subpass) >+ { >+ if (subpass > 0) >+ { >+ out << "Next Subpass" >+ << "\\l"; >+ } >+ out << mCommandBuffers[subpass].dumpCommands("\\l"); >+ } >+ contextVk->addCommandBufferDiagnostics(out.str()); >+} >+ >+// CommandBufferRecycler implementation. >+template <typename CommandBufferT, typename CommandBufferHelperT> >+void CommandBufferRecycler<CommandBufferT, CommandBufferHelperT>::onDestroy() > { >- for (vk::CommandBufferHelper *commandBufferHelper : mCommandBufferHelperFreeList) >+ for (CommandBufferHelperT *commandBufferHelper : mCommandBufferHelperFreeList) > { > SafeDelete(commandBufferHelper); > } >@@ -2085,60 +2248,68 @@ void CommandBufferRecycler::onDestroy() > ASSERT(mSecondaryCommandBuffersToReset.empty()); > } > >-angle::Result CommandBufferRecycler::getCommandBufferHelper( >+template void CommandBufferRecycler<OutsideRenderPassCommandBuffer, >+ OutsideRenderPassCommandBufferHelper>::onDestroy(); >+template void >+CommandBufferRecycler<RenderPassCommandBuffer, RenderPassCommandBufferHelper>::onDestroy(); >+ >+template <typename CommandBufferT, typename CommandBufferHelperT> >+angle::Result CommandBufferRecycler<CommandBufferT, CommandBufferHelperT>::getCommandBufferHelper( > Context *context, >- bool hasRenderPass, > CommandPool *commandPool, >- CommandBufferHelper **commandBufferHelperOut) >+ CommandBufferHelperT **commandBufferHelperOut) > { > if (mCommandBufferHelperFreeList.empty()) > { >- vk::CommandBufferHelper *commandBuffer = new vk::CommandBufferHelper(); >- *commandBufferHelperOut = commandBuffer; >+ CommandBufferHelperT *commandBuffer = new CommandBufferHelperT(); >+ *commandBufferHelperOut = commandBuffer; > >- return commandBuffer->initialize(context, hasRenderPass, commandPool); >+ return commandBuffer->initialize(context, commandPool); > } > else > { >- vk::CommandBufferHelper *commandBuffer = mCommandBufferHelperFreeList.back(); >+ CommandBufferHelperT *commandBuffer = mCommandBufferHelperFreeList.back(); > mCommandBufferHelperFreeList.pop_back(); >- commandBuffer->setHasRenderPass(hasRenderPass); > *commandBufferHelperOut = commandBuffer; > return angle::Result::Continue; > } > } > >-void CommandBufferRecycler::recycleCommandBufferHelper(VkDevice device, >- vk::CommandBufferHelper **commandBuffer) >+template angle::Result >+CommandBufferRecycler<OutsideRenderPassCommandBuffer, OutsideRenderPassCommandBufferHelper>:: >+ getCommandBufferHelper(Context *context, >+ CommandPool *commandPool, >+ OutsideRenderPassCommandBufferHelper **commandBufferHelperOut); >+template angle::Result >+CommandBufferRecycler<RenderPassCommandBuffer, RenderPassCommandBufferHelper>:: >+ getCommandBufferHelper(Context *context, >+ CommandPool *commandPool, >+ RenderPassCommandBufferHelper **commandBufferHelperOut); >+ >+template <typename CommandBufferT, typename CommandBufferHelperT> >+void CommandBufferRecycler<CommandBufferT, CommandBufferHelperT>::recycleCommandBufferHelper( >+ VkDevice device, >+ CommandBufferHelperT **commandBuffer) > { > ASSERT((*commandBuffer)->empty()); > (*commandBuffer)->markOpen(); >- recycleImpl(device, commandBuffer); >+ RecycleCommandBufferHelper(device, &mCommandBufferHelperFreeList, commandBuffer, >+ &(*commandBuffer)->getCommandBuffer()); > } > >-#if ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS >-void CommandBufferRecycler::recycleImpl(VkDevice device, CommandBufferHelper **commandBuffer) >-{ >- mCommandBufferHelperFreeList.push_back(*commandBuffer); >-} >-void CommandBufferRecycler::resetCommandBufferHelper(CommandBuffer &&commandBuffer) >-{ >- commandBuffer.reset(); >-} >-#else // ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS >-void CommandBufferRecycler::recycleImpl(VkDevice device, CommandBufferHelper **commandBuffer) >-{ >- CommandPool *pool = (*commandBuffer)->getCommandPool(); >+template void >+CommandBufferRecycler<OutsideRenderPassCommandBuffer, OutsideRenderPassCommandBufferHelper>:: >+ recycleCommandBufferHelper(VkDevice device, >+ OutsideRenderPassCommandBufferHelper **commandBuffer); >+template void CommandBufferRecycler<RenderPassCommandBuffer, RenderPassCommandBufferHelper>:: >+ recycleCommandBufferHelper(VkDevice device, RenderPassCommandBufferHelper **commandBuffer); > >- pool->freeCommandBuffers(device, 1, (*commandBuffer)->getCommandBuffer().ptr()); >- (*commandBuffer)->getCommandBuffer().releaseHandle(); >- SafeDelete(*commandBuffer); >-} >-void CommandBufferRecycler::resetCommandBufferHelper(CommandBuffer &&commandBuffer) >+template <typename CommandBufferT, typename CommandBufferHelperT> >+void CommandBufferRecycler<CommandBufferT, CommandBufferHelperT>::resetCommandBuffer( >+ CommandBufferT &&commandBuffer) > { >- mSecondaryCommandBuffersToReset.push_back(std::move(commandBuffer)); >+ ResetSecondaryCommandBuffer(&mSecondaryCommandBuffersToReset, std::move(commandBuffer)); > } >-#endif // ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS > > // DynamicBuffer implementation. > DynamicBuffer::DynamicBuffer() >@@ -2502,77 +2673,14 @@ void DynamicBuffer::setMinimumSizeForTesting(size_t minSize) > mInitialSize = minSize; > > // Forces a new allocation on the next allocate. >- mSize = 0; >-} >- >-void DynamicBuffer::reset() >-{ >- mSize = 0; >- mNextAllocationOffset = 0; >- mLastFlushOrInvalidateOffset = 0; >-} >- >-// DynamicShadowBuffer implementation. >-DynamicShadowBuffer::DynamicShadowBuffer() : mInitialSize(0), mSize(0) {} >- >-DynamicShadowBuffer::DynamicShadowBuffer(DynamicShadowBuffer &&other) >- : mInitialSize(other.mInitialSize), mSize(other.mSize), mBuffer(std::move(other.mBuffer)) >-{} >- >-void DynamicShadowBuffer::init(size_t initialSize) >-{ >- mInitialSize = initialSize; >-} >- >-DynamicShadowBuffer::~DynamicShadowBuffer() >-{ >- ASSERT(mBuffer.empty()); >-} >- >-angle::Result DynamicShadowBuffer::allocate(size_t sizeInBytes) >-{ >- bool result = true; >- >- // Delete the current buffer, if any >- if (!mBuffer.empty()) >- { >- result &= mBuffer.resize(0); >- } >- >- // Cache the new size >- mSize = std::max(mInitialSize, sizeInBytes); >- >- // Allocate the buffer >- result &= mBuffer.resize(mSize); >- >- // If allocation failed, release the buffer and return error. >- if (!result) >- { >- release(); >- return angle::Result::Stop; >- } >- >- return angle::Result::Continue; >-} >- >-void DynamicShadowBuffer::release() >-{ >- reset(); >- >- if (!mBuffer.empty()) >- { >- (void)mBuffer.resize(0); >- } >-} >- >-void DynamicShadowBuffer::destroy(VkDevice device) >-{ >- release(); >+ mSize = 0; > } > >-void DynamicShadowBuffer::reset() >+void DynamicBuffer::reset() > { >- mSize = 0; >+ mSize = 0; >+ mNextAllocationOffset = 0; >+ mLastFlushOrInvalidateOffset = 0; > } > > // BufferPool implementation. >@@ -2649,8 +2757,9 @@ void BufferPool::pruneEmptyBuffers(RendererVk *renderer) > > angle::Result BufferPool::allocateNewBuffer(ContextVk *contextVk, VkDeviceSize sizeInBytes) > { >- RendererVk *renderer = contextVk->getRenderer(); >- BufferMemoryAllocator &bufferMemoryAllocator = renderer->getBufferMemoryAllocator(); >+ RendererVk *renderer = contextVk->getRenderer(); >+ const Allocator &allocator = renderer->getAllocator(); >+ > VkDeviceSize heapSize = > renderer->getMemoryProperties().getHeapSizeForMemoryType(mMemoryTypeIndex); > >@@ -2677,20 +2786,19 @@ angle::Result BufferPool::allocateNewBuffer(ContextVk *contextVk, VkDeviceSize s > createInfo.pQueueFamilyIndices = nullptr; > > VkMemoryPropertyFlags memoryPropertyFlags; >- bufferMemoryAllocator.getMemoryTypeProperties(renderer, mMemoryTypeIndex, &memoryPropertyFlags); >+ allocator.getMemoryTypeProperties(mMemoryTypeIndex, &memoryPropertyFlags); > > DeviceScoped<Buffer> buffer(renderer->getDevice()); > AllocatorScoped<Allocation> allocation(renderer->getAllocator()); > uint32_t memoryTypeIndex = kInvalidMemoryTypeIndex; >- ANGLE_VK_TRY(contextVk, bufferMemoryAllocator.createBuffer( >- renderer, createInfo, memoryPropertyFlags, 0, >- renderer->getFeatures().persistentlyMappedBuffers.enabled, >- &memoryTypeIndex, &buffer.get(), &allocation.get())); >+ ANGLE_VK_TRY(contextVk, >+ allocator.createBuffer(createInfo, memoryPropertyFlags, 0, >+ renderer->getFeatures().persistentlyMappedBuffers.enabled, >+ &memoryTypeIndex, &buffer.get(), &allocation.get())); > ASSERT(memoryTypeIndex != kInvalidMemoryTypeIndex); > if (memoryTypeIndex != mMemoryTypeIndex) > { >- bufferMemoryAllocator.getMemoryTypeProperties(renderer, memoryTypeIndex, >- &memoryPropertyFlags); >+ allocator.getMemoryTypeProperties(memoryTypeIndex, &memoryPropertyFlags); > } > > // Allocate bufferBlock >@@ -2712,7 +2820,7 @@ angle::Result BufferPool::allocateNewBuffer(ContextVk *contextVk, VkDeviceSize s > angle::Result BufferPool::allocateBuffer(ContextVk *contextVk, > VkDeviceSize sizeInBytes, > VkDeviceSize alignment, >- BufferSubAllocation *suballocation) >+ BufferSuballocation *suballocation) > { > ASSERT(alignment); > VkDeviceSize offset; >@@ -3224,9 +3332,10 @@ void QueryHelper::deinit() > mStatus = QueryStatus::Inactive; > } > >+template <typename CommandBufferT> > void QueryHelper::beginQueryImpl(ContextVk *contextVk, >- CommandBuffer *resetCommandBuffer, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *resetCommandBuffer, >+ CommandBufferT *commandBuffer) > { > ASSERT(mStatus != QueryStatus::Active); > const QueryPool &queryPool = getQueryPool(); >@@ -3235,7 +3344,8 @@ void QueryHelper::beginQueryImpl(ContextVk *contextVk, > mStatus = QueryStatus::Active; > } > >-void QueryHelper::endQueryImpl(ContextVk *contextVk, CommandBuffer *commandBuffer) >+template <typename CommandBufferT> >+void QueryHelper::endQueryImpl(ContextVk *contextVk, CommandBufferT *commandBuffer) > { > ASSERT(mStatus != QueryStatus::Ended); > commandBuffer->endQuery(getQueryPool(), mQuery); >@@ -3253,7 +3363,7 @@ angle::Result QueryHelper::beginQuery(ContextVk *contextVk) > RenderPassClosureReason::BeginNonRenderPassQuery)); > } > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > > ANGLE_TRY(contextVk->handleGraphicsEventLog(rx::GraphicsEventCmdBuf::InOutsideCmdBufQueryCmd)); >@@ -3271,7 +3381,7 @@ angle::Result QueryHelper::endQuery(ContextVk *contextVk) > RenderPassClosureReason::EndNonRenderPassQuery)); > } > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > > ANGLE_TRY(contextVk->handleGraphicsEventLog(rx::GraphicsEventCmdBuf::InOutsideCmdBufQueryCmd)); >@@ -3299,10 +3409,10 @@ void QueryHelper::resetQueryPoolImpl(ContextVk *contextVk, > > angle::Result QueryHelper::beginRenderPassQuery(ContextVk *contextVk) > { >- CommandBuffer *outsideRenderPassCommandBuffer; >+ OutsideRenderPassCommandBuffer *outsideRenderPassCommandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &outsideRenderPassCommandBuffer)); > >- CommandBuffer *renderPassCommandBuffer = >+ RenderPassCommandBuffer *renderPassCommandBuffer = > &contextVk->getStartedRenderPassCommands().getCommandBuffer(); > > beginQueryImpl(contextVk, outsideRenderPassCommandBuffer, renderPassCommandBuffer); >@@ -3326,7 +3436,7 @@ angle::Result QueryHelper::flushAndWriteTimestamp(ContextVk *contextVk) > contextVk->flushCommandsAndEndRenderPass(RenderPassClosureReason::TimestampQuery)); > } > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer({}, &commandBuffer)); > writeTimestamp(contextVk, commandBuffer); > return angle::Result::Continue; >@@ -3341,7 +3451,8 @@ void QueryHelper::writeTimestampToPrimary(ContextVk *contextVk, PrimaryCommandBu > primary->writeTimestamp(VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, queryPool, mQuery); > } > >-void QueryHelper::writeTimestamp(ContextVk *contextVk, CommandBuffer *commandBuffer) >+void QueryHelper::writeTimestamp(ContextVk *contextVk, >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > const QueryPool &queryPool = getQueryPool(); > resetQueryPoolImpl(contextVk, queryPool, commandBuffer); >@@ -3512,37 +3623,18 @@ void SemaphoreHelper::deinit() > } > > // LineLoopHelper implementation. >-LineLoopHelper::LineLoopHelper(RendererVk *renderer) >-{ >- // We need to use an alignment of the maximum size we're going to allocate, which is >- // VK_INDEX_TYPE_UINT32. When we switch from a drawElement to a drawArray call, the allocations >- // can vary in size. According to the Vulkan spec, when calling vkCmdBindIndexBuffer: 'The >- // sum of offset and the address of the range of VkDeviceMemory object that is backing buffer, >- // must be a multiple of the type indicated by indexType'. >- mDynamicIndexBuffer.init(renderer, kLineLoopDynamicBufferUsage, sizeof(uint32_t), >- kLineLoopDynamicBufferInitialSize, true, >- DynamicBufferPolicy::OneShotUse); >- mDynamicIndirectBuffer.init(renderer, kLineLoopDynamicIndirectBufferUsage, sizeof(uint32_t), >- kLineLoopDynamicIndirectBufferInitialSize, true, >- DynamicBufferPolicy::OneShotUse); >-} >- >+LineLoopHelper::LineLoopHelper(RendererVk *renderer) {} > LineLoopHelper::~LineLoopHelper() = default; > > angle::Result LineLoopHelper::getIndexBufferForDrawArrays(ContextVk *contextVk, > uint32_t clampedVertexCount, > GLint firstVertex, >- BufferHelper **bufferOut, >- VkDeviceSize *offsetOut) >+ BufferHelper **bufferOut) > { >- uint32_t *indices = nullptr; > size_t allocateBytes = sizeof(uint32_t) * (static_cast<size_t>(clampedVertexCount) + 1); >- >- mDynamicIndexBuffer.releaseInFlightBuffers(contextVk); >- ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes, >- reinterpret_cast<uint8_t **>(&indices), nullptr, >- offsetOut, nullptr)); >- *bufferOut = mDynamicIndexBuffer.getCurrentBuffer(); >+ ANGLE_TRY(mDynamicIndexBuffer.allocateForVertexConversion(contextVk, allocateBytes, >+ MemoryHostVisibility::Visible)); >+ uint32_t *indices = reinterpret_cast<uint32_t *>(mDynamicIndexBuffer.getMappedMemory()); > > // Note: there could be an overflow in this addition. > uint32_t unsignedFirstVertex = static_cast<uint32_t>(firstVertex); >@@ -3556,7 +3648,9 @@ angle::Result LineLoopHelper::getIndexBufferForDrawArrays(ContextVk *contextVk, > // Since we are not using the VK_MEMORY_PROPERTY_HOST_COHERENT_BIT flag when creating the > // device memory in the StreamingBuffer, we always need to make sure we flush it after > // writing. >- ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk)); >+ ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk->getRenderer())); >+ >+ *bufferOut = &mDynamicIndexBuffer; > > return angle::Result::Continue; > } >@@ -3567,7 +3661,6 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con > int indexCount, > intptr_t elementArrayOffset, > BufferHelper **bufferOut, >- VkDeviceSize *bufferOffsetOut, > uint32_t *indexCountOut) > { > if (glIndexType == gl::DrawElementsType::UnsignedByte || >@@ -3579,44 +3672,42 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con > ANGLE_TRY(elementArrayBufferVk->mapImpl(contextVk, GL_MAP_READ_BIT, &srcDataMapping)); > ANGLE_TRY(streamIndices(contextVk, glIndexType, indexCount, > static_cast<const uint8_t *>(srcDataMapping) + elementArrayOffset, >- bufferOut, bufferOffsetOut, indexCountOut)); >+ bufferOut, indexCountOut)); > ANGLE_TRY(elementArrayBufferVk->unmapImpl(contextVk)); > return angle::Result::Continue; > } > > *indexCountOut = indexCount + 1; > >- uint32_t *indices = nullptr; >- size_t unitSize = contextVk->getVkIndexTypeSize(glIndexType); >- size_t allocateBytes = unitSize * (indexCount + 1) + 1; >- >- mDynamicIndexBuffer.releaseInFlightBuffers(contextVk); >- ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes, >- reinterpret_cast<uint8_t **>(&indices), nullptr, >- bufferOffsetOut, nullptr)); >- *bufferOut = mDynamicIndexBuffer.getCurrentBuffer(); >- >- BufferHelper *sourceBuffer = &elementArrayBufferVk->getBuffer(); >- VkDeviceSize sourceBufferOffset = sourceBuffer->getOffset(); >+ size_t unitSize = contextVk->getVkIndexTypeSize(glIndexType); > >- VkDeviceSize sourceOffset = static_cast<VkDeviceSize>(elementArrayOffset) + sourceBufferOffset; >- uint64_t unitCount = static_cast<VkDeviceSize>(indexCount); >- angle::FixedVector<VkBufferCopy, 3> copies = { >- {sourceOffset, *bufferOffsetOut, unitCount * unitSize}, >- {sourceOffset, *bufferOffsetOut + unitCount * unitSize, unitSize}, >+ size_t allocateBytes = unitSize * (indexCount + 1) + 1; >+ ANGLE_TRY(mDynamicIndexBuffer.allocateForVertexConversion(contextVk, allocateBytes, >+ MemoryHostVisibility::Visible)); >+ >+ BufferHelper *sourceBuffer = &elementArrayBufferVk->getBuffer(); >+ VkDeviceSize sourceOffset = >+ static_cast<VkDeviceSize>(elementArrayOffset) + sourceBuffer->getOffset(); >+ uint64_t unitCount = static_cast<VkDeviceSize>(indexCount); >+ angle::FixedVector<VkBufferCopy, 2> copies = { >+ {sourceOffset, mDynamicIndexBuffer.getOffset(), unitCount * unitSize}, >+ {sourceOffset, mDynamicIndexBuffer.getOffset() + unitCount * unitSize, unitSize}, > }; > > vk::CommandBufferAccess access; >- access.onBufferTransferWrite(*bufferOut); >+ access.onBufferTransferWrite(&mDynamicIndexBuffer); > access.onBufferTransferRead(sourceBuffer); > >- vk::CommandBuffer *commandBuffer; >+ vk::OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > >- commandBuffer->copyBuffer(sourceBuffer->getBuffer(), (*bufferOut)->getBuffer(), >+ commandBuffer->copyBuffer(sourceBuffer->getBuffer(), mDynamicIndexBuffer.getBuffer(), > static_cast<uint32_t>(copies.size()), copies.data()); > >- ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk)); >+ ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk->getRenderer())); >+ >+ *bufferOut = &mDynamicIndexBuffer; >+ > return angle::Result::Continue; > } > >@@ -3625,24 +3716,20 @@ angle::Result LineLoopHelper::streamIndices(ContextVk *contextVk, > GLsizei indexCount, > const uint8_t *srcPtr, > BufferHelper **bufferOut, >- VkDeviceSize *bufferOffsetOut, > uint32_t *indexCountOut) > { > size_t unitSize = contextVk->getVkIndexTypeSize(glIndexType); > >- uint8_t *indices = nullptr; >- > uint32_t numOutIndices = indexCount + 1; > if (contextVk->getState().isPrimitiveRestartEnabled()) > { > numOutIndices = GetLineLoopWithRestartIndexCount(glIndexType, indexCount, srcPtr); > } >- *indexCountOut = numOutIndices; >- size_t allocateBytes = unitSize * numOutIndices; >- ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes, >- reinterpret_cast<uint8_t **>(&indices), nullptr, >- bufferOffsetOut, nullptr)); >- *bufferOut = mDynamicIndexBuffer.getCurrentBuffer(); >+ *indexCountOut = numOutIndices; >+ >+ ANGLE_TRY(mDynamicIndexBuffer.allocateForVertexConversion(contextVk, unitSize * numOutIndices, >+ MemoryHostVisibility::Visible)); >+ uint8_t *indices = mDynamicIndexBuffer.getMappedMemory(); > > if (contextVk->getState().isPrimitiveRestartEnabled()) > { >@@ -3670,20 +3757,20 @@ angle::Result LineLoopHelper::streamIndices(ContextVk *contextVk, > } > } > >- ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk)); >+ ANGLE_TRY(mDynamicIndexBuffer.flush(contextVk->getRenderer())); >+ >+ *bufferOut = &mDynamicIndexBuffer; >+ > return angle::Result::Continue; > } > > angle::Result LineLoopHelper::streamIndicesIndirect(ContextVk *contextVk, > gl::DrawElementsType glIndexType, > BufferHelper *indexBuffer, >- VkDeviceSize indexBufferOffset, > BufferHelper *indirectBuffer, > VkDeviceSize indirectBufferOffset, > BufferHelper **indexBufferOut, >- VkDeviceSize *indexBufferOffsetOut, >- BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut) >+ BufferHelper **indirectBufferOut) > { > size_t unitSize = contextVk->getVkIndexTypeSize(glIndexType); > size_t allocateBytes = static_cast<size_t>(indexBuffer->getSize() + unitSize); >@@ -3702,33 +3789,29 @@ angle::Result LineLoopHelper::streamIndicesIndirect(ContextVk *contextVk, > allocateBytes = static_cast<size_t>(numNewInputIndices * unitSize); > } > >- mDynamicIndexBuffer.releaseInFlightBuffers(contextVk); >- mDynamicIndirectBuffer.releaseInFlightBuffers(contextVk); >+ // Allocate buffer for results >+ ANGLE_TRY(mDynamicIndexBuffer.allocateForVertexConversion(contextVk, allocateBytes, >+ MemoryHostVisibility::Visible)); >+ ANGLE_TRY(mDynamicIndirectBuffer.allocateForVertexConversion( >+ contextVk, sizeof(VkDrawIndexedIndirectCommand), MemoryHostVisibility::Visible)); > >- ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes, nullptr, nullptr, >- indexBufferOffsetOut, nullptr)); >- *indexBufferOut = mDynamicIndexBuffer.getCurrentBuffer(); >+ *indexBufferOut = &mDynamicIndexBuffer; >+ *indirectBufferOut = &mDynamicIndirectBuffer; > >- ANGLE_TRY(mDynamicIndirectBuffer.allocate(contextVk, sizeof(VkDrawIndexedIndirectCommand), >- nullptr, nullptr, indirectBufferOffsetOut, nullptr)); >- *indirectBufferOut = mDynamicIndirectBuffer.getCurrentBuffer(); >- >- BufferHelper *destIndexBuffer = mDynamicIndexBuffer.getCurrentBuffer(); >- BufferHelper *destIndirectBuffer = mDynamicIndirectBuffer.getCurrentBuffer(); >+ BufferHelper *dstIndexBuffer = &mDynamicIndexBuffer; >+ BufferHelper *dstIndirectBuffer = &mDynamicIndirectBuffer; > > // Copy relevant section of the source into destination at allocated offset. Note that the > // offset returned by allocate() above is in bytes. As is the indices offset pointer. > UtilsVk::ConvertLineLoopIndexIndirectParameters params = {}; > params.indirectBufferOffset = static_cast<uint32_t>(indirectBufferOffset); >- params.dstIndirectBufferOffset = static_cast<uint32_t>(*indirectBufferOffsetOut); >- params.srcIndexBufferOffset = static_cast<uint32_t>(indexBufferOffset); >- params.dstIndexBufferOffset = static_cast<uint32_t>(*indexBufferOffsetOut); >+ params.dstIndirectBufferOffset = 0; >+ params.srcIndexBufferOffset = 0; >+ params.dstIndexBufferOffset = 0; > params.indicesBitsWidth = static_cast<uint32_t>(unitSize * 8); > >- ANGLE_TRY(contextVk->getUtils().convertLineLoopIndexIndirectBuffer( >- contextVk, indirectBuffer, destIndirectBuffer, destIndexBuffer, indexBuffer, params)); >- >- return angle::Result::Continue; >+ return contextVk->getUtils().convertLineLoopIndexIndirectBuffer( >+ contextVk, indirectBuffer, dstIndirectBuffer, dstIndexBuffer, indexBuffer, params); > } > > angle::Result LineLoopHelper::streamArrayIndirect(ContextVk *contextVk, >@@ -3736,39 +3819,30 @@ angle::Result LineLoopHelper::streamArrayIndirect(ContextVk *contextVk, > BufferHelper *arrayIndirectBuffer, > VkDeviceSize arrayIndirectBufferOffset, > BufferHelper **indexBufferOut, >- VkDeviceSize *indexBufferOffsetOut, >- BufferHelper **indexIndirectBufferOut, >- VkDeviceSize *indexIndirectBufferOffsetOut) >+ BufferHelper **indexIndirectBufferOut) > { > auto unitSize = sizeof(uint32_t); > size_t allocateBytes = static_cast<size_t>((vertexCount + 1) * unitSize); > >- mDynamicIndexBuffer.releaseInFlightBuffers(contextVk); >- mDynamicIndirectBuffer.releaseInFlightBuffers(contextVk); >- >- ANGLE_TRY(mDynamicIndexBuffer.allocate(contextVk, allocateBytes, nullptr, nullptr, >- indexBufferOffsetOut, nullptr)); >- *indexBufferOut = mDynamicIndexBuffer.getCurrentBuffer(); >+ ANGLE_TRY(mDynamicIndexBuffer.allocateForVertexConversion(contextVk, allocateBytes, >+ MemoryHostVisibility::Visible)); >+ ANGLE_TRY(mDynamicIndirectBuffer.allocateForVertexConversion( >+ contextVk, sizeof(VkDrawIndexedIndirectCommand), MemoryHostVisibility::Visible)); > >- ANGLE_TRY(mDynamicIndirectBuffer.allocate(contextVk, sizeof(VkDrawIndexedIndirectCommand), >- nullptr, nullptr, indexIndirectBufferOffsetOut, >- nullptr)); >- *indexIndirectBufferOut = mDynamicIndirectBuffer.getCurrentBuffer(); >+ *indexBufferOut = &mDynamicIndexBuffer; >+ *indexIndirectBufferOut = &mDynamicIndirectBuffer; > >- BufferHelper *destIndexBuffer = mDynamicIndexBuffer.getCurrentBuffer(); >- BufferHelper *destIndirectBuffer = mDynamicIndirectBuffer.getCurrentBuffer(); >+ BufferHelper *dstIndexBuffer = &mDynamicIndexBuffer; >+ BufferHelper *dstIndirectBuffer = &mDynamicIndirectBuffer; > > // Copy relevant section of the source into destination at allocated offset. Note that the > // offset returned by allocate() above is in bytes. As is the indices offset pointer. > UtilsVk::ConvertLineLoopArrayIndirectParameters params = {}; > params.indirectBufferOffset = static_cast<uint32_t>(arrayIndirectBufferOffset); >- params.dstIndirectBufferOffset = static_cast<uint32_t>(*indexIndirectBufferOffsetOut); >- params.dstIndexBufferOffset = static_cast<uint32_t>(*indexBufferOffsetOut); >- >- ANGLE_TRY(contextVk->getUtils().convertLineLoopArrayIndirectBuffer( >- contextVk, arrayIndirectBuffer, destIndirectBuffer, destIndexBuffer, params)); >- >- return angle::Result::Continue; >+ params.dstIndirectBufferOffset = 0; >+ params.dstIndexBufferOffset = 0; >+ return contextVk->getUtils().convertLineLoopArrayIndirectBuffer( >+ contextVk, arrayIndirectBuffer, dstIndirectBuffer, dstIndexBuffer, params); > } > > void LineLoopHelper::release(ContextVk *contextVk) >@@ -3784,7 +3858,9 @@ void LineLoopHelper::destroy(RendererVk *renderer) > } > > // static >-void LineLoopHelper::Draw(uint32_t count, uint32_t baseVertex, CommandBuffer *commandBuffer) >+void LineLoopHelper::Draw(uint32_t count, >+ uint32_t baseVertex, >+ RenderPassCommandBuffer *commandBuffer) > { > // Our first index is always 0 because that's how we set it up in createIndexBuffer*. > commandBuffer->drawIndexedBaseVertex(count, baseVertex); >@@ -3807,9 +3883,7 @@ void PipelineBarrier::addDiagnosticsString(std::ostringstream &out) const > > // BufferHelper implementation. > BufferHelper::BufferHelper() >- : mMemoryPropertyFlags{}, >- mSize(0), >- mCurrentQueueFamilyIndex(std::numeric_limits<uint32_t>::max()), >+ : mCurrentQueueFamilyIndex(std::numeric_limits<uint32_t>::max()), > mCurrentWriteAccess(0), > mCurrentReadAccess(0), > mCurrentWriteStages(0), >@@ -3819,14 +3893,36 @@ BufferHelper::BufferHelper() > > BufferHelper::~BufferHelper() = default; > >-angle::Result BufferHelper::init(ContextVk *contextVk, >+BufferHelper::BufferHelper(BufferHelper &&other) >+{ >+ *this = std::move(other); >+} >+ >+BufferHelper &BufferHelper::operator=(BufferHelper &&other) >+{ >+ ReadWriteResource::operator=(std::move(other)); >+ >+ mMemory = std::move(other.mMemory); >+ mSuballocation = std::move(other.mSuballocation); >+ >+ mCurrentQueueFamilyIndex = other.mCurrentQueueFamilyIndex; >+ mCurrentWriteAccess = other.mCurrentWriteAccess; >+ mCurrentReadAccess = other.mCurrentReadAccess; >+ mCurrentWriteStages = other.mCurrentWriteStages; >+ mCurrentReadStages = other.mCurrentReadStages; >+ mSerial = other.mSerial; >+ >+ return *this; >+} >+ >+angle::Result BufferHelper::init(vk::Context *context, > const VkBufferCreateInfo &requestedCreateInfo, > VkMemoryPropertyFlags memoryPropertyFlags) > { >- RendererVk *renderer = contextVk->getRenderer(); >+ RendererVk *renderer = context->getRenderer(); >+ const Allocator &allocator = renderer->getAllocator(); > >- mSerial = renderer->getResourceSerialFactory().generateBufferSerial(); >- mSize = requestedCreateInfo.size; >+ initializeBarrierTracker(context); > > VkBufferCreateInfo modifiedCreateInfo; > const VkBufferCreateInfo *createInfo = &requestedCreateInfo; >@@ -3845,33 +3941,42 @@ angle::Result BufferHelper::init(ContextVk *contextVk, > VkMemoryPropertyFlags preferredFlags = > (memoryPropertyFlags & (~VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)); > >- BufferMemoryAllocator &bufferMemoryAllocator = renderer->getBufferMemoryAllocator(); > bool persistentlyMapped = renderer->getFeatures().persistentlyMappedBuffers.enabled; > > // Check that the allocation is not too large. > uint32_t memoryTypeIndex = kInvalidMemoryTypeIndex; >- ANGLE_VK_TRY(contextVk, bufferMemoryAllocator.findMemoryTypeIndexForBufferInfo( >- renderer, *createInfo, requiredFlags, preferredFlags, >- persistentlyMapped, &memoryTypeIndex)); >+ ANGLE_VK_TRY(context, allocator.findMemoryTypeIndexForBufferInfo( >+ *createInfo, requiredFlags, preferredFlags, persistentlyMapped, >+ &memoryTypeIndex)); > > VkDeviceSize heapSize = > renderer->getMemoryProperties().getHeapSizeForMemoryType(memoryTypeIndex); > >- ANGLE_VK_CHECK(contextVk, createInfo->size <= heapSize, VK_ERROR_OUT_OF_DEVICE_MEMORY); >+ ANGLE_VK_CHECK(context, createInfo->size <= heapSize, VK_ERROR_OUT_OF_DEVICE_MEMORY); > >- ANGLE_VK_TRY(contextVk, bufferMemoryAllocator.createBuffer(renderer, *createInfo, requiredFlags, >- preferredFlags, persistentlyMapped, >- &memoryTypeIndex, &mBuffer, >- mMemory.getMemoryObject())); >- bufferMemoryAllocator.getMemoryTypeProperties(renderer, memoryTypeIndex, &mMemoryPropertyFlags); >- mCurrentQueueFamilyIndex = renderer->getQueueFamilyIndex(); >+ // Allocate buffer object >+ DeviceScoped<Buffer> buffer(renderer->getDevice()); >+ AllocatorScoped<Allocation> allocation(renderer->getAllocator()); >+ ANGLE_VK_TRY(context, allocator.createBuffer(*createInfo, requiredFlags, preferredFlags, >+ persistentlyMapped, &memoryTypeIndex, >+ &buffer.get(), &allocation.get())); >+ VkMemoryPropertyFlags memoryPropertyFlagsOut; >+ allocator.getMemoryTypeProperties(memoryTypeIndex, &memoryPropertyFlagsOut); > >- if (renderer->getFeatures().allocateNonZeroMemory.enabled) >+ ANGLE_VK_TRY(context, mSuballocation.initWithEntireBuffer( >+ context, buffer.get(), allocation.get(), memoryPropertyFlagsOut, >+ requestedCreateInfo.size)); >+ >+ if (isHostVisible()) > { >- ANGLE_TRY(initializeNonZeroMemory(contextVk, createInfo->usage, createInfo->size)); >+ uint8_t *ptrOut; >+ ANGLE_TRY(map(context, &ptrOut)); > } > >- ANGLE_TRY(mMemory.init()); >+ if (renderer->getFeatures().allocateNonZeroMemory.enabled) >+ { >+ ANGLE_TRY(initializeNonZeroMemory(context, createInfo->usage, createInfo->size)); >+ } > > return angle::Result::Continue; > } >@@ -3885,8 +3990,7 @@ angle::Result BufferHelper::initExternal(ContextVk *contextVk, > > RendererVk *renderer = contextVk->getRenderer(); > >- mSerial = renderer->getResourceSerialFactory().generateBufferSerial(); >- mSize = requestedCreateInfo.size; >+ initializeBarrierTracker(contextVk); > > VkBufferCreateInfo modifiedCreateInfo = requestedCreateInfo; > VkExternalMemoryBufferCreateInfo externCreateInfo = {}; >@@ -3896,27 +4000,39 @@ angle::Result BufferHelper::initExternal(ContextVk *contextVk, > externCreateInfo.pNext = nullptr; > modifiedCreateInfo.pNext = &externCreateInfo; > >- ANGLE_VK_TRY(contextVk, mBuffer.init(renderer->getDevice(), modifiedCreateInfo)); >+ DeviceScoped<Buffer> buffer(renderer->getDevice()); >+ ANGLE_VK_TRY(contextVk, buffer.get().init(renderer->getDevice(), modifiedCreateInfo)); > >- ANGLE_TRY(InitAndroidExternalMemory(contextVk, clientBuffer, memoryProperties, &mBuffer, >- &mMemoryPropertyFlags, mMemory.getExternalMemoryObject())); >+ VkMemoryPropertyFlags memoryPropertyFlagsOut; >+ ANGLE_TRY(InitAndroidExternalMemory(contextVk, clientBuffer, memoryProperties, &buffer.get(), >+ &memoryPropertyFlagsOut, >+ mMemory.getExternalMemoryObject())); > > ANGLE_TRY(mMemory.initExternal(clientBuffer)); > >- mCurrentQueueFamilyIndex = renderer->getQueueFamilyIndex(); >+ ANGLE_VK_TRY(contextVk, mSuballocation.initWithEntireBuffer( >+ contextVk, buffer.get(), *mMemory.getMemoryObject(), >+ memoryPropertyFlagsOut, requestedCreateInfo.size)); >+ >+ if (isHostVisible()) >+ { >+ uint8_t *ptrOut; >+ ANGLE_TRY(map(contextVk, &ptrOut)); >+ } > > return angle::Result::Continue; > } > >-angle::Result BufferHelper::initSubAllocation(ContextVk *contextVk, >+angle::Result BufferHelper::initSuballocation(ContextVk *contextVk, > uint32_t memoryTypeIndex, > size_t size, > size_t alignment) > { > RendererVk *renderer = contextVk->getRenderer(); > >- mSerial = renderer->getResourceSerialFactory().generateBufferSerial(); >- mSize = size; >+ // We should reset these in case the BufferHelper object has been released and called >+ // initSuballocation again. >+ initializeBarrierTracker(contextVk); > > if (renderer->getFeatures().padBuffersToMaxVertexAttribStride.enabled) > { >@@ -3925,15 +4041,8 @@ angle::Result BufferHelper::initSubAllocation(ContextVk *contextVk, > size += maxVertexAttribStride; > } > >- vk::BufferPool *pool = contextVk->getDefaultBufferPool(memoryTypeIndex); >- ANGLE_TRY(pool->allocateBuffer(contextVk, mSize, alignment, &mSubAllocation)); >- >- mMemoryPropertyFlags = mSubAllocation.getBlock()->getMemoryPropertyFlags(); >- mCurrentQueueFamilyIndex = renderer->getQueueFamilyIndex(); >- >- // For sub-allocated buffer, we do not own the actual buffer. The BufferBlock object owns it. We >- // still set the mBuffer for convenience so that other APIs will still work. >- mBuffer.setHandle(mSubAllocation.getBuffer().getHandle()); >+ vk::BufferPool *pool = contextVk->getDefaultBufferPool(size, memoryTypeIndex); >+ ANGLE_TRY(pool->allocateBuffer(contextVk, size, alignment, &mSuballocation)); > > if (renderer->getFeatures().allocateNonZeroMemory.enabled) > { >@@ -3943,6 +4052,94 @@ angle::Result BufferHelper::initSubAllocation(ContextVk *contextVk, > return angle::Result::Continue; > } > >+angle::Result BufferHelper::allocateForCopyBuffer(ContextVk *contextVk, >+ size_t size, >+ MemoryCoherency coherency) >+{ >+ RendererVk *renderer = contextVk->getRenderer(); >+ uint32_t memoryTypeIndex = renderer->getStagingBufferMemoryTypeIndex(coherency); >+ size_t alignment = renderer->getStagingBufferAlignment(); >+ return initSuballocation(contextVk, memoryTypeIndex, size, alignment); >+} >+ >+angle::Result BufferHelper::allocateForVertexConversion(ContextVk *contextVk, >+ size_t size, >+ MemoryHostVisibility hostVisibility) >+{ >+ RendererVk *renderer = contextVk->getRenderer(); >+ >+ if (valid()) >+ { >+ // If size is big enough and it is idle, then just reuse the existing buffer. >+ if (size <= getSize() && >+ (hostVisibility == MemoryHostVisibility::Visible) == isHostVisible()) >+ { >+ if (!isCurrentlyInUse(contextVk->getLastCompletedQueueSerial())) >+ { >+ initializeBarrierTracker(contextVk); >+ return angle::Result::Continue; >+ } >+ else if (hostVisibility == MemoryHostVisibility::NonVisible) >+ { >+ // For device local buffer, we can reuse the buffer even if it is still GPU busy. >+ // The memory barrier should take care of this. >+ return angle::Result::Continue; >+ } >+ } >+ >+ release(renderer); >+ } >+ >+ uint32_t memoryTypeIndex = renderer->getVertexConversionBufferMemoryTypeIndex(hostVisibility); >+ size_t alignment = static_cast<size_t>(renderer->getVertexConversionBufferAlignment()); >+ >+ // The size is retrieved and used in descriptor set. The descriptor set wants aligned size, >+ // otherwise there are test failures. Note that underline VMA allocation always allocate aligned >+ // size anyway. >+ size_t sizeToAllocate = roundUp(size, alignment); >+ >+ return initSuballocation(contextVk, memoryTypeIndex, sizeToAllocate, alignment); >+} >+ >+angle::Result BufferHelper::allocateForCopyImage(ContextVk *contextVk, >+ size_t size, >+ MemoryCoherency coherency, >+ angle::FormatID formatId, >+ VkDeviceSize *offset, >+ uint8_t **dataPtr) >+{ >+ RendererVk *renderer = contextVk->getRenderer(); >+ >+ // When a buffer is used in copyImage, the offset must be multiple of pixel bytes. This may >+ // result in non-power of two alignment. VMA's virtual allocator can not handle non-power of two >+ // alignment. We have to adjust offset manually. >+ uint32_t memoryTypeIndex = renderer->getStagingBufferMemoryTypeIndex(coherency); >+ size_t imageCopyAlignment = GetImageCopyBufferAlignment(formatId); >+ >+ // Add extra padding for potential offset alignment >+ size_t allocationSize = size + imageCopyAlignment; >+ allocationSize = roundUp(allocationSize, imageCopyAlignment); >+ size_t stagingAlignment = static_cast<size_t>(renderer->getStagingBufferAlignment()); >+ >+ ANGLE_TRY(initSuballocation(contextVk, memoryTypeIndex, allocationSize, stagingAlignment)); >+ >+ *offset = roundUp(getOffset(), static_cast<VkDeviceSize>(imageCopyAlignment)); >+ *dataPtr = getMappedMemory() + (*offset) - getOffset(); >+ >+ return angle::Result::Continue; >+} >+ >+ANGLE_INLINE void BufferHelper::initializeBarrierTracker(Context *context) >+{ >+ RendererVk *renderer = context->getRenderer(); >+ mCurrentQueueFamilyIndex = renderer->getQueueFamilyIndex(); >+ mSerial = renderer->getResourceSerialFactory().generateBufferSerial(); >+ mCurrentWriteAccess = 0; >+ mCurrentReadAccess = 0; >+ mCurrentWriteStages = 0; >+ mCurrentReadStages = 0; >+} >+ > angle::Result BufferHelper::initializeNonZeroMemory(Context *context, > VkBufferUsageFlags usage, > VkDeviceSize size) >@@ -3968,7 +4165,7 @@ angle::Result BufferHelper::initializeNonZeroMemory(Context *context, > copyRegion.dstOffset = 0; > copyRegion.size = size; > >- commandBuffer.copyBuffer(stagingBuffer.getBuffer(), mBuffer, 1, ©Region); >+ commandBuffer.copyBuffer(stagingBuffer.getBuffer(), getBuffer(), 1, ©Region); > > Serial serial; > ANGLE_TRY(renderer->queueSubmitOneOff(context, std::move(commandBuffer), false, >@@ -3987,19 +4184,11 @@ angle::Result BufferHelper::initializeNonZeroMemory(Context *context, > // Can map the memory. > // Pick an arbitrary value to initialize non-zero memory for sanitization. > constexpr int kNonZeroInitValue = 55; >- if (mSubAllocation.valid()) >- { >- uint8_t *mapPointer = mSubAllocation.getMappedMemory(); >- memset(mapPointer, kNonZeroInitValue, static_cast<size_t>(mSize)); >- if ((mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0) >- { >- mSubAllocation.flush(allocator); >- } >- } >- else >+ uint8_t *mapPointer = mSuballocation.getMappedMemory(); >+ memset(mapPointer, kNonZeroInitValue, static_cast<size_t>(getSize())); >+ if (!isCoherent()) > { >- ANGLE_TRY(InitMappableAllocation(context, allocator, mMemory.getMemoryObject(), mSize, >- kNonZeroInitValue, mMemoryPropertyFlags)); >+ mSuballocation.flush(allocator); > } > } > >@@ -4008,37 +4197,18 @@ angle::Result BufferHelper::initializeNonZeroMemory(Context *context, > > void BufferHelper::destroy(RendererVk *renderer) > { >- VkDevice device = renderer->getDevice(); > unmap(renderer); >- mSize = 0; > >- if (mSubAllocation.valid()) >- { >- mSubAllocation.destroy(device); >- } >- else >- { >- mBuffer.destroy(device); >- mMemory.destroy(renderer); >- } >+ mSuballocation.destroy(renderer); >+ mMemory.destroy(renderer); > } > > void BufferHelper::release(RendererVk *renderer) > { > unmap(renderer); >- mSize = 0; > >- if (mSubAllocation.valid()) >- { >- // For sub-allocated buffer, we do not own the actual VkBuffer. The BufferPool owns it. >- mBuffer.release(); >- renderer->collectGarbageAndReinit(&mReadOnlyUse, &mSubAllocation); >- } >- else >- { >- renderer->collectGarbageAndReinit( >- &mReadOnlyUse, &mBuffer, mMemory.getExternalMemoryObject(), mMemory.getMemoryObject()); >- } >+ renderer->collectGarbageAndReinit(&mReadOnlyUse, &mSuballocation, >+ mMemory.getExternalMemoryObject(), mMemory.getMemoryObject()); > > mReadWriteUse.release(); > mReadWriteUse.init(); >@@ -4061,24 +4231,27 @@ angle::Result BufferHelper::copyFromBuffer(ContextVk *contextVk, > access.onBufferTransferWrite(this); > } > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > >- commandBuffer->copyBuffer(srcBuffer->getBuffer(), mBuffer, regionCount, copyRegions); >+ commandBuffer->copyBuffer(srcBuffer->getBuffer(), getBuffer(), regionCount, copyRegions); > > return angle::Result::Continue; > } > >-angle::Result BufferHelper::map(ContextVk *contextVk, uint8_t **ptrOut) >+angle::Result BufferHelper::map(Context *context, uint8_t **ptrOut) > { >- if (mSubAllocation.valid()) >+ if (isExternalBuffer()) > { >- *ptrOut = mSubAllocation.getMappedMemory(); >+ ANGLE_TRY(mMemory.map(context, getSize(), ptrOut)); > } > else > { >- ANGLE_TRY(mMemory.map(contextVk, mSize, ptrOut)); >- *ptrOut += getOffset(); >+ if (!mSuballocation.isMapped()) >+ { >+ ANGLE_TRY(mSuballocation.getBlock()->map(context)); >+ } >+ *ptrOut = mSuballocation.getMappedMemory(); > } > return angle::Result::Continue; > } >@@ -4093,7 +4266,7 @@ angle::Result BufferHelper::mapWithOffset(ContextVk *contextVk, uint8_t **ptrOut > > void BufferHelper::unmap(RendererVk *renderer) > { >- if (!mSubAllocation.valid()) >+ if (isExternalBuffer()) > { > mMemory.unmap(renderer); > } >@@ -4101,49 +4274,46 @@ void BufferHelper::unmap(RendererVk *renderer) > > angle::Result BufferHelper::flush(RendererVk *renderer, VkDeviceSize offset, VkDeviceSize size) > { >- if (mSubAllocation.valid()) >+ if (isExternalBuffer()) > { >- mSubAllocation.flush(renderer->getAllocator()); >+ if (!isCoherent()) >+ { >+ mMemory.flush(renderer, offset, size); >+ } > } > else > { >- bool hostVisible = mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; >- bool hostCoherent = mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; >- if (hostVisible && !hostCoherent) >- { >- mMemory.flush(renderer, mMemoryPropertyFlags, getOffset() + offset, size); >- } >+ mSuballocation.flush(renderer->getAllocator()); > } > return angle::Result::Continue; > } > angle::Result BufferHelper::flush(RendererVk *renderer) > { >- return flush(renderer, 0, mSize); >+ return flush(renderer, 0, getSize()); > } > > angle::Result BufferHelper::invalidate(RendererVk *renderer, VkDeviceSize offset, VkDeviceSize size) > { >- if (mSubAllocation.valid()) >+ if (isExternalBuffer()) > { >- mSubAllocation.invalidate(renderer->getAllocator()); >+ if (!isCoherent()) >+ { >+ mMemory.invalidate(renderer, getMemoryPropertyFlags(), offset, size); >+ } > } > else > { >- bool hostVisible = mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; >- bool hostCoherent = mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; >- if (hostVisible && !hostCoherent) >- { >- mMemory.invalidate(renderer, mMemoryPropertyFlags, getOffset() + offset, size); >- } >+ mSuballocation.invalidate(renderer->getAllocator()); > } > return angle::Result::Continue; > } > angle::Result BufferHelper::invalidate(RendererVk *renderer) > { >- return invalidate(renderer, 0, mSize); >+ return invalidate(renderer, 0, getSize()); > } > >-void BufferHelper::changeQueue(uint32_t newQueueFamilyIndex, CommandBuffer *commandBuffer) >+void BufferHelper::changeQueue(uint32_t newQueueFamilyIndex, >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > VkBufferMemoryBarrier bufferMemoryBarrier = {}; > bufferMemoryBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; >@@ -4151,9 +4321,9 @@ void BufferHelper::changeQueue(uint32_t newQueueFamilyIndex, CommandBuffer *comm > bufferMemoryBarrier.dstAccessMask = 0; > bufferMemoryBarrier.srcQueueFamilyIndex = mCurrentQueueFamilyIndex; > bufferMemoryBarrier.dstQueueFamilyIndex = newQueueFamilyIndex; >- bufferMemoryBarrier.buffer = mBuffer.getHandle(); >+ bufferMemoryBarrier.buffer = getBuffer().getHandle(); > bufferMemoryBarrier.offset = getOffset(); >- bufferMemoryBarrier.size = mSize; >+ bufferMemoryBarrier.size = getSize(); > > commandBuffer->bufferBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, > VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, &bufferMemoryBarrier); >@@ -4164,7 +4334,7 @@ void BufferHelper::changeQueue(uint32_t newQueueFamilyIndex, CommandBuffer *comm > void BufferHelper::acquireFromExternal(ContextVk *contextVk, > uint32_t externalQueueFamilyIndex, > uint32_t rendererQueueFamilyIndex, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > mCurrentQueueFamilyIndex = externalQueueFamilyIndex; > >@@ -4175,7 +4345,7 @@ void BufferHelper::acquireFromExternal(ContextVk *contextVk, > void BufferHelper::releaseToExternal(ContextVk *contextVk, > uint32_t rendererQueueFamilyIndex, > uint32_t externalQueueFamilyIndex, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > ASSERT(mCurrentQueueFamilyIndex == rendererQueueFamilyIndex); > >@@ -4238,6 +4408,52 @@ bool BufferHelper::recordWriteBarrier(VkAccessFlags writeAccessType, > return barrierModified; > } > >+void BufferHelper::fillWithColor(const angle::Color<uint8_t> &color, >+ const gl::InternalFormat &internalFormat) >+{ >+ uint32_t count = >+ static_cast<uint32_t>(getSize()) / static_cast<uint32_t>(internalFormat.pixelBytes); >+ void *buffer = static_cast<void *>(getMappedMemory()); >+ >+ switch (internalFormat.internalFormat) >+ { >+ case GL_RGB565: >+ { >+ uint16_t pixelColor = >+ ((color.blue & 0xF8) << 11) | ((color.green & 0xFC) << 5) | (color.red & 0xF8); >+ uint16_t *pixelPtr = static_cast<uint16_t *>(buffer); >+ std::fill_n<uint16_t *, uint32_t, uint16_t>(pixelPtr, count, pixelColor); >+ } >+ break; >+ case GL_RGBA8: >+ { >+ uint32_t pixelColor = >+ (color.alpha << 24) | (color.blue << 16) | (color.green << 8) | (color.red); >+ uint32_t *pixelPtr = static_cast<uint32_t *>(buffer); >+ std::fill_n<uint32_t *, uint32_t, uint32_t>(pixelPtr, count, pixelColor); >+ } >+ break; >+ case GL_BGR565_ANGLEX: >+ { >+ uint16_t pixelColor = >+ ((color.red & 0xF8) << 11) | ((color.green & 0xFC) << 5) | (color.blue & 0xF8); >+ uint16_t *pixelPtr = static_cast<uint16_t *>(buffer); >+ std::fill_n<uint16_t *, uint32_t, uint16_t>(pixelPtr, count, pixelColor); >+ } >+ break; >+ case GL_BGRA8_EXT: >+ { >+ uint32_t pixelColor = >+ (color.alpha << 24) | (color.red << 16) | (color.green << 8) | (color.blue); >+ uint32_t *pixelPtr = static_cast<uint32_t *>(buffer); >+ std::fill_n<uint32_t *, uint32_t, uint32_t>(pixelPtr, count, pixelColor); >+ } >+ break; >+ default: >+ UNREACHABLE(); // Unsupported format >+ } >+} >+ > // ImageHelper implementation. > ImageHelper::ImageHelper() > { >@@ -4266,7 +4482,6 @@ ImageHelper::ImageHelper(ImageHelper &&other) > mFirstAllocatedLevel(other.mFirstAllocatedLevel), > mLayerCount(other.mLayerCount), > mLevelCount(other.mLevelCount), >- mStagingBuffer(std::move(other.mStagingBuffer)), > mSubresourceUpdates(std::move(other.mSubresourceUpdates)), > mCurrentSingleClearValue(std::move(other.mCurrentSingleClearValue)), > mContentDefined(std::move(other.mContentDefined)), >@@ -4384,15 +4599,6 @@ const ImageHelper::LevelContentDefinedMask &ImageHelper::getLevelStencilContentD > return mStencilContentDefined[level.get()]; > } > >-void ImageHelper::initStagingBuffer(RendererVk *renderer, >- size_t imageCopyBufferAlignment, >- VkBufferUsageFlags usageFlags, >- size_t initialSize) >-{ >- mStagingBuffer.init(renderer, usageFlags, imageCopyBufferAlignment, initialSize, true, >- DynamicBufferPolicy::OneShotUse); >-} >- > angle::Result ImageHelper::init(Context *context, > gl::TextureType textureType, > const VkExtent3D &extents, >@@ -4656,9 +4862,9 @@ void ImageHelper::releaseImageFromShareContexts(RendererVk *renderer, ContextVk > releaseImage(renderer); > } > >-void ImageHelper::releaseStagingBuffer(RendererVk *renderer) >+void ImageHelper::releaseStagedUpdates(RendererVk *renderer) > { >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > > // Remove updates that never made it to the texture. > for (std::vector<SubresourceUpdate> &levelUpdates : mSubresourceUpdates) >@@ -4669,9 +4875,8 @@ void ImageHelper::releaseStagingBuffer(RendererVk *renderer) > } > } > >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > >- mStagingBuffer.release(renderer); > mSubresourceUpdates.clear(); > mCurrentSingleClearValue.reset(); > } >@@ -4900,7 +5105,7 @@ angle::Result ImageHelper::initLayerImageView(Context *context, > > return initLayerImageViewImpl(context, textureType, aspectMask, swizzleMap, imageViewOut, > baseMipLevelVk, levelCount, baseArrayLayer, layerCount, >- GetVkFormatFromFormatID(actualFormat), nullptr); >+ GetVkFormatFromFormatID(actualFormat), nullptr, nullptr); > } > > angle::Result ImageHelper::initLayerImageViewWithFormat(Context *context, >@@ -4912,11 +5117,12 @@ angle::Result ImageHelper::initLayerImageViewWithFormat(Context *context, > LevelIndex baseMipLevelVk, > uint32_t levelCount, > uint32_t baseArrayLayer, >- uint32_t layerCount) const >+ uint32_t layerCount, >+ const gl::SamplerState &samplerState) const > { > return initLayerImageViewImpl(context, textureType, aspectMask, swizzleMap, imageViewOut, > baseMipLevelVk, levelCount, baseArrayLayer, layerCount, >- imageFormat, nullptr); >+ imageFormat, nullptr, &samplerState); > } > > angle::Result ImageHelper::initLayerImageViewImpl( >@@ -4930,7 +5136,8 @@ angle::Result ImageHelper::initLayerImageViewImpl( > uint32_t baseArrayLayer, > uint32_t layerCount, > VkFormat imageFormat, >- const VkImageViewUsageCreateInfo *imageViewUsageCreateInfo) const >+ const VkImageViewUsageCreateInfo *imageViewUsageCreateInfo, >+ const gl::SamplerState *samplerState) const > { > VkImageViewCreateInfo viewInfo = {}; > viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; >@@ -4964,6 +5171,19 @@ angle::Result ImageHelper::initLayerImageViewImpl( > VkSamplerYcbcrConversionInfo yuvConversionInfo = {}; > if (mYcbcrConversionDesc.valid()) > { >+ // VUID-VkSamplerCreateInfo-minFilter VkCreateSampler: >+ // VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT >+ // specifies that the format can have different chroma, min, and mag filters. However, >+ // VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT is >+ // not supported for VkSamplerYcbcrConversionCreateInfo.format = VK_FORMAT_UNDEFINED so >+ // chromaFilter needs to be equal to minFilter/magFilter. >+ if (samplerState && mYcbcrConversionDesc.mIsExternalFormat) >+ { >+ ASSERT(samplerState->getMinFilter() == samplerState->getMagFilter()); >+ const_cast<YcbcrConversionDesc &>(mYcbcrConversionDesc).mChromaFilter = >+ gl_vk::GetFilter(samplerState->getMinFilter()); >+ } >+ > ASSERT((context->getRenderer()->getFeatures().supportsYUVSamplerConversion.enabled)); > yuvConversionInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO; > yuvConversionInfo.pNext = nullptr; >@@ -5002,7 +5222,7 @@ angle::Result ImageHelper::initReinterpretedLayerImageView(Context *context, > return initLayerImageViewImpl(context, textureType, aspectMask, swizzleMap, imageViewOut, > baseMipLevelVk, levelCount, baseArrayLayer, layerCount, > vk::GetVkFormatFromFormatID(imageViewFormat), >- &imageViewUsageCreateInfo); >+ &imageViewUsageCreateInfo, nullptr); > } > > void ImageHelper::destroy(RendererVk *renderer) >@@ -5011,7 +5231,6 @@ void ImageHelper::destroy(RendererVk *renderer) > > mImage.destroy(device); > mDeviceMemory.destroy(device); >- mStagingBuffer.destroy(renderer); > mCurrentLayout = ImageLayout::Undefined; > mImageType = VK_IMAGE_TYPE_2D; > mLayerCount = 0; >@@ -5291,7 +5510,7 @@ void ImageHelper::changeLayoutAndQueue(Context *context, > VkImageAspectFlags aspectMask, > ImageLayout newLayout, > uint32_t newQueueFamilyIndex, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > ASSERT(isQueueChangeNeccesary(newQueueFamilyIndex)); > barrierImpl(context, aspectMask, newLayout, newQueueFamilyIndex, commandBuffer); >@@ -5301,7 +5520,7 @@ void ImageHelper::acquireFromExternal(ContextVk *contextVk, > uint32_t externalQueueFamilyIndex, > uint32_t rendererQueueFamilyIndex, > ImageLayout currentLayout, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > // The image must be newly allocated or have been released to the external > // queue. If this is not the case, it's an application bug, so ASSERT might >@@ -5332,7 +5551,7 @@ void ImageHelper::releaseToExternal(ContextVk *contextVk, > uint32_t rendererQueueFamilyIndex, > uint32_t externalQueueFamilyIndex, > ImageLayout desiredLayout, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > ASSERT(mCurrentQueueFamilyIndex == rendererQueueFamilyIndex); > >@@ -5433,12 +5652,11 @@ void ImageHelper::barrierImpl(Context *context, > mCurrentQueueFamilyIndex = newQueueFamilyIndex; > } > >-template void ImageHelper::barrierImpl<rx::vk::priv::CommandBuffer>( >- Context *context, >- VkImageAspectFlags aspectMask, >- ImageLayout newLayout, >- uint32_t newQueueFamilyIndex, >- rx::vk::priv::CommandBuffer *commandBuffer); >+template void ImageHelper::barrierImpl<priv::CommandBuffer>(Context *context, >+ VkImageAspectFlags aspectMask, >+ ImageLayout newLayout, >+ uint32_t newQueueFamilyIndex, >+ priv::CommandBuffer *commandBuffer); > > bool ImageHelper::updateLayoutAndBarrier(Context *context, > VkImageAspectFlags aspectMask, >@@ -5525,7 +5743,7 @@ void ImageHelper::clearColor(const VkClearColorValue &color, > uint32_t levelCount, > uint32_t baseArrayLayer, > uint32_t layerCount, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > ASSERT(valid()); > >@@ -5556,7 +5774,7 @@ void ImageHelper::clearDepthStencil(VkImageAspectFlags clearAspectFlags, > uint32_t levelCount, > uint32_t baseArrayLayer, > uint32_t layerCount, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > ASSERT(valid()); > >@@ -5585,7 +5803,7 @@ void ImageHelper::clear(VkImageAspectFlags aspectFlags, > LevelIndex mipLevel, > uint32_t baseArrayLayer, > uint32_t layerCount, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > const angle::Format &angleFormat = getActualFormat(); > bool isDepthStencil = angleFormat.depthBits > 0 || angleFormat.stencilBits > 0; >@@ -5643,7 +5861,7 @@ void ImageHelper::Copy(ImageHelper *srcImage, > const gl::Extents ©Size, > const VkImageSubresourceLayers &srcSubresource, > const VkImageSubresourceLayers &dstSubresource, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > ASSERT(commandBuffer->valid() && srcImage->valid() && dstImage->valid()); > >@@ -5728,7 +5946,7 @@ angle::Result ImageHelper::CopyImageSubData(const gl::Context *context, > region.dstSubresource.layerCount, VK_IMAGE_ASPECT_COLOR_BIT, > dstImage); > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > ASSERT(srcImage->valid() && dstImage->valid()); >@@ -5778,7 +5996,7 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, > access.onImageTransferWrite(baseLevelGL + 1, maxLevel.get(), 0, mLayerCount, > VK_IMAGE_ASPECT_COLOR_BIT, this); > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > // We are able to use blitImage since the image format we are using supports it. >@@ -5881,7 +6099,7 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, > > void ImageHelper::resolve(ImageHelper *dst, > const VkImageResolve ®ion, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > ASSERT(mCurrentLayout == ImageLayout::TransferSrc || > mCurrentLayout == ImageLayout::SharedPresent); >@@ -5922,7 +6140,7 @@ void ImageHelper::removeStagedUpdates(Context *context, > gl::LevelIndex levelGLStart, > gl::LevelIndex levelGLEnd) > { >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > > // Remove all updates to levels [start, end]. > for (gl::LevelIndex level = levelGLStart; level <= levelGLEnd; ++level) >@@ -5942,7 +6160,7 @@ void ImageHelper::removeStagedUpdates(Context *context, > levelUpdates->clear(); > } > >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > } > > angle::Result ImageHelper::stageSubresourceUpdateImpl(ContextVk *contextVk, >@@ -5951,7 +6169,6 @@ angle::Result ImageHelper::stageSubresourceUpdateImpl(ContextVk *contextVk, > const gl::Offset &offset, > const gl::InternalFormat &formatInfo, > const gl::PixelUnpackState &unpack, >- DynamicBuffer *stagingBufferOverride, > GLenum type, > const uint8_t *pixels, > const Format &vkFormat, >@@ -6054,17 +6271,15 @@ angle::Result ImageHelper::stageSubresourceUpdateImpl(ContextVk *contextVk, > } > } > >- VkBuffer bufferHandle = VK_NULL_HANDLE; >+ std::unique_ptr<RefCounted<BufferHelper>> stagingBuffer = >+ std::make_unique<RefCounted<BufferHelper>>(); >+ BufferHelper *currentBuffer = &stagingBuffer->get(); > >- uint8_t *stagingPointer = nullptr; >- VkDeviceSize stagingOffset = 0; >- // If caller has provided a staging buffer, use it. >- DynamicBuffer *stagingBuffer = stagingBufferOverride ? stagingBufferOverride : &mStagingBuffer; >- size_t alignment = mStagingBuffer.getAlignment(); >- ANGLE_TRY(stagingBuffer->allocateWithAlignment(contextVk, allocationSize, alignment, >- &stagingPointer, &bufferHandle, &stagingOffset, >- nullptr)); >- BufferHelper *currentBuffer = stagingBuffer->getCurrentBuffer(); >+ uint8_t *stagingPointer; >+ VkDeviceSize stagingOffset; >+ ANGLE_TRY(currentBuffer->allocateForCopyImage(contextVk, allocationSize, >+ MemoryCoherency::NonCoherent, storageFormat.id, >+ &stagingOffset, &stagingPointer)); > > const uint8_t *source = pixels + static_cast<ptrdiff_t>(inputSkipBytes); > >@@ -6096,10 +6311,12 @@ angle::Result ImageHelper::stageSubresourceUpdateImpl(ContextVk *contextVk, > gl_vk::GetExtent(yuvInfo.planeExtent[plane], ©.imageExtent); > copy.imageSubresource.baseArrayLayer = 0; > copy.imageSubresource.aspectMask = kPlaneAspectFlags[plane]; >- appendSubresourceUpdate(gl::LevelIndex(0), >- SubresourceUpdate(currentBuffer, copy, storageFormat.id)); >+ appendSubresourceUpdate( >+ gl::LevelIndex(0), >+ SubresourceUpdate(stagingBuffer.get(), currentBuffer, copy, storageFormat.id)); > } > >+ stagingBuffer.release(); > return angle::Result::Continue; > } > >@@ -6157,8 +6374,8 @@ angle::Result ImageHelper::stageSubresourceUpdateImpl(ContextVk *contextVk, > stencilCopy.imageOffset = copy.imageOffset; > stencilCopy.imageExtent = copy.imageExtent; > stencilCopy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; >- appendSubresourceUpdate(updateLevelGL, >- SubresourceUpdate(currentBuffer, stencilCopy, storageFormat.id)); >+ appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(stagingBuffer.get(), currentBuffer, >+ stencilCopy, storageFormat.id)); > > aspectFlags &= ~VK_IMAGE_ASPECT_STENCIL_BIT; > } >@@ -6181,10 +6398,11 @@ angle::Result ImageHelper::stageSubresourceUpdateImpl(ContextVk *contextVk, > if (aspectFlags) > { > copy.imageSubresource.aspectMask = aspectFlags; >- appendSubresourceUpdate(updateLevelGL, >- SubresourceUpdate(currentBuffer, copy, storageFormat.id)); >+ appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(stagingBuffer.get(), currentBuffer, >+ copy, storageFormat.id)); > } > >+ stagingBuffer.release(); > return angle::Result::Continue; > } > >@@ -6192,6 +6410,7 @@ angle::Result ImageHelper::reformatStagedBufferUpdates(ContextVk *contextVk, > angle::FormatID srcFormatID, > angle::FormatID dstFormatID) > { >+ RendererVk *renderer = contextVk->getRenderer(); > const angle::Format &srcFormat = angle::Format::Get(srcFormatID); > const angle::Format &dstFormat = angle::Format::Get(dstFormatID); > const gl::InternalFormat &dstFormatInfo = >@@ -6219,16 +6438,20 @@ angle::Result ImageHelper::reformatStagedBufferUpdates(ContextVk *contextVk, > > // Retrieve source buffer > vk::BufferHelper *srcBuffer = update.data.buffer.bufferHelper; >- uint8_t *srcData = srcBuffer->getMappedMemory() + copy.bufferOffset; >+ uint8_t *srcData = >+ srcBuffer->getBufferBlock()->getMappedMemory() + copy.bufferOffset; > > // Allocate memory with dstFormat >- uint8_t *dstData = nullptr; >- VkBuffer dstBufferHandle = VK_NULL_HANDLE; >- VkDeviceSize dstBufferOffset = 0; >- GLuint dstBufferSize = dstDataDepthPitch * copy.imageExtent.depth; >- ANGLE_TRY(mStagingBuffer.allocate(contextVk, dstBufferSize, &dstData, >- &dstBufferHandle, &dstBufferOffset, nullptr)); >- BufferHelper *dstBuffer = mStagingBuffer.getCurrentBuffer(); >+ std::unique_ptr<RefCounted<BufferHelper>> stagingBuffer = >+ std::make_unique<RefCounted<BufferHelper>>(); >+ BufferHelper *dstBuffer = &stagingBuffer->get(); >+ >+ uint8_t *dstData; >+ VkDeviceSize dstBufferOffset; >+ size_t dstBufferSize = dstDataDepthPitch * copy.imageExtent.depth; >+ ANGLE_TRY(dstBuffer->allocateForCopyImage(contextVk, dstBufferSize, >+ MemoryCoherency::NonCoherent, dstFormatID, >+ &dstBufferOffset, &dstData)); > > rx::PixelReadFunction pixelReadFunction = srcFormat.pixelReadFunction; > rx::PixelWriteFunction pixelWriteFunction = dstFormat.pixelWriteFunction; >@@ -6244,6 +6467,19 @@ angle::Result ImageHelper::reformatStagedBufferUpdates(ContextVk *contextVk, > update.data.buffer.bufferHelper = dstBuffer; > update.data.buffer.formatID = dstFormatID; > update.data.buffer.copyRegion.bufferOffset = dstBufferOffset; >+ >+ // Let update structure owns the staging buffer >+ if (update.refCounted.buffer) >+ { >+ update.refCounted.buffer->releaseRef(); >+ if (!update.refCounted.buffer->isReferenced()) >+ { >+ update.refCounted.buffer->get().release(renderer); >+ SafeDelete(update.refCounted.buffer); >+ } >+ } >+ update.refCounted.buffer = stagingBuffer.release(); >+ update.refCounted.buffer->addRef(); > } > } > } >@@ -6402,7 +6638,6 @@ angle::Result ImageHelper::stageSubresourceUpdate(ContextVk *contextVk, > const gl::Offset &offset, > const gl::InternalFormat &formatInfo, > const gl::PixelUnpackState &unpack, >- DynamicBuffer *stagingBufferOverride, > GLenum type, > const uint8_t *pixels, > const Format &vkFormat, >@@ -6415,8 +6650,8 @@ angle::Result ImageHelper::stageSubresourceUpdate(ContextVk *contextVk, > &inputRowPitch, &inputDepthPitch, &inputSkipBytes)); > > ANGLE_TRY(stageSubresourceUpdateImpl(contextVk, index, glExtents, offset, formatInfo, unpack, >- stagingBufferOverride, type, pixels, vkFormat, access, >- inputRowPitch, inputDepthPitch, inputSkipBytes)); >+ type, pixels, vkFormat, access, inputRowPitch, >+ inputDepthPitch, inputSkipBytes)); > > return angle::Result::Continue; > } >@@ -6426,17 +6661,17 @@ angle::Result ImageHelper::stageSubresourceUpdateAndGetData(ContextVk *contextVk > const gl::ImageIndex &imageIndex, > const gl::Extents &glExtents, > const gl::Offset &offset, >- uint8_t **destData, >- DynamicBuffer *stagingBufferOverride, >+ uint8_t **dstData, > angle::FormatID formatID) > { >- VkBuffer bufferHandle; >- VkDeviceSize stagingOffset = 0; >+ std::unique_ptr<RefCounted<BufferHelper>> stagingBuffer = >+ std::make_unique<RefCounted<BufferHelper>>(); >+ BufferHelper *currentBuffer = &stagingBuffer->get(); > >- DynamicBuffer *stagingBuffer = stagingBufferOverride ? stagingBufferOverride : &mStagingBuffer; >- size_t alignment = mStagingBuffer.getAlignment(); >- ANGLE_TRY(stagingBuffer->allocateWithAlignment(contextVk, allocationSize, alignment, destData, >- &bufferHandle, &stagingOffset, nullptr)); >+ VkDeviceSize stagingOffset; >+ ANGLE_TRY(currentBuffer->allocateForCopyImage(contextVk, allocationSize, >+ MemoryCoherency::NonCoherent, formatID, >+ &stagingOffset, dstData)); > > gl::LevelIndex updateLevelGL(imageIndex.getLevelIndex()); > >@@ -6456,9 +6691,8 @@ angle::Result ImageHelper::stageSubresourceUpdateAndGetData(ContextVk *contextVk > gl_vk::GetOffset(offset, ©.imageOffset); > gl_vk::GetExtent(glExtents, ©.imageExtent); > >- appendSubresourceUpdate(updateLevelGL, >- SubresourceUpdate(stagingBuffer->getCurrentBuffer(), copy, formatID)); >- >+ appendSubresourceUpdate( >+ updateLevelGL, SubresourceUpdate(stagingBuffer.release(), currentBuffer, copy, formatID)); > return angle::Result::Continue; > } > >@@ -6470,8 +6704,7 @@ angle::Result ImageHelper::stageSubresourceUpdateFromFramebuffer( > const gl::Extents &dstExtent, > const gl::InternalFormat &formatInfo, > ImageAccess access, >- FramebufferVk *framebufferVk, >- DynamicBuffer *stagingBufferOverride) >+ FramebufferVk *framebufferVk) > { > ContextVk *contextVk = GetImpl(context); > >@@ -6501,19 +6734,18 @@ angle::Result ImageHelper::stageSubresourceUpdateFromFramebuffer( > size_t outputRowPitch = storageFormat.pixelBytes * clippedRectangle.width; > size_t outputDepthPitch = outputRowPitch * clippedRectangle.height; > >- VkBuffer bufferHandle = VK_NULL_HANDLE; >+ std::unique_ptr<RefCounted<BufferHelper>> stagingBuffer = >+ std::make_unique<RefCounted<BufferHelper>>(); >+ BufferHelper *currentBuffer = &stagingBuffer->get(); > >- uint8_t *stagingPointer = nullptr; >- VkDeviceSize stagingOffset = 0; >+ uint8_t *stagingPointer; >+ VkDeviceSize stagingOffset; > > // The destination is only one layer deep. >- size_t allocationSize = outputDepthPitch; >- DynamicBuffer *stagingBuffer = stagingBufferOverride ? stagingBufferOverride : &mStagingBuffer; >- size_t alignment = mStagingBuffer.getAlignment(); >- ANGLE_TRY(stagingBuffer->allocateWithAlignment(contextVk, allocationSize, alignment, >- &stagingPointer, &bufferHandle, &stagingOffset, >- nullptr)); >- BufferHelper *currentBuffer = stagingBuffer->getCurrentBuffer(); >+ size_t allocationSize = outputDepthPitch; >+ ANGLE_TRY(currentBuffer->allocateForCopyImage(contextVk, allocationSize, >+ MemoryCoherency::NonCoherent, storageFormat.id, >+ &stagingOffset, &stagingPointer)); > > const angle::Format ©Format = > GetFormatFromFormatType(formatInfo.internalFormat, formatInfo.type); >@@ -6565,8 +6797,9 @@ angle::Result ImageHelper::stageSubresourceUpdateFromFramebuffer( > gl_vk::GetExtent(dstExtent, ©ToImage.imageExtent); > > // 3- enqueue the destination image subresource update >- appendSubresourceUpdate(updateLevelGL, >- SubresourceUpdate(currentBuffer, copyToImage, storageFormat.id)); >+ appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(stagingBuffer.release(), currentBuffer, >+ copyToImage, storageFormat.id)); >+ > return angle::Result::Continue; > } > >@@ -6578,12 +6811,13 @@ void ImageHelper::stageSubresourceUpdateFromImage(RefCounted<ImageHelper> *image > const VkImageType imageType) > { > gl::LevelIndex updateLevelGL(index.getLevelIndex()); >+ VkImageAspectFlags imageAspectFlags = vk::GetFormatAspectFlags(image->get().getActualFormat()); > > VkImageCopy copyToImage = {}; >- copyToImage.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; >+ copyToImage.srcSubresource.aspectMask = imageAspectFlags; > copyToImage.srcSubresource.mipLevel = srcMipLevel.get(); > copyToImage.srcSubresource.layerCount = index.getLayerCount(); >- copyToImage.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; >+ copyToImage.dstSubresource.aspectMask = imageAspectFlags; > copyToImage.dstSubresource.mipLevel = updateLevelGL.get(); > > if (imageType == VK_IMAGE_TYPE_3D) >@@ -6674,14 +6908,19 @@ angle::Result ImageHelper::stageRobustResourceClearWithFormat(ContextVk *context > ANGLE_VK_CHECK_MATH(contextVk, > formatInfo.computeCompressedImageSize(glExtents, &totalSize)); > >- VkBuffer bufferHandle = VK_NULL_HANDLE; >- uint8_t *stagingPointer = nullptr; >- VkDeviceSize stagingOffset = 0; >- ANGLE_TRY(mStagingBuffer.allocate(contextVk, totalSize, &stagingPointer, &bufferHandle, >- &stagingOffset, nullptr)); >+ std::unique_ptr<RefCounted<BufferHelper>> stagingBuffer = >+ std::make_unique<RefCounted<BufferHelper>>(); >+ BufferHelper *currentBuffer = &stagingBuffer->get(); >+ >+ uint8_t *stagingPointer; >+ VkDeviceSize stagingOffset; >+ ANGLE_TRY(currentBuffer->allocateForCopyImage(contextVk, totalSize, >+ MemoryCoherency::NonCoherent, imageFormat.id, >+ &stagingOffset, &stagingPointer)); > memset(stagingPointer, 0, totalSize); > > VkBufferImageCopy copyRegion = {}; >+ copyRegion.bufferOffset = stagingOffset; > copyRegion.imageExtent.width = glExtents.width; > copyRegion.imageExtent.height = glExtents.height; > copyRegion.imageExtent.depth = glExtents.depth; >@@ -6690,8 +6929,10 @@ angle::Result ImageHelper::stageRobustResourceClearWithFormat(ContextVk *context > copyRegion.imageSubresource.baseArrayLayer = index.hasLayer() ? index.getLayerIndex() : 0; > copyRegion.imageSubresource.layerCount = index.getLayerCount(); > >- appendSubresourceUpdate(updateLevelGL, SubresourceUpdate(mStagingBuffer.getCurrentBuffer(), >- copyRegion, imageFormat.id)); >+ // The update structure owns the staging buffer. >+ appendSubresourceUpdate( >+ updateLevelGL, >+ SubresourceUpdate(stagingBuffer.release(), currentBuffer, copyRegion, imageFormat.id)); > } > else > { >@@ -6928,6 +7169,8 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, > uint32_t layerEnd, > gl::TexLevelMask skipLevelsMask) > { >+ RendererVk *renderer = contextVk->getRenderer(); >+ > if (!hasStagedUpdatesInLevels(levelGLStart, levelGLEnd)) > { > return angle::Result::Continue; >@@ -6956,9 +7199,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, > } > } > >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >- >- ANGLE_TRY(mStagingBuffer.flush(contextVk)); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > > const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(getActualFormat()); > >@@ -6979,7 +7220,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, > access.onImageTransferWrite(levelGLStart, 1, kMaxContentDefinedLayerCount, 0, aspectFlags, > this); > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > for (gl::LevelIndex updateMipLevelGL = levelGLStart; updateMipLevelGL < levelGLEnd; >@@ -7003,8 +7244,9 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, > update.updateSource == UpdateSource::ClearEmulatedChannelsOnly || > (update.updateSource == UpdateSource::Buffer && > update.data.buffer.bufferHelper != nullptr) || >- (update.updateSource == UpdateSource::Image && update.image != nullptr && >- update.image->isReferenced() && update.image->get().valid())); >+ (update.updateSource == UpdateSource::Image && >+ update.refCounted.image != nullptr && update.refCounted.image->isReferenced() && >+ update.refCounted.image->get().valid())); > > uint32_t updateBaseLayer, updateLayerCount; > update.getDestSubresource(mLayerCount, &updateBaseLayer, &updateLayerCount); >@@ -7114,6 +7356,7 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, > > BufferHelper *currentBuffer = bufferUpdate.bufferHelper; > ASSERT(currentBuffer && currentBuffer->valid()); >+ ANGLE_TRY(currentBuffer->flush(renderer)); > > CommandBufferAccess bufferAccess; > bufferAccess.onBufferTransferRead(currentBuffer); >@@ -7128,13 +7371,14 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, > } > else > { >+ ASSERT(update.updateSource == UpdateSource::Image); > CommandBufferAccess imageAccess; >- imageAccess.onImageTransferRead(aspectFlags, &update.image->get()); >+ imageAccess.onImageTransferRead(aspectFlags, &update.refCounted.image->get()); > ANGLE_TRY( > contextVk->getOutsideRenderPassCommandBuffer(imageAccess, &commandBuffer)); > >- commandBuffer->copyImage(update.image->get().getImage(), >- update.image->get().getCurrentLayout(), mImage, >+ commandBuffer->copyImage(update.refCounted.image->get().getImage(), >+ update.refCounted.image->get().getCurrentLayout(), mImage, > getCurrentLayout(), 1, &update.data.image.copyRegion); > onWrite(updateMipLevelGL, 1, updateBaseLayer, updateLayerCount, > update.data.image.copyRegion.dstSubresource.aspectMask); >@@ -7158,13 +7402,11 @@ angle::Result ImageHelper::flushStagedUpdates(ContextVk *contextVk, > } > mSubresourceUpdates.resize(compactSize); > >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > > // If no updates left, release the staging buffers to save memory. > if (mSubresourceUpdates.empty()) > { >- mStagingBuffer.releaseInFlightBuffers(contextVk); >- mStagingBuffer.release(contextVk->getRenderer()); > onStateChange(angle::SubjectMessage::InitializationComplete); > } > >@@ -7208,6 +7450,34 @@ bool ImageHelper::hasStagedUpdatesForSubresource(gl::LevelIndex levelGL, > return false; > } > >+bool ImageHelper::removeStagedClearUpdatesAndReturnColor(gl::LevelIndex levelGL, >+ const VkClearColorValue **color) >+{ >+ std::vector<SubresourceUpdate> *levelUpdates = getLevelUpdates(levelGL); >+ if (levelUpdates == nullptr || levelUpdates->empty()) >+ { >+ return false; >+ } >+ >+ bool result = false; >+ >+ for (size_t index = 0; index < levelUpdates->size();) >+ { >+ auto update = levelUpdates->begin() + index; >+ if (update->updateSource == UpdateSource::Clear) >+ { >+ if (color != nullptr) >+ { >+ *color = &update->data.clear.value.color; >+ } >+ levelUpdates->erase(update); >+ result = true; >+ } >+ } >+ >+ return result; >+} >+ > gl::LevelIndex ImageHelper::getLastAllocatedLevel() const > { > return mFirstAllocatedLevel + mLevelCount - 1; >@@ -7261,6 +7531,30 @@ bool ImageHelper::hasStagedImageUpdatesWithMismatchedFormat(gl::LevelIndex level > return false; > } > >+bool ImageHelper::validateSubresourceUpdateBufferRefConsistent( >+ RefCounted<BufferHelper> *buffer) const >+{ >+ if (buffer == nullptr) >+ { >+ return true; >+ } >+ >+ uint32_t refs = 0; >+ >+ for (const std::vector<SubresourceUpdate> &levelUpdates : mSubresourceUpdates) >+ { >+ for (const SubresourceUpdate &update : levelUpdates) >+ { >+ if (update.updateSource == UpdateSource::Buffer && update.refCounted.buffer == buffer) >+ { >+ ++refs; >+ } >+ } >+ } >+ >+ return buffer->isRefCountAsExpected(refs); >+} >+ > bool ImageHelper::validateSubresourceUpdateImageRefConsistent(RefCounted<ImageHelper> *image) const > { > if (image == nullptr) >@@ -7274,7 +7568,7 @@ bool ImageHelper::validateSubresourceUpdateImageRefConsistent(RefCounted<ImageHe > { > for (const SubresourceUpdate &update : levelUpdates) > { >- if (update.updateSource == UpdateSource::Image && update.image == image) >+ if (update.updateSource == UpdateSource::Image && update.refCounted.image == image) > { > ++refs; > } >@@ -7284,16 +7578,25 @@ bool ImageHelper::validateSubresourceUpdateImageRefConsistent(RefCounted<ImageHe > return image->isRefCountAsExpected(refs); > } > >-bool ImageHelper::validateSubresourceUpdateImageRefsConsistent() const >+bool ImageHelper::validateSubresourceUpdateRefCountsConsistent() const > { > for (const std::vector<SubresourceUpdate> &levelUpdates : mSubresourceUpdates) > { > for (const SubresourceUpdate &update : levelUpdates) > { >- if (update.updateSource == UpdateSource::Image && >- !validateSubresourceUpdateImageRefConsistent(update.image)) >+ if (update.updateSource == UpdateSource::Image) >+ { >+ if (!validateSubresourceUpdateImageRefConsistent(update.refCounted.image)) >+ { >+ return false; >+ } >+ } >+ else if (update.updateSource == UpdateSource::Buffer) > { >- return false; >+ if (!validateSubresourceUpdateBufferRefConsistent(update.refCounted.buffer)) >+ { >+ return false; >+ } > } > } > } >@@ -7310,7 +7613,7 @@ void ImageHelper::removeSupersededUpdates(ContextVk *contextVk, gl::TexLevelMask > return; > } > >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > > RendererVk *renderer = contextVk->getRenderer(); > >@@ -7423,7 +7726,7 @@ void ImageHelper::removeSupersededUpdates(ContextVk *contextVk, gl::TexLevelMask > .base()); > } > >- ASSERT(validateSubresourceUpdateImageRefsConsistent()); >+ ASSERT(validateSubresourceUpdateRefCountsConsistent()); > } > > angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, >@@ -7431,9 +7734,7 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, > uint32_t layerCount, > uint32_t baseLayer, > const gl::Box &sourceArea, >- BufferHelper **bufferOut, >- size_t *bufferSize, >- StagingBufferOffsetArray *bufferOffsetsOut, >+ BufferHelper *dstBuffer, > uint8_t **outDataPtr) > { > ANGLE_TRACE_EVENT0("gpu.angle", "ImageHelper::copyImageDataToBuffer"); >@@ -7455,21 +7756,24 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, > depthBytesPerPixel = 4; > } > >- *bufferSize = sourceArea.width * sourceArea.height * sourceArea.depth * pixelBytes * layerCount; >+ size_t bufferSize = >+ sourceArea.width * sourceArea.height * sourceArea.depth * pixelBytes * layerCount; > > const VkImageAspectFlags aspectFlags = getAspectFlags(); > >- // Allocate staging buffer data from context >- VkBuffer bufferHandle; >- ANGLE_TRY(mStagingBuffer.allocate(contextVk, *bufferSize, outDataPtr, &bufferHandle, >- &(*bufferOffsetsOut)[0], nullptr)); >- *bufferOut = mStagingBuffer.getCurrentBuffer(); >+ // Allocate coherent staging buffer >+ ASSERT(dstBuffer != nullptr && !dstBuffer->valid()); >+ VkDeviceSize dstOffset; >+ ANGLE_TRY(dstBuffer->allocateForCopyImage(contextVk, bufferSize, MemoryCoherency::Coherent, >+ imageFormat.id, &dstOffset, outDataPtr)); >+ VkBuffer bufferHandle = dstBuffer->getBuffer().getHandle(); > > LevelIndex sourceLevelVk = toVkLevel(sourceLevelGL); > > VkBufferImageCopy regions[2] = {}; >+ uint32_t regionCount = 1; > // Default to non-combined DS case >- regions[0].bufferOffset = (*bufferOffsetsOut)[0]; >+ regions[0].bufferOffset = dstOffset; > regions[0].bufferRowLength = 0; > regions[0].bufferImageHeight = 0; > regions[0].imageExtent.width = sourceArea.width; >@@ -7494,26 +7798,135 @@ angle::Result ImageHelper::copyImageDataToBuffer(ContextVk *contextVk, > sourceArea.depth * layerCount; > > // Double-check that we allocated enough buffer space (always 1 byte per stencil) >- ASSERT(*bufferSize >= (depthSize + (sourceArea.width * sourceArea.height * >- sourceArea.depth * layerCount))); >+ ASSERT(bufferSize >= (depthSize + (sourceArea.width * sourceArea.height * sourceArea.depth * >+ layerCount))); > > // Copy stencil data into buffer immediately following the depth data >- const VkDeviceSize stencilOffset = (*bufferOffsetsOut)[0] + depthSize; >- (*bufferOffsetsOut)[1] = stencilOffset; >+ const VkDeviceSize stencilOffset = dstOffset + depthSize; > regions[1] = regions[0]; > regions[1].bufferOffset = stencilOffset; > regions[1].imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; >+ regionCount++; > } > > CommandBufferAccess access; >- access.onBufferTransferWrite(*bufferOut); >+ access.onBufferTransferWrite(dstBuffer); > access.onImageTransferRead(aspectFlags, this); > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > >- commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(), bufferHandle, 1, regions); >+ commandBuffer->copyImageToBuffer(mImage, getCurrentLayout(), bufferHandle, regionCount, >+ regions); >+ >+ return angle::Result::Continue; >+} >+ >+angle::Result ImageHelper::copySurfaceImageToBuffer(DisplayVk *displayVk, >+ gl::LevelIndex sourceLevelGL, >+ uint32_t layerCount, >+ uint32_t baseLayer, >+ const gl::Box &sourceArea, >+ vk::BufferHelper *bufferHelper) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "ImageHelper::copySurfaceImageToBuffer"); >+ >+ RendererVk *rendererVk = displayVk->getRenderer(); >+ >+ VkBufferImageCopy region = {}; >+ region.bufferOffset = 0; >+ region.bufferRowLength = 0; >+ region.bufferImageHeight = 0; >+ region.imageExtent.width = sourceArea.width; >+ region.imageExtent.height = sourceArea.height; >+ region.imageExtent.depth = sourceArea.depth; >+ region.imageOffset.x = sourceArea.x; >+ region.imageOffset.y = sourceArea.y; >+ region.imageOffset.z = sourceArea.z; >+ region.imageSubresource.aspectMask = getAspectFlags(); >+ region.imageSubresource.baseArrayLayer = baseLayer; >+ region.imageSubresource.layerCount = layerCount; >+ region.imageSubresource.mipLevel = toVkLevel(sourceLevelGL).get(); >+ >+ PrimaryCommandBuffer primaryCommandBuffer; >+ ANGLE_TRY(rendererVk->getCommandBufferOneOff(displayVk, false, &primaryCommandBuffer)); >+ >+ barrierImpl(displayVk, getAspectFlags(), ImageLayout::TransferSrc, mCurrentQueueFamilyIndex, >+ &primaryCommandBuffer); >+ primaryCommandBuffer.copyImageToBuffer(mImage, getCurrentLayout(), >+ bufferHelper->getBuffer().getHandle(), 1, ®ion); >+ >+ ANGLE_VK_TRY(displayVk, primaryCommandBuffer.end()); >+ >+ // Create fence for the submission >+ VkFenceCreateInfo fenceInfo = {}; >+ fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; >+ fenceInfo.flags = 0; > >+ vk::DeviceScoped<vk::Fence> fence(rendererVk->getDevice()); >+ ANGLE_VK_TRY(displayVk, fence.get().init(rendererVk->getDevice(), fenceInfo)); >+ >+ Serial serial; >+ ANGLE_TRY(rendererVk->queueSubmitOneOff(displayVk, std::move(primaryCommandBuffer), false, >+ egl::ContextPriority::Medium, nullptr, 0, &fence.get(), >+ vk::SubmitPolicy::EnsureSubmitted, &serial)); >+ >+ ANGLE_VK_TRY(displayVk, >+ fence.get().wait(rendererVk->getDevice(), rendererVk->getMaxFenceWaitTimeNs())); >+ return angle::Result::Continue; >+} >+ >+angle::Result ImageHelper::copyBufferToSurfaceImage(DisplayVk *displayVk, >+ gl::LevelIndex sourceLevelGL, >+ uint32_t layerCount, >+ uint32_t baseLayer, >+ const gl::Box &sourceArea, >+ vk::BufferHelper *bufferHelper) >+{ >+ ANGLE_TRACE_EVENT0("gpu.angle", "ImageHelper::copyBufferToSurfaceImage"); >+ >+ RendererVk *rendererVk = displayVk->getRenderer(); >+ >+ VkBufferImageCopy region = {}; >+ region.bufferOffset = 0; >+ region.bufferRowLength = 0; >+ region.bufferImageHeight = 0; >+ region.imageExtent.width = sourceArea.width; >+ region.imageExtent.height = sourceArea.height; >+ region.imageExtent.depth = sourceArea.depth; >+ region.imageOffset.x = sourceArea.x; >+ region.imageOffset.y = sourceArea.y; >+ region.imageOffset.z = sourceArea.z; >+ region.imageSubresource.aspectMask = getAspectFlags(); >+ region.imageSubresource.baseArrayLayer = baseLayer; >+ region.imageSubresource.layerCount = layerCount; >+ region.imageSubresource.mipLevel = toVkLevel(sourceLevelGL).get(); >+ >+ PrimaryCommandBuffer commandBuffer; >+ ANGLE_TRY(rendererVk->getCommandBufferOneOff(displayVk, false, &commandBuffer)); >+ >+ barrierImpl(displayVk, getAspectFlags(), ImageLayout::TransferDst, mCurrentQueueFamilyIndex, >+ &commandBuffer); >+ commandBuffer.copyBufferToImage(bufferHelper->getBuffer().getHandle(), mImage, >+ getCurrentLayout(), 1, ®ion); >+ >+ ANGLE_VK_TRY(displayVk, commandBuffer.end()); >+ >+ // Create fence for the submission >+ VkFenceCreateInfo fenceInfo = {}; >+ fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; >+ fenceInfo.flags = 0; >+ >+ vk::DeviceScoped<vk::Fence> fence(rendererVk->getDevice()); >+ ANGLE_VK_TRY(displayVk, fence.get().init(rendererVk->getDevice(), fenceInfo)); >+ >+ Serial serial; >+ ANGLE_TRY(rendererVk->queueSubmitOneOff(displayVk, std::move(commandBuffer), false, >+ egl::ContextPriority::Medium, nullptr, 0, &fence.get(), >+ vk::SubmitPolicy::EnsureSubmitted, &serial)); >+ >+ ANGLE_VK_TRY(displayVk, >+ fence.get().wait(rendererVk->getDevice(), rendererVk->getMaxFenceWaitTimeNs())); > return angle::Result::Continue; > } > >@@ -7594,11 +8007,6 @@ angle::Result ImageHelper::readPixelsForGetImage(ContextVk *contextVk, > ANGLE_TRY(GetReadPixelsParams(contextVk, packState, packBuffer, format, type, area, area, > ¶ms, &outputSkipBytes)); > >- // Use a temporary staging buffer. Could be optimized. >- RendererScoped<DynamicBuffer> stagingBuffer(contextVk->getRenderer()); >- stagingBuffer.get().init(contextVk->getRenderer(), VK_BUFFER_USAGE_TRANSFER_DST_BIT, 1, >- kStagingBufferSize, true, DynamicBufferPolicy::OneShotUse); >- > if (mExtents.depth > 1 || layerCount > 1) > { > ASSERT(layer == 0); >@@ -7610,8 +8018,7 @@ angle::Result ImageHelper::readPixelsForGetImage(ContextVk *contextVk, > for (uint32_t mipLayer = 0; mipLayer < lastLayer; mipLayer++) > { > ANGLE_TRY(readPixels(contextVk, area, params, aspectFlags, levelGL, mipLayer, >- static_cast<uint8_t *>(pixels) + outputSkipBytes, >- &stagingBuffer.get())); >+ static_cast<uint8_t *>(pixels) + outputSkipBytes)); > > outputSkipBytes += mipExtents.width * mipExtents.height * > gl::GetInternalFormatInfo(format, type).pixelBytes; >@@ -7620,8 +8027,7 @@ angle::Result ImageHelper::readPixelsForGetImage(ContextVk *contextVk, > else > { > ANGLE_TRY(readPixels(contextVk, area, params, aspectFlags, levelGL, layer, >- static_cast<uint8_t *>(pixels) + outputSkipBytes, >- &stagingBuffer.get())); >+ static_cast<uint8_t *>(pixels) + outputSkipBytes)); > } > > return angle::Result::Continue; >@@ -7654,11 +8060,9 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, > VkImageAspectFlagBits copyAspectFlags, > gl::LevelIndex levelGL, > uint32_t layer, >- void *pixels, >- DynamicBuffer *stagingBuffer) >+ void *pixels) > { > ANGLE_TRACE_EVENT0("gpu.angle", "ImageHelper::readPixels"); >- > RendererVk *renderer = contextVk->getRenderer(); > > // If the source image is multisampled, we need to resolve it into a temporary image before >@@ -7690,7 +8094,7 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, > &resolvedImage.get()); > } > >- CommandBuffer *commandBuffer; >+ OutsideRenderPassCommandBuffer *commandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(access, &commandBuffer)); > > const angle::Format *readFormat = &getActualFormat(); >@@ -7758,7 +8162,7 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, > copyAccess.onBufferTransferWrite(&packBuffer); > copyAccess.onImageTransferRead(copyAspectFlags, src); > >- CommandBuffer *copyCommandBuffer; >+ OutsideRenderPassCommandBuffer *copyCommandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(copyAccess, ©CommandBuffer)); > > ASSERT(packPixelsParams.outputPitch % readFormat->pixelBytes == 0); >@@ -7777,13 +8181,17 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, > return angle::Result::Continue; > } > >- VkBuffer bufferHandle = VK_NULL_HANDLE; >+ RendererScoped<vk::BufferHelper> readBuffer(renderer); >+ vk::BufferHelper *stagingBuffer = &readBuffer.get(); >+ > uint8_t *readPixelBuffer = nullptr; > VkDeviceSize stagingOffset = 0; > size_t allocationSize = readFormat->pixelBytes * area.width * area.height; > >- ANGLE_TRY(stagingBuffer->allocate(contextVk, allocationSize, &readPixelBuffer, &bufferHandle, >- &stagingOffset, nullptr)); >+ ANGLE_TRY(stagingBuffer->allocateForCopyImage(contextVk, allocationSize, >+ MemoryCoherency::Coherent, mActualFormatID, >+ &stagingOffset, &readPixelBuffer)); >+ VkBuffer bufferHandle = stagingBuffer->getBuffer().getHandle(); > > VkBufferImageCopy region = {}; > region.bufferImageHeight = srcExtent.height; >@@ -7794,9 +8202,9 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, > region.imageSubresource = srcSubresource; > > CommandBufferAccess readbackAccess; >- readbackAccess.onBufferTransferWrite(stagingBuffer->getCurrentBuffer()); >+ readbackAccess.onBufferTransferWrite(stagingBuffer); > >- CommandBuffer *readbackCommandBuffer; >+ OutsideRenderPassCommandBuffer *readbackCommandBuffer; > ANGLE_TRY(contextVk->getOutsideRenderPassCommandBuffer(readbackAccess, &readbackCommandBuffer)); > > readbackCommandBuffer->copyImageToBuffer(src->getImage(), src->getCurrentLayout(), bufferHandle, >@@ -7808,10 +8216,6 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, > // TODO(jmadill): Don't block on asynchronous readback. > ANGLE_TRY(contextVk->finishImpl(RenderPassClosureReason::GLReadPixels)); > >- // The buffer we copied to needs to be invalidated before we read from it because its not been >- // created with the host coherent bit. >- ANGLE_TRY(stagingBuffer->invalidate(contextVk)); >- > if (packPixelsParams.packBuffer) > { > // Must map the PBO in order to read its contents (and then unmap it later) >@@ -7833,19 +8237,25 @@ angle::Result ImageHelper::readPixels(ContextVk *contextVk, > } > > // ImageHelper::SubresourceUpdate implementation >-ImageHelper::SubresourceUpdate::SubresourceUpdate() >- : updateSource(UpdateSource::Buffer), image(nullptr) >+ImageHelper::SubresourceUpdate::SubresourceUpdate() : updateSource(UpdateSource::Buffer) > { > data.buffer.bufferHelper = nullptr; >+ refCounted.buffer = nullptr; > } > > ImageHelper::SubresourceUpdate::~SubresourceUpdate() {} > >-ImageHelper::SubresourceUpdate::SubresourceUpdate(BufferHelper *bufferHelperIn, >+ImageHelper::SubresourceUpdate::SubresourceUpdate(RefCounted<BufferHelper> *bufferIn, >+ BufferHelper *bufferHelperIn, > const VkBufferImageCopy ©RegionIn, > angle::FormatID formatID) >- : updateSource(UpdateSource::Buffer), image(nullptr) >+ : updateSource(UpdateSource::Buffer) > { >+ refCounted.buffer = bufferIn; >+ if (refCounted.buffer != nullptr) >+ { >+ refCounted.buffer->addRef(); >+ } > data.buffer.bufferHelper = bufferHelperIn; > data.buffer.copyRegion = copyRegionIn; > data.buffer.formatID = formatID; >@@ -7854,9 +8264,10 @@ ImageHelper::SubresourceUpdate::SubresourceUpdate(BufferHelper *bufferHelperIn, > ImageHelper::SubresourceUpdate::SubresourceUpdate(RefCounted<ImageHelper> *imageIn, > const VkImageCopy ©RegionIn, > angle::FormatID formatID) >- : updateSource(UpdateSource::Image), image(imageIn) >+ : updateSource(UpdateSource::Image) > { >- image->addRef(); >+ refCounted.image = imageIn; >+ refCounted.image->addRef(); > data.image.copyRegion = copyRegionIn; > data.image.formatID = formatID; > } >@@ -7864,8 +8275,9 @@ ImageHelper::SubresourceUpdate::SubresourceUpdate(RefCounted<ImageHelper> *image > ImageHelper::SubresourceUpdate::SubresourceUpdate(VkImageAspectFlags aspectFlags, > const VkClearValue &clearValue, > const gl::ImageIndex &imageIndex) >- : updateSource(UpdateSource::Clear), image(nullptr) >+ : updateSource(UpdateSource::Clear) > { >+ refCounted.image = nullptr; > data.clear.aspectFlags = aspectFlags; > data.clear.value = clearValue; > data.clear.levelIndex = imageIndex.getLevelIndex(); >@@ -7878,8 +8290,9 @@ ImageHelper::SubresourceUpdate::SubresourceUpdate(VkImageAspectFlags aspectFlags > ImageHelper::SubresourceUpdate::SubresourceUpdate(VkColorComponentFlags colorMaskFlags, > const VkClearColorValue &clearValue, > const gl::ImageIndex &imageIndex) >- : updateSource(UpdateSource::ClearEmulatedChannelsOnly), image(nullptr) >+ : updateSource(UpdateSource::ClearEmulatedChannelsOnly) > { >+ refCounted.image = nullptr; > data.clear.aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; > data.clear.value.color = clearValue; > data.clear.levelIndex = imageIndex.getLevelIndex(); >@@ -7890,21 +8303,24 @@ ImageHelper::SubresourceUpdate::SubresourceUpdate(VkColorComponentFlags colorMas > } > > ImageHelper::SubresourceUpdate::SubresourceUpdate(SubresourceUpdate &&other) >- : updateSource(other.updateSource), image(nullptr) >+ : updateSource(other.updateSource) > { > switch (updateSource) > { > case UpdateSource::Clear: > case UpdateSource::ClearEmulatedChannelsOnly: >- data.clear = other.data.clear; >+ data.clear = other.data.clear; >+ refCounted.buffer = nullptr; > break; > case UpdateSource::Buffer: >- data.buffer = other.data.buffer; >+ data.buffer = other.data.buffer; >+ refCounted.buffer = other.refCounted.buffer; >+ other.refCounted.buffer = nullptr; > break; > case UpdateSource::Image: >- data.image = other.data.image; >- image = other.image; >- other.image = nullptr; >+ data.image = other.data.image; >+ refCounted.image = other.refCounted.image; >+ other.refCounted.image = nullptr; > break; > default: > UNREACHABLE(); >@@ -7937,17 +8353,29 @@ void ImageHelper::SubresourceUpdate::release(RendererVk *renderer) > { > if (updateSource == UpdateSource::Image) > { >- image->releaseRef(); >+ refCounted.image->releaseRef(); > >- if (!image->isReferenced()) >+ if (!refCounted.image->isReferenced()) > { > // Staging images won't be used in render pass attachments. >- image->get().releaseImage(renderer); >- image->get().releaseStagingBuffer(renderer); >- SafeDelete(image); >+ refCounted.image->get().releaseImage(renderer); >+ refCounted.image->get().releaseStagedUpdates(renderer); >+ SafeDelete(refCounted.image); >+ } >+ >+ refCounted.image = nullptr; >+ } >+ else if (updateSource == UpdateSource::Buffer && refCounted.buffer != nullptr) >+ { >+ refCounted.buffer->releaseRef(); >+ >+ if (!refCounted.buffer->isReferenced()) >+ { >+ refCounted.buffer->get().release(renderer); >+ SafeDelete(refCounted.buffer); > } > >- image = nullptr; >+ refCounted.buffer = nullptr; > } > } > >@@ -8298,7 +8726,8 @@ angle::Result ImageViewHelper::initReadViews(ContextVk *contextVk, > uint32_t baseLayer, > uint32_t layerCount, > bool requiresSRGBViews, >- VkImageUsageFlags imageUsageFlags) >+ VkImageUsageFlags imageUsageFlags, >+ const gl::SamplerState &samplerState) > { > ASSERT(levelCount > 0); > if (levelCount > mPerLevelLinearReadImageViews.size()) >@@ -8321,7 +8750,7 @@ angle::Result ImageViewHelper::initReadViews(ContextVk *contextVk, > > // Since we don't have a readImageView, we must create ImageViews for the new max level > ANGLE_TRY(initReadViewsImpl(contextVk, viewType, image, format, formatSwizzle, readSwizzle, >- baseLevel, levelCount, baseLayer, layerCount)); >+ baseLevel, levelCount, baseLayer, layerCount, samplerState)); > > if (requiresSRGBViews) > { >@@ -8342,7 +8771,8 @@ angle::Result ImageViewHelper::initReadViewsImpl(ContextVk *contextVk, > LevelIndex baseLevel, > uint32_t levelCount, > uint32_t baseLayer, >- uint32_t layerCount) >+ uint32_t layerCount, >+ const gl::SamplerState &samplerState) > { > ASSERT(mImageViewSerial.valid()); > >@@ -8354,17 +8784,17 @@ angle::Result ImageViewHelper::initReadViewsImpl(ContextVk *contextVk, > { > ANGLE_TRY(image.initLayerImageViewWithFormat( > contextVk, viewType, vkFormat, VK_IMAGE_ASPECT_DEPTH_BIT, readSwizzle, >- &getReadImageView(), baseLevel, levelCount, baseLayer, layerCount)); >+ &getReadImageView(), baseLevel, levelCount, baseLayer, layerCount, samplerState)); > ANGLE_TRY(image.initLayerImageViewWithFormat( > contextVk, viewType, vkFormat, VK_IMAGE_ASPECT_STENCIL_BIT, readSwizzle, > &mPerLevelStencilReadImageViews[mCurrentMaxLevel.get()], baseLevel, levelCount, >- baseLayer, layerCount)); >+ baseLayer, layerCount, samplerState)); > } > else > { >- ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, viewType, vkFormat, aspectFlags, >- readSwizzle, &getReadImageView(), baseLevel, >- levelCount, baseLayer, layerCount)); >+ ANGLE_TRY(image.initLayerImageViewWithFormat( >+ contextVk, viewType, vkFormat, aspectFlags, readSwizzle, &getReadImageView(), baseLevel, >+ levelCount, baseLayer, layerCount, samplerState)); > } > > gl::TextureType fetchType = viewType; >@@ -8374,14 +8804,14 @@ angle::Result ImageViewHelper::initReadViewsImpl(ContextVk *contextVk, > { > fetchType = Get2DTextureType(layerCount, image.getSamples()); > >- ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, fetchType, vkFormat, aspectFlags, >- readSwizzle, &getFetchImageView(), baseLevel, >- levelCount, baseLayer, layerCount)); >+ ANGLE_TRY(image.initLayerImageViewWithFormat( >+ contextVk, fetchType, vkFormat, aspectFlags, readSwizzle, &getFetchImageView(), >+ baseLevel, levelCount, baseLayer, layerCount, samplerState)); > } > > ANGLE_TRY(image.initLayerImageViewWithFormat(contextVk, fetchType, vkFormat, aspectFlags, > formatSwizzle, &getCopyImageView(), baseLevel, >- levelCount, baseLayer, layerCount)); >+ levelCount, baseLayer, layerCount, samplerState)); > > return angle::Result::Continue; > } >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.h >index d8bed91c3c2d2548a3aacf0710bd08c689f948df..3560c286fcbdc2ee11073cb3cb6177f6c6d2d390 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_helpers.h >@@ -184,77 +184,6 @@ class DynamicBuffer : angle::NonCopyable > BufferHelperPointerVector mBufferFreeList; > }; > >-// Based off of the DynamicBuffer class, DynamicShadowBuffer provides >-// a similar conceptually infinitely long buffer that will only be written >-// to and read by the CPU. This can be used to provide CPU cached copies of >-// GPU-read only buffers. The value add here is that when an app requests >-// CPU access to a buffer we can fullfil such a request in O(1) time since >-// we don't need to wait for GPU to be done with in-flight commands. >-// >-// The hidden cost here is that any operation that updates a buffer, either >-// through a buffer sub data update or a buffer-to-buffer copy will have an >-// additional overhead of having to update its CPU only buffer >-class DynamicShadowBuffer : public angle::NonCopyable >-{ >- public: >- DynamicShadowBuffer(); >- DynamicShadowBuffer(DynamicShadowBuffer &&other); >- ~DynamicShadowBuffer(); >- >- // Initialize the DynamicShadowBuffer. >- void init(size_t initialSize); >- >- // Returns whether this DynamicShadowBuffer is active >- ANGLE_INLINE bool valid() { return (mSize != 0); } >- >- // This call will actually allocate a new CPU only memory from the heap. >- // The size can be different than the one specified during `init`. >- angle::Result allocate(size_t sizeInBytes); >- >- ANGLE_INLINE void updateData(const uint8_t *data, size_t size, size_t offset) >- { >- ASSERT(!mBuffer.empty()); >- // Memcopy data into the buffer >- memcpy((mBuffer.data() + offset), data, size); >- } >- >- // Map the CPU only buffer and return the pointer. We map the entire buffer for now. >- ANGLE_INLINE void map(size_t offset, uint8_t **mapPtr) >- { >- ASSERT(mapPtr); >- ASSERT(!mBuffer.empty()); >- *mapPtr = mBuffer.data() + offset; >- } >- >- // Unmap the CPU only buffer, NOOP for now >- ANGLE_INLINE void unmap() {} >- >- // This releases resources when they might currently be in use. >- void release(); >- >- // This frees resources immediately. >- void destroy(VkDevice device); >- >- ANGLE_INLINE uint8_t *getCurrentBuffer() >- { >- ASSERT(!mBuffer.empty()); >- return mBuffer.data(); >- } >- >- ANGLE_INLINE const uint8_t *getCurrentBuffer() const >- { >- ASSERT(!mBuffer.empty()); >- return mBuffer.data(); >- } >- >- private: >- void reset(); >- >- size_t mInitialSize; >- size_t mSize; >- angle::MemoryBuffer mBuffer; >-}; >- > // Uses DescriptorPool to allocate descriptor sets as needed. If a descriptor pool becomes full, we > // allocate new pools internally as needed. RendererVk takes care of the lifetime of the discarded > // pools. Note that we used a fixed layout for descriptor pools in ANGLE. >@@ -521,7 +450,8 @@ class QueryHelper final : public Resource > // When syncing gpu/cpu time, main thread accesses primary directly > void writeTimestampToPrimary(ContextVk *contextVk, PrimaryCommandBuffer *primary); > // All other timestamp accesses should be made on outsideRenderPassCommandBuffer >- void writeTimestamp(ContextVk *contextVk, CommandBuffer *outsideRenderPassCommandBuffer); >+ void writeTimestamp(ContextVk *contextVk, >+ OutsideRenderPassCommandBuffer *outsideRenderPassCommandBuffer); > > // Whether this query helper has generated and submitted any commands. > bool hasSubmittedCommands() const; >@@ -541,10 +471,12 @@ class QueryHelper final : public Resource > > // Reset needs to always be done outside a render pass, which may be different from the > // passed-in command buffer (which could be the render pass'). >+ template <typename CommandBufferT> > void beginQueryImpl(ContextVk *contextVk, >- CommandBuffer *resetCommandBuffer, >- CommandBuffer *commandBuffer); >- void endQueryImpl(ContextVk *contextVk, CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *resetCommandBuffer, >+ CommandBufferT *commandBuffer); >+ template <typename CommandBufferT> >+ void endQueryImpl(ContextVk *contextVk, CommandBufferT *commandBuffer); > template <typename CommandBufferT> > void resetQueryPoolImpl(ContextVk *contextVk, > const QueryPool &queryPool, >@@ -621,72 +553,6 @@ class SemaphoreHelper final : angle::NonCopyable > const Semaphore *mSemaphore; > }; > >-// This class' responsibility is to create index buffers needed to support line loops in Vulkan. >-// In the setup phase of drawing, the createIndexBuffer method should be called with the >-// current draw call parameters. If an element array buffer is bound for an indexed draw, use >-// createIndexBufferFromElementArrayBuffer. >-// >-// If the user wants to draw a loop between [v1, v2, v3], we will create an indexed buffer with >-// these indexes: [0, 1, 2, 3, 0] to emulate the loop. >-class LineLoopHelper final : angle::NonCopyable >-{ >- public: >- LineLoopHelper(RendererVk *renderer); >- ~LineLoopHelper(); >- >- angle::Result getIndexBufferForDrawArrays(ContextVk *contextVk, >- uint32_t clampedVertexCount, >- GLint firstVertex, >- BufferHelper **bufferOut, >- VkDeviceSize *offsetOut); >- >- angle::Result getIndexBufferForElementArrayBuffer(ContextVk *contextVk, >- BufferVk *elementArrayBufferVk, >- gl::DrawElementsType glIndexType, >- int indexCount, >- intptr_t elementArrayOffset, >- BufferHelper **bufferOut, >- VkDeviceSize *bufferOffsetOut, >- uint32_t *indexCountOut); >- >- angle::Result streamIndices(ContextVk *contextVk, >- gl::DrawElementsType glIndexType, >- GLsizei indexCount, >- const uint8_t *srcPtr, >- BufferHelper **bufferOut, >- VkDeviceSize *bufferOffsetOut, >- uint32_t *indexCountOut); >- >- angle::Result streamIndicesIndirect(ContextVk *contextVk, >- gl::DrawElementsType glIndexType, >- BufferHelper *indexBuffer, >- VkDeviceSize indexBufferOffset, >- BufferHelper *indirectBuffer, >- VkDeviceSize indirectBufferOffset, >- BufferHelper **indexBufferOut, >- VkDeviceSize *indexBufferOffsetOut, >- BufferHelper **indirectBufferOut, >- VkDeviceSize *indirectBufferOffsetOut); >- >- angle::Result streamArrayIndirect(ContextVk *contextVk, >- size_t vertexCount, >- BufferHelper *arrayIndirectBuffer, >- VkDeviceSize arrayIndirectBufferOffset, >- BufferHelper **indexBufferOut, >- VkDeviceSize *indexBufferOffsetOut, >- BufferHelper **indexIndirectBufferOut, >- VkDeviceSize *indexIndirectBufferOffsetOut); >- >- void release(ContextVk *contextVk); >- void destroy(RendererVk *renderer); >- >- static void Draw(uint32_t count, uint32_t baseVertex, CommandBuffer *commandBuffer); >- >- private: >- DynamicBuffer mDynamicIndexBuffer; >- DynamicBuffer mDynamicIndirectBuffer; >-}; >- > // This defines enum for VkPipelineStageFlagBits so that we can use it to compare and index into > // array. > enum class PipelineStage : uint16_t >@@ -841,59 +707,78 @@ using PipelineBarrierArray = angle::PackedEnumMap<PipelineStage, PipelineBarrier > > class FramebufferHelper; > >+enum class MemoryCoherency >+{ >+ NonCoherent, >+ Coherent >+}; >+ >+enum class MemoryHostVisibility >+{ >+ NonVisible, >+ Visible >+}; >+ > class BufferHelper : public ReadWriteResource > { > public: > BufferHelper(); > ~BufferHelper() override; > >- angle::Result init(ContextVk *contextVk, >+ BufferHelper(BufferHelper &&other); >+ BufferHelper &operator=(BufferHelper &&other); >+ >+ angle::Result init(vk::Context *context, > const VkBufferCreateInfo &createInfo, > VkMemoryPropertyFlags memoryPropertyFlags); > angle::Result initExternal(ContextVk *contextVk, > VkMemoryPropertyFlags memoryProperties, > const VkBufferCreateInfo &requestedCreateInfo, > GLeglClientBufferEXT clientBuffer); >- angle::Result initSubAllocation(ContextVk *contextVk, >+ angle::Result initSuballocation(ContextVk *contextVk, > uint32_t memoryTypeIndex, > size_t size, > size_t alignment); > >+ // Helper functions to initialize a buffer for a specific usage >+ // Suballocate a buffer with alignment good for shader storage or copyBuffer . >+ angle::Result allocateForVertexConversion(ContextVk *contextVk, >+ size_t size, >+ MemoryHostVisibility hostVisibility); >+ // Suballocate a host visible buffer with alignment good for copyBuffer . >+ angle::Result allocateForCopyBuffer(ContextVk *contextVk, >+ size_t size, >+ MemoryCoherency coherency); >+ // Suballocate a host visible buffer with alignment good for copyImage . >+ angle::Result allocateForCopyImage(ContextVk *contextVk, >+ size_t size, >+ MemoryCoherency coherency, >+ angle::FormatID formatId, >+ VkDeviceSize *offset, >+ uint8_t **dataPtr); >+ > void destroy(RendererVk *renderer); > void release(RendererVk *renderer); > > BufferSerial getBufferSerial() const { return mSerial; } >- bool valid() const { return mBuffer.valid(); } >- const Buffer &getBuffer() const { return mBuffer; } >- const BufferBlock *getBufferBlock() const >- { >- return mSubAllocation.valid() ? mSubAllocation.getBlock() : nullptr; >- } >- VkDeviceSize getOffset() const >+ bool valid() const { return mSuballocation.valid(); } >+ const Buffer &getBuffer() const { return mSuballocation.getBuffer(); } >+ const BufferBlock *getBufferBlock() const { return mSuballocation.getBlock(); } >+ VkDeviceSize getOffset() const { return mSuballocation.getOffset(); } >+ VkDeviceSize getSize() const { return mSuballocation.getSize(); } >+ VkMemoryMapFlags getMemoryPropertyFlags() const > { >- return mSubAllocation.valid() ? mSubAllocation.getOffset() : 0; >+ return mSuballocation.getMemoryPropertyFlags(); > } >- VkDeviceSize getSize() const { return mSize; } > uint8_t *getMappedMemory() const > { > ASSERT(isMapped()); >- return mSubAllocation.valid() ? mSubAllocation.getMappedMemory() >- : mMemory.getMappedMemory() + getOffset(); >- } >- bool isHostVisible() const >- { >- return (mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0; >- } >- bool isCoherent() const >- { >- return (mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; >+ return isExternalBuffer() ? mMemory.getMappedMemory() : mSuballocation.getMappedMemory(); > } >+ bool isHostVisible() const { return mSuballocation.isHostVisible(); } >+ bool isCoherent() const { return mSuballocation.isCoherent(); } > >- bool isMapped() const >- { >- return mSubAllocation.valid() ? mSubAllocation.isMapped() >- : mMemory.getMappedMemory() != nullptr; >- } >+ bool isMapped() const { return isExternalBuffer() ? true : mSuballocation.isMapped(); } > bool isExternalBuffer() const { return mMemory.isExternalBuffer(); } > > // Also implicitly sets up the correct barriers. >@@ -902,8 +787,9 @@ class BufferHelper : public ReadWriteResource > uint32_t regionCount, > const VkBufferCopy *copyRegions); > >- angle::Result map(ContextVk *contextVk, uint8_t **ptrOut); >+ angle::Result map(Context *context, uint8_t **ptrOut); > angle::Result mapWithOffset(ContextVk *contextVk, uint8_t **ptrOut, size_t offset); >+ > void unmap(RendererVk *renderer); > // After a sequence of writes, call flush to ensure the data is visible to the device. > angle::Result flush(RendererVk *renderer); >@@ -912,19 +798,19 @@ class BufferHelper : public ReadWriteResource > angle::Result invalidate(RendererVk *renderer); > angle::Result invalidate(RendererVk *renderer, VkDeviceSize offset, VkDeviceSize size); > >- void changeQueue(uint32_t newQueueFamilyIndex, CommandBuffer *commandBuffer); >+ void changeQueue(uint32_t newQueueFamilyIndex, OutsideRenderPassCommandBuffer *commandBuffer); > > // Performs an ownership transfer from an external instance or API. > void acquireFromExternal(ContextVk *contextVk, > uint32_t externalQueueFamilyIndex, > uint32_t rendererQueueFamilyIndex, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > // Performs an ownership transfer to an external instance or API. > void releaseToExternal(ContextVk *contextVk, > uint32_t rendererQueueFamilyIndex, > uint32_t externalQueueFamilyIndex, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > // Returns true if the image is owned by an external API or instance. > bool isReleasedToExternal() const; >@@ -936,25 +822,23 @@ class BufferHelper : public ReadWriteResource > bool recordWriteBarrier(VkAccessFlags writeAccessType, > VkPipelineStageFlags writeStage, > PipelineBarrier *barrier); >+ void fillWithColor(const angle::Color<uint8_t> &color, >+ const gl::InternalFormat &internalFormat); > > private: >+ void initializeBarrierTracker(Context *context); > angle::Result initializeNonZeroMemory(Context *context, > VkBufferUsageFlags usage, > VkDeviceSize size); > >- // Vulkan objects. When mSubAllocation is valid, these two objects are week references to >- // the buffer blocks that sub-allocated from. >- Buffer mBuffer; >+ // For external memory only > BufferMemory mMemory; >- // SubAllocation object. Only use it when it is valid. >- BufferSubAllocation mSubAllocation; > >- // Cached properties. >- VkMemoryPropertyFlags mMemoryPropertyFlags; >- VkDeviceSize mSize; >- uint32_t mCurrentQueueFamilyIndex; >+ // Suballocation object. >+ BufferSuballocation mSuballocation; > > // For memory barriers. >+ uint32_t mCurrentQueueFamilyIndex; > VkFlags mCurrentWriteAccess; > VkFlags mCurrentReadAccess; > VkPipelineStageFlags mCurrentWriteStages; >@@ -981,7 +865,7 @@ class BufferPool : angle::NonCopyable > angle::Result allocateBuffer(ContextVk *contextVk, > VkDeviceSize sizeInBytes, > VkDeviceSize alignment, >- BufferSubAllocation *suballocation); >+ BufferSuballocation *suballocation); > > // This frees resources immediately. > void destroy(RendererVk *renderer); >@@ -1060,24 +944,15 @@ class PackedImageAttachmentArray final > // This value indicates an "infinite" CmdCount that is not valid for comparing > constexpr uint32_t kInfiniteCmdCount = 0xFFFFFFFF; > >-// CommandBufferHelper (CBH) class wraps ANGLE's custom command buffer >-// class, SecondaryCommandBuffer. This provides a way to temporarily >-// store Vulkan commands that be can submitted in-line to a primary >-// command buffer at a later time. >-// The current plan is for the main ANGLE thread to record commands >-// into the CBH and then pass the CBH off to a worker thread that will >-// process the commands into a primary command buffer and then submit >-// those commands to the queue. >-class CommandBufferHelper : angle::NonCopyable >+// CommandBufferHelperCommon and derivatives OutsideRenderPassCommandBufferHelper and >+// RenderPassCommandBufferHelper wrap the outside/inside render pass secondary command buffers, >+// together with other information such as barriers to issue before the command buffer, tracking of >+// resource usages, etc. When the asyncCommandQueue feature is enabled, objects of these classes >+// are handed off to the worker thread to be executed on the primary command buffer. >+class CommandBufferHelperCommon : angle::NonCopyable > { > public: >- CommandBufferHelper(); >- ~CommandBufferHelper(); >- >- // General Functions (non-renderPass specific) >- angle::Result initialize(Context *context, >- bool isRenderPassCommandBuffer, >- CommandPool *commandPool); >+ CommandPool *getCommandPool() { return mCommandPool; } > > void bufferRead(ContextVk *contextVk, > VkAccessFlags readAccessType, >@@ -1089,6 +964,151 @@ class CommandBufferHelper : angle::NonCopyable > AliasingMode aliasingMode, > BufferHelper *buffer); > >+ bool usesBuffer(const BufferHelper &buffer) const; >+ bool usesBufferForWrite(const BufferHelper &buffer) const; >+ size_t getUsedBuffersCount() const { return mUsedBuffers.size(); } >+ >+ void executeBarriers(const angle::FeaturesVk &features, PrimaryCommandBuffer *primary); >+ >+ // The markOpen and markClosed functions are to aid in proper use of the *CommandBufferHelper. >+ // saw invalid use due to threading issues that can be easily caught by marking when it's safe >+ // (open) to write to the commandbuffer. >+#if !defined(ANGLE_ENABLE_ASSERTS) >+ void markOpen() {} >+ void markClosed() {} >+#endif >+ >+ void setHasShaderStorageOutput() { mHasShaderStorageOutput = true; } >+ bool hasShaderStorageOutput() const { return mHasShaderStorageOutput; } >+ >+ bool hasGLMemoryBarrierIssued() const { return mHasGLMemoryBarrierIssued; } >+ >+ // Dumping the command stream is disabled by default. >+ static constexpr bool kEnableCommandStreamDiagnostics = false; >+ >+ protected: >+ CommandBufferHelperCommon(); >+ ~CommandBufferHelperCommon(); >+ >+ void initializeImpl(Context *context, CommandPool *commandPool); >+ >+ void resetImpl(); >+ >+ void imageReadImpl(ContextVk *contextVk, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ ImageHelper *image); >+ void imageWriteImpl(ContextVk *contextVk, >+ gl::LevelIndex level, >+ uint32_t layerStart, >+ uint32_t layerCount, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ AliasingMode aliasingMode, >+ ImageHelper *image); >+ >+ void updateImageLayoutAndBarrier(Context *context, >+ ImageHelper *image, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout); >+ >+ void addCommandDiagnosticsCommon(std::ostringstream *out); >+ >+ // Allocator used by this class. Using a pool allocator per CBH to avoid threading issues >+ // that occur w/ shared allocator between multiple CBHs. >+ angle::PoolAllocator mAllocator; >+ >+ // Barriers to be executed before the command buffer. >+ PipelineBarrierArray mPipelineBarriers; >+ PipelineStagesMask mPipelineBarrierMask; >+ >+ // The command pool *CommandBufferHelper::mCommandBuffer is allocated from. Only used with >+ // Vulkan secondary command buffers (as opposed to ANGLE's SecondaryCommandBuffer). >+ CommandPool *mCommandPool; >+ >+ // Whether the command buffers contains any draw/dispatch calls that possibly output data >+ // through storage buffers and images. This is used to determine whether glMemoryBarrier* >+ // should flush the command buffer. >+ bool mHasShaderStorageOutput; >+ // Whether glMemoryBarrier has been called while commands are recorded in this command buffer. >+ // This is used to know when to check and potentially flush the command buffer if storage >+ // buffers and images are used in it. >+ bool mHasGLMemoryBarrierIssued; >+ >+ // Tracks resources used in the command buffer. >+ // For Buffers, we track the read/write access type so we can enable simultaneous reads. >+ angle::FastIntegerMap<BufferAccess> mUsedBuffers; >+}; >+ >+class OutsideRenderPassCommandBufferHelper final : public CommandBufferHelperCommon >+{ >+ public: >+ OutsideRenderPassCommandBufferHelper(); >+ ~OutsideRenderPassCommandBufferHelper(); >+ >+ angle::Result initialize(Context *context, CommandPool *commandPool); >+ >+ angle::Result reset(Context *context); >+ >+ OutsideRenderPassCommandBuffer &getCommandBuffer() { return mCommandBuffer; } >+ >+ bool empty() const { return mCommandBuffer.empty(); } >+ >+#if defined(ANGLE_ENABLE_ASSERTS) >+ void markOpen() { mCommandBuffer.open(); } >+ void markClosed() { mCommandBuffer.close(); } >+#endif >+ >+ void imageRead(ContextVk *contextVk, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ ImageHelper *image); >+ void imageWrite(ContextVk *contextVk, >+ gl::LevelIndex level, >+ uint32_t layerStart, >+ uint32_t layerCount, >+ VkImageAspectFlags aspectFlags, >+ ImageLayout imageLayout, >+ AliasingMode aliasingMode, >+ ImageHelper *image); >+ >+ angle::Result flushToPrimary(Context *context, PrimaryCommandBuffer *primary); >+ >+ void setGLMemoryBarrierIssued() >+ { >+ if (!mCommandBuffer.empty()) >+ { >+ mHasGLMemoryBarrierIssued = true; >+ } >+ } >+ >+ void addCommandDiagnostics(ContextVk *contextVk); >+ >+ private: >+ angle::Result initializeCommandBuffer(Context *context); >+ >+ OutsideRenderPassCommandBuffer mCommandBuffer; >+}; >+ >+class RenderPassCommandBufferHelper final : public CommandBufferHelperCommon >+{ >+ public: >+ RenderPassCommandBufferHelper(); >+ ~RenderPassCommandBufferHelper(); >+ >+ angle::Result initialize(Context *context, CommandPool *commandPool); >+ >+ angle::Result reset(Context *context); >+ >+ RenderPassCommandBuffer &getCommandBuffer() { return mCommandBuffers[mCurrentSubpass]; } >+ >+ bool empty() const { return !started(); } >+ >+#if defined(ANGLE_ENABLE_ASSERTS) >+ void markOpen() { getCommandBuffer().open(); } >+ void markClosed() { getCommandBuffer().close(); } >+#endif >+ > void imageRead(ContextVk *contextVk, > VkImageAspectFlags aspectFlags, > ImageLayout imageLayout, >@@ -1113,44 +1133,13 @@ class CommandBufferHelper : angle::NonCopyable > ImageHelper *image, > ImageHelper *resolveImage); > >- CommandBuffer &getCommandBuffer() { return mCommandBuffer; } >- CommandPool *getCommandPool() { return mCommandPool; } >+ bool usesImage(const ImageHelper &image) const; > > angle::Result flushToPrimary(Context *context, > PrimaryCommandBuffer *primary, > const RenderPass *renderPass); > >- void executeBarriers(const angle::FeaturesVk &features, PrimaryCommandBuffer *primary); >- >- void setHasRenderPass(bool hasRenderPass) { mIsRenderPassCommandBuffer = hasRenderPass; } >- >- // The markOpen and markClosed functions are to aid in proper use of the CommandBufferHelper. >- // saw invalid use due to threading issues that can be easily caught by marking when it's safe >- // (open) to write to the commandbuffer. >-#if defined(ANGLE_ENABLE_ASSERTS) >- void markOpen() { mCommandBuffer.open(); } >- void markClosed() { mCommandBuffer.close(); } >-#else >- void markOpen() {} >- void markClosed() {} >-#endif >- >- angle::Result reset(Context *context); >- >- // Returns true if we have no work to execute. For renderpass command buffer, even if the >- // underlying command buffer is empty, we may still have a renderpass with an empty command >- // buffer just to do the clear. >- bool empty() const >- { >- return mIsRenderPassCommandBuffer ? !mRenderPassStarted : mCommandBuffer.empty(); >- } >- // RenderPass related functions. This is equivalent to !empty(), but only when you know this is >- // a RenderPass command buffer >- bool started() const >- { >- ASSERT(mIsRenderPassCommandBuffer); >- return mRenderPassStarted; >- } >+ bool started() const { return mRenderPassStarted; } > > // Finalize the layout if image has any deferred layout transition. > void finalizeImageLayout(Context *context, const ImageHelper *image); >@@ -1163,10 +1152,12 @@ class CommandBufferHelper : angle::NonCopyable > const vk::PackedAttachmentCount colorAttachmentCount, > const PackedAttachmentIndex depthStencilAttachmentIndex, > const PackedClearValuesArray &clearValues, >- CommandBuffer **commandBufferOut); >+ RenderPassCommandBuffer **commandBufferOut); > > angle::Result endRenderPass(ContextVk *contextVk); > >+ angle::Result nextSubpass(ContextVk *contextVk, RenderPassCommandBuffer **commandBufferOut); >+ > void updateStartedRenderPassWithDepthMode(bool readOnlyDepthStencilMode); > > void beginTransformFeedback(size_t validBufferCount, >@@ -1183,18 +1174,15 @@ class CommandBufferHelper : angle::NonCopyable > > bool hasWriteAfterInvalidate(uint32_t cmdCountInvalidated, uint32_t cmdCountDisabled) > { >- ASSERT(mIsRenderPassCommandBuffer); > return (cmdCountInvalidated != kInfiniteCmdCount && >- std::min(cmdCountDisabled, mCommandBuffer.getRenderPassWriteCommandCount()) != >+ std::min(cmdCountDisabled, getRenderPassWriteCommandCount()) != > cmdCountInvalidated); > } > > bool isInvalidated(uint32_t cmdCountInvalidated, uint32_t cmdCountDisabled) > { >- ASSERT(mIsRenderPassCommandBuffer); > return cmdCountInvalidated != kInfiniteCmdCount && >- std::min(cmdCountDisabled, mCommandBuffer.getRenderPassWriteCommandCount()) == >- cmdCountInvalidated; >+ std::min(cmdCountDisabled, getRenderPassWriteCommandCount()) == cmdCountInvalidated; > } > > void updateRenderPassColorClear(PackedAttachmentIndex colorIndex, >@@ -1202,11 +1190,7 @@ class CommandBufferHelper : angle::NonCopyable > void updateRenderPassDepthStencilClear(VkImageAspectFlags aspectFlags, > const VkClearValue &clearValue); > >- const gl::Rectangle &getRenderArea() const >- { >- ASSERT(mIsRenderPassCommandBuffer); >- return mRenderArea; >- } >+ const gl::Rectangle &getRenderArea() const { return mRenderArea; } > > // If render pass is started with a small render area due to a small scissor, and if a new > // larger scissor is specified, grow the render area to accomodate it. >@@ -1219,25 +1203,12 @@ class CommandBufferHelper : angle::NonCopyable > > uint32_t getAndResetCounter() > { >- ASSERT(mIsRenderPassCommandBuffer); > uint32_t count = mCounter; > mCounter = 0; > return count; > } > >- VkFramebuffer getFramebufferHandle() const >- { >- ASSERT(mIsRenderPassCommandBuffer); >- return mFramebuffer.getHandle(); >- } >- >- bool usesBuffer(const BufferHelper &buffer) const; >- bool usesBufferForWrite(const BufferHelper &buffer) const; >- bool usesImageInRenderPass(const ImageHelper &image) const; >- size_t getUsedBuffersCount() const { return mUsedBuffers.size(); } >- >- // Dumping the command stream is disabled by default. >- static constexpr bool kEnableCommandStreamDiagnostics = false; >+ VkFramebuffer getFramebufferHandle() const { return mFramebuffer.getHandle(); } > > void onDepthAccess(ResourceAccess access); > void onStencilAccess(ResourceAccess access); >@@ -1254,29 +1225,31 @@ class CommandBufferHelper : angle::NonCopyable > VK_ATTACHMENT_LOAD_OP_CLEAR; > } > >- void addCommandDiagnostics(ContextVk *contextVk); >- > const RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; } > const AttachmentOpsArray &getAttachmentOps() const { return mAttachmentOps; } > >- bool hasRenderPass() const { return mIsRenderPassCommandBuffer; } >- >- void setHasShaderStorageOutput() { mHasShaderStorageOutput = true; } >- bool hasShaderStorageOutput() const { return mHasShaderStorageOutput; } >+ void setImageOptimizeForPresent(ImageHelper *image) { mImageOptimizeForPresent = image; } > > void setGLMemoryBarrierIssued() > { >- if (!empty()) >+ if (mRenderPassStarted) > { > mHasGLMemoryBarrierIssued = true; > } > } >- bool hasGLMemoryBarrierIssued() const { return mHasGLMemoryBarrierIssued; } >- void setImageOptimizeForPresent(ImageHelper *image) { mImageOptimizeForPresent = image; } >+ void addCommandDiagnostics(ContextVk *contextVk); > > private: > angle::Result initializeCommandBuffer(Context *context); >+ angle::Result beginRenderPassCommandBuffer(ContextVk *contextVk); >+ angle::Result endRenderPassCommandBuffer(ContextVk *contextVk); > >+ uint32_t getRenderPassWriteCommandCount() >+ { >+ // All subpasses are chained (no subpasses running in parallel), so the cmd count can be >+ // considered continuous among subpasses. >+ return mPreviousSubpassesCmdCount + getCommandBuffer().getRenderPassWriteCommandCount(); >+ } > bool onDepthStencilAccess(ResourceAccess access, > uint32_t *cmdCountInvalidated, > uint32_t *cmdCountDisabled); >@@ -1299,22 +1272,13 @@ class CommandBufferHelper : angle::NonCopyable > RenderPassStoreOp *storeOp); > void finalizeDepthStencilImageLayoutAndLoadStore(Context *context); > >- void updateImageLayoutAndBarrier(Context *context, >- ImageHelper *image, >- VkImageAspectFlags aspectFlags, >- ImageLayout imageLayout); >- >- // Allocator used by this class. Using a pool allocator per CBH to avoid threading issues >- // that occur w/ shared allocator between multiple CBHs. >- angle::PoolAllocator mAllocator; >- >- // General state (non-renderPass related) >- PipelineBarrierArray mPipelineBarriers; >- PipelineStagesMask mPipelineBarrierMask; >- CommandBuffer mCommandBuffer; >- // The command pool mCommandBuffer is allocated from. Only used with Vulkan secondary command >- // buffers (as opposed to ANGLE's SecondaryCommandBuffer). >- CommandPool *mCommandPool; >+ // When using Vulkan secondary command buffers, each subpass must be recorded in a separate >+ // command buffer. Currently ANGLE produces render passes with at most 2 subpasses. Once >+ // framebuffer-fetch is appropriately implemented to use subpasses, this array must be made >+ // dynamic. >+ static constexpr size_t kMaxSubpassCount = 2; >+ std::array<RenderPassCommandBuffer, kMaxSubpassCount> mCommandBuffers; >+ uint32_t mCurrentSubpass; > > // RenderPass state > uint32_t mCounter; >@@ -1331,17 +1295,6 @@ class CommandBufferHelper : angle::NonCopyable > bool mRebindTransformFeedbackBuffers; > bool mIsTransformFeedbackActiveUnpaused; > >- bool mIsRenderPassCommandBuffer; >- >- // Whether the command buffers contains any draw/dispatch calls that possibly output data >- // through storage buffers and images. This is used to determine whether glMemoryBarrier* >- // should flush the command buffer. >- bool mHasShaderStorageOutput; >- // Whether glMemoryBarrier has been called while commands are recorded in this command buffer. >- // This is used to know when to check and potentially flush the command buffer if storage >- // buffers and images are used in it. >- bool mHasGLMemoryBarrierIssued; >- > // State tracking for the maximum (Write been the highest) depth access during the entire > // renderpass. Note that this does not include VK_ATTACHMENT_LOAD_OP_CLEAR which is tracked > // separately. This is done this way to allow clear op to being optimized out when we find out >@@ -1352,6 +1305,7 @@ class CommandBufferHelper : angle::NonCopyable > ResourceAccess mStencilAccess; > > // State tracking for whether to optimize the storeOp to DONT_CARE >+ uint32_t mPreviousSubpassesCmdCount; > uint32_t mDepthCmdCountInvalidated; > uint32_t mDepthCmdCountDisabled; > uint32_t mStencilCmdCountInvalidated; >@@ -1363,9 +1317,8 @@ class CommandBufferHelper : angle::NonCopyable > PackedAttachmentIndex mDepthStencilAttachmentIndex; > > // Tracks resources used in the command buffer. >- // For Buffers, we track the read/write access type so we can enable simultaneous reads. >- // Images have unique layouts unlike buffers therefore we don't support multi-read. >- angle::FastIntegerMap<BufferAccess> mUsedBuffers; >+ // Images have unique layouts unlike buffers therefore we can't support simultaneous reads with >+ // different layout. > angle::FastIntegerSet mRenderPassUsedImages; > > ImageHelper *mDepthStencilImage; >@@ -1386,33 +1339,31 @@ class CommandBufferHelper : angle::NonCopyable > > // The following class helps support both Vulkan and ANGLE secondary command buffers by > // encapsulating their differences. >+template <typename CommandBufferT, typename CommandBufferHelperT> > class CommandBufferRecycler > { > public: >- CommandBufferRecycler(); >- ~CommandBufferRecycler(); >+ CommandBufferRecycler() = default; >+ ~CommandBufferRecycler() = default; > > void onDestroy(); > > angle::Result getCommandBufferHelper(Context *context, >- bool hasRenderPass, > CommandPool *commandPool, >- CommandBufferHelper **commandBufferHelperOut); >+ CommandBufferHelperT **commandBufferHelperOut); > >- void recycleCommandBufferHelper(VkDevice device, CommandBufferHelper **commandBuffer); >+ void recycleCommandBufferHelper(VkDevice device, CommandBufferHelperT **commandBuffer); > >- void resetCommandBufferHelper(CommandBuffer &&commandBuffer); >+ void resetCommandBuffer(CommandBufferT &&commandBuffer); > >- SecondaryCommandBufferList &&getCommandBuffersToReset() >+ std::vector<CommandBufferT> &&releaseCommandBuffersToReset() > { > return std::move(mSecondaryCommandBuffersToReset); > } > > private: >- void recycleImpl(VkDevice device, CommandBufferHelper **commandBuffer); >- >- std::vector<vk::CommandBufferHelper *> mCommandBufferHelperFreeList; >- SecondaryCommandBufferList mSecondaryCommandBuffersToReset; >+ std::vector<CommandBufferHelperT *> mCommandBufferHelperFreeList; >+ std::vector<CommandBufferT> mSecondaryCommandBuffersToReset; > }; > > // Imagine an image going through a few layout transitions: >@@ -1527,11 +1478,6 @@ class ImageHelper final : public Resource, public angle::Subject > ImageHelper(ImageHelper &&other); > ~ImageHelper() override; > >- void initStagingBuffer(RendererVk *renderer, >- size_t imageCopyBufferAlignment, >- VkBufferUsageFlags usageFlags, >- size_t initialSize); >- > angle::Result init(Context *context, > gl::TextureType textureType, > const VkExtent3D &extents, >@@ -1600,7 +1546,8 @@ class ImageHelper final : public Resource, public angle::Subject > LevelIndex baseMipLevelVk, > uint32_t levelCount, > uint32_t baseArrayLayer, >- uint32_t layerCount) const; >+ uint32_t layerCount, >+ const gl::SamplerState &samplerState) const; > angle::Result initReinterpretedLayerImageView(Context *context, > gl::TextureType textureType, > VkImageAspectFlags aspectMask, >@@ -1676,7 +1623,7 @@ class ImageHelper final : public Resource, public angle::Subject > // Similar to releaseImage, but also notify all contexts in the same share group to stop > // accessing to it. > void releaseImageFromShareContexts(RendererVk *renderer, ContextVk *contextVk); >- void releaseStagingBuffer(RendererVk *renderer); >+ void releaseStagedUpdates(RendererVk *renderer); > > bool valid() const { return mImage.valid(); } > >@@ -1785,7 +1732,7 @@ class ImageHelper final : public Resource, public angle::Subject > const gl::Extents ©Size, > const VkImageSubresourceLayers &srcSubresources, > const VkImageSubresourceLayers &dstSubresources, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > static angle::Result CopyImageSubData(const gl::Context *context, > ImageHelper *srcImage, >@@ -1809,7 +1756,9 @@ class ImageHelper final : public Resource, public angle::Subject > > // Resolve this image into a destination image. This image should be in the TransferSrc layout. > // The destination image is automatically transitioned into TransferDst. >- void resolve(ImageHelper *dst, const VkImageResolve ®ion, CommandBuffer *commandBuffer); >+ void resolve(ImageHelper *dst, >+ const VkImageResolve ®ion, >+ OutsideRenderPassCommandBuffer *commandBuffer); > > // Data staging > void removeSingleSubresourceStagedUpdates(ContextVk *contextVk, >@@ -1826,7 +1775,6 @@ class ImageHelper final : public Resource, public angle::Subject > const gl::Offset &offset, > const gl::InternalFormat &formatInfo, > const gl::PixelUnpackState &unpack, >- DynamicBuffer *stagingBufferOverride, > GLenum type, > const uint8_t *pixels, > const Format &vkFormat, >@@ -1841,7 +1789,6 @@ class ImageHelper final : public Resource, public angle::Subject > const gl::Offset &offset, > const gl::InternalFormat &formatInfo, > const gl::PixelUnpackState &unpack, >- DynamicBuffer *stagingBufferOverride, > GLenum type, > const uint8_t *pixels, > const Format &vkFormat, >@@ -1853,7 +1800,6 @@ class ImageHelper final : public Resource, public angle::Subject > const gl::Extents &glExtents, > const gl::Offset &offset, > uint8_t **destData, >- DynamicBuffer *stagingBufferOverride, > angle::FormatID formatID); > > angle::Result stageSubresourceUpdateFromFramebuffer(const gl::Context *context, >@@ -1863,8 +1809,7 @@ class ImageHelper final : public Resource, public angle::Subject > const gl::Extents &dstExtent, > const gl::InternalFormat &formatInfo, > ImageAccess access, >- FramebufferVk *framebufferVk, >- DynamicBuffer *stagingBufferOverride); >+ FramebufferVk *framebufferVk); > > void stageSubresourceUpdateFromImage(RefCounted<ImageHelper> *image, > const gl::ImageIndex &index, >@@ -1929,10 +1874,13 @@ class ImageHelper final : public Resource, public angle::Subject > uint32_t layerCount) const; > bool hasStagedUpdatesInAllocatedLevels() const; > >+ bool removeStagedClearUpdatesAndReturnColor(gl::LevelIndex levelGL, >+ const VkClearColorValue **color); >+ > void recordWriteBarrier(Context *context, > VkImageAspectFlags aspectMask, > ImageLayout newLayout, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > barrierImpl(context, aspectMask, newLayout, mCurrentQueueFamilyIndex, commandBuffer); > } >@@ -1950,7 +1898,7 @@ class ImageHelper final : public Resource, public angle::Subject > void recordReadBarrier(Context *context, > VkImageAspectFlags aspectMask, > ImageLayout newLayout, >- CommandBuffer *commandBuffer) >+ OutsideRenderPassCommandBuffer *commandBuffer) > { > if (!isReadBarrierNecessary(newLayout)) > { >@@ -1969,7 +1917,7 @@ class ImageHelper final : public Resource, public angle::Subject > VkImageAspectFlags aspectMask, > ImageLayout newLayout, > uint32_t newQueueFamilyIndex, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > // Returns true if barrier has been generated > bool updateLayoutAndBarrier(Context *context, >@@ -1982,14 +1930,14 @@ class ImageHelper final : public Resource, public angle::Subject > uint32_t externalQueueFamilyIndex, > uint32_t rendererQueueFamilyIndex, > ImageLayout currentLayout, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > // Performs an ownership transfer to an external instance or API. > void releaseToExternal(ContextVk *contextVk, > uint32_t rendererQueueFamilyIndex, > uint32_t externalQueueFamilyIndex, > ImageLayout desiredLayout, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > // Returns true if the image is owned by an external API or instance. > bool isReleasedToExternal() const; >@@ -2008,11 +1956,23 @@ class ImageHelper final : public Resource, public angle::Subject > uint32_t layerCount, > uint32_t baseLayer, > const gl::Box &sourceArea, >- BufferHelper **bufferOut, >- size_t *bufferSize, >- StagingBufferOffsetArray *bufferOffsetsOut, >+ BufferHelper *dstBuffer, > uint8_t **outDataPtr); > >+ angle::Result copySurfaceImageToBuffer(DisplayVk *displayVk, >+ gl::LevelIndex sourceLevelGL, >+ uint32_t layerCount, >+ uint32_t baseLayer, >+ const gl::Box &sourceArea, >+ vk::BufferHelper *bufferHelperOut); >+ >+ angle::Result copyBufferToSurfaceImage(DisplayVk *displayVk, >+ gl::LevelIndex destLevelGL, >+ uint32_t layerCount, >+ uint32_t baseLayer, >+ const gl::Box &destArea, >+ vk::BufferHelper *bufferHelper); >+ > static angle::Result GetReadPixelsParams(ContextVk *contextVk, > const gl::PixelPackState &packState, > gl::Buffer *packBuffer, >@@ -2039,8 +1999,7 @@ class ImageHelper final : public Resource, public angle::Subject > VkImageAspectFlagBits copyAspectFlags, > gl::LevelIndex levelGL, > uint32_t layer, >- void *pixels, >- DynamicBuffer *stagingBuffer); >+ void *pixels); > > angle::Result CalculateBufferInfo(ContextVk *contextVk, > const gl::Extents &glExtents, >@@ -2157,7 +2116,8 @@ class ImageHelper final : public Resource, public angle::Subject > { > SubresourceUpdate(); > ~SubresourceUpdate(); >- SubresourceUpdate(BufferHelper *bufferHelperIn, >+ SubresourceUpdate(RefCounted<BufferHelper> *bufferIn, >+ BufferHelper *bufferHelperIn, > const VkBufferImageCopy ©Region, > angle::FormatID formatID); > SubresourceUpdate(RefCounted<ImageHelper> *imageIn, >@@ -2188,7 +2148,11 @@ class ImageHelper final : public Resource, public angle::Subject > BufferUpdate buffer; > ImageUpdate image; > } data; >- RefCounted<ImageHelper> *image; >+ union >+ { >+ RefCounted<ImageHelper> *image; >+ RefCounted<BufferHelper> *buffer; >+ } refCounted; > }; > > void deriveExternalImageTiling(const void *createInfoChain); >@@ -2223,14 +2187,14 @@ class ImageHelper final : public Resource, public angle::Subject > LevelIndex mipLevel, > uint32_t baseArrayLayer, > uint32_t layerCount, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > void clearColor(const VkClearColorValue &color, > LevelIndex baseMipLevelVk, > uint32_t levelCount, > uint32_t baseArrayLayer, > uint32_t layerCount, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > void clearDepthStencil(VkImageAspectFlags clearAspectFlags, > const VkClearDepthStencilValue &depthStencil, >@@ -2238,7 +2202,7 @@ class ImageHelper final : public Resource, public angle::Subject > uint32_t levelCount, > uint32_t baseArrayLayer, > uint32_t layerCount, >- CommandBuffer *commandBuffer); >+ OutsideRenderPassCommandBuffer *commandBuffer); > > angle::Result clearEmulatedChannels(ContextVk *contextVk, > VkColorComponentFlags colorMaskFlags, >@@ -2259,10 +2223,12 @@ class ImageHelper final : public Resource, public angle::Subject > // Whether there are any updates in [start, end). > bool hasStagedUpdatesInLevels(gl::LevelIndex levelStart, gl::LevelIndex levelEnd) const; > >- // Used only for assertions, these functions verify that SubresourceUpdate::image references >- // have the correct ref count. This is to prevent accidental leaks. >+ // Used only for assertions, these functions verify that >+ // SubresourceUpdate::refcountedObject::image or buffer references have the correct ref count. >+ // This is to prevent accidental leaks. > bool validateSubresourceUpdateImageRefConsistent(RefCounted<ImageHelper> *image) const; >- bool validateSubresourceUpdateImageRefsConsistent() const; >+ bool validateSubresourceUpdateBufferRefConsistent(RefCounted<BufferHelper> *buffer) const; >+ bool validateSubresourceUpdateRefCountsConsistent() const; > > void resetCachedProperties(); > void setEntireContentDefined(); >@@ -2292,18 +2258,18 @@ class ImageHelper final : public Resource, public angle::Subject > const LevelContentDefinedMask &getLevelContentDefined(LevelIndex level) const; > const LevelContentDefinedMask &getLevelStencilContentDefined(LevelIndex level) const; > >- angle::Result initLayerImageViewImpl( >- Context *context, >- gl::TextureType textureType, >- VkImageAspectFlags aspectMask, >- const gl::SwizzleState &swizzleMap, >- ImageView *imageViewOut, >- LevelIndex baseMipLevelVk, >- uint32_t levelCount, >- uint32_t baseArrayLayer, >- uint32_t layerCount, >- VkFormat imageFormat, >- const VkImageViewUsageCreateInfo *imageViewUsageCreateInfo) const; >+ angle::Result initLayerImageViewImpl(Context *context, >+ gl::TextureType textureType, >+ VkImageAspectFlags aspectMask, >+ const gl::SwizzleState &swizzleMap, >+ ImageView *imageViewOut, >+ LevelIndex baseMipLevelVk, >+ uint32_t levelCount, >+ uint32_t baseArrayLayer, >+ uint32_t layerCount, >+ VkFormat imageFormat, >+ const VkImageViewUsageCreateInfo *imageViewUsageCreateInfo, >+ const gl::SamplerState *samplerState) const; > > bool canCopyWithTransformForReadPixels(const PackPixelsParams &packPixelsParams, > const angle::Format *readFormat); >@@ -2350,8 +2316,6 @@ class ImageHelper final : public Resource, public angle::Subject > uint32_t mLayerCount; > uint32_t mLevelCount; > >- // Staging buffer >- DynamicBuffer mStagingBuffer; > std::vector<std::vector<SubresourceUpdate>> mSubresourceUpdates; > > // Optimization for repeated clear with the same value. If this pointer is not null, the entire >@@ -2365,6 +2329,11 @@ class ImageHelper final : public Resource, public angle::Subject > gl::TexLevelArray<LevelContentDefinedMask> mStencilContentDefined; > }; > >+ANGLE_INLINE bool RenderPassCommandBufferHelper::usesImage(const ImageHelper &image) const >+{ >+ return mRenderPassUsedImages.contains(image.getImageSerial().getValue()); >+} >+ > // A vector of image views, such as one per level or one per layer. > using ImageViewVector = std::vector<ImageView>; > >@@ -2499,7 +2468,8 @@ class ImageViewHelper final : public Resource > uint32_t baseLayer, > uint32_t layerCount, > bool requiresSRGBViews, >- VkImageUsageFlags imageUsageFlags); >+ VkImageUsageFlags imageUsageFlags, >+ const gl::SamplerState &samplerState); > > // Creates a storage view with all layers of the level. > angle::Result getLevelStorageImageView(ContextVk *contextVk, >@@ -2595,7 +2565,8 @@ class ImageViewHelper final : public Resource > LevelIndex baseLevel, > uint32_t levelCount, > uint32_t baseLayer, >- uint32_t layerCount); >+ uint32_t layerCount, >+ const gl::SamplerState &samplerState); > > // Create SRGB-reinterpreted read views > angle::Result initSRGBReadViewsImpl(ContextVk *contextVk, >@@ -2796,12 +2767,6 @@ class ActiveHandleCounter final : angle::NonCopyable > angle::PackedEnumMap<HandleType, uint32_t> mAllocatedCounts; > }; > >-ANGLE_INLINE bool CommandBufferHelper::usesImageInRenderPass(const ImageHelper &image) const >-{ >- ASSERT(mIsRenderPassCommandBuffer); >- return mRenderPassUsedImages.contains(image.getImageSerial().getValue()); >-} >- > // Sometimes ANGLE issues a command internally, such as copies, draws and dispatches that do not > // directly correspond to the application draw/dispatch call. Before the command is recorded in the > // command buffer, the render pass may need to be broken and/or appropriate barriers may need to be >@@ -2915,6 +2880,64 @@ class CommandBufferAccess : angle::NonCopyable > ReadImages mReadImages; > WriteImages mWriteImages; > }; >+ >+// This class' responsibility is to create index buffers needed to support line loops in Vulkan. >+// In the setup phase of drawing, the createIndexBuffer method should be called with the >+// current draw call parameters. If an element array buffer is bound for an indexed draw, use >+// createIndexBufferFromElementArrayBuffer. >+// >+// If the user wants to draw a loop between [v1, v2, v3], we will create an indexed buffer with >+// these indexes: [0, 1, 2, 3, 0] to emulate the loop. >+class LineLoopHelper final : angle::NonCopyable >+{ >+ public: >+ LineLoopHelper(RendererVk *renderer); >+ ~LineLoopHelper(); >+ >+ angle::Result getIndexBufferForDrawArrays(ContextVk *contextVk, >+ uint32_t clampedVertexCount, >+ GLint firstVertex, >+ BufferHelper **bufferOut); >+ >+ angle::Result getIndexBufferForElementArrayBuffer(ContextVk *contextVk, >+ BufferVk *elementArrayBufferVk, >+ gl::DrawElementsType glIndexType, >+ int indexCount, >+ intptr_t elementArrayOffset, >+ BufferHelper **bufferOut, >+ uint32_t *indexCountOut); >+ >+ angle::Result streamIndices(ContextVk *contextVk, >+ gl::DrawElementsType glIndexType, >+ GLsizei indexCount, >+ const uint8_t *srcPtr, >+ BufferHelper **bufferOut, >+ uint32_t *indexCountOut); >+ >+ angle::Result streamIndicesIndirect(ContextVk *contextVk, >+ gl::DrawElementsType glIndexType, >+ BufferHelper *indexBuffer, >+ BufferHelper *indirectBuffer, >+ VkDeviceSize indirectBufferOffset, >+ BufferHelper **indexBufferOut, >+ BufferHelper **indirectBufferOut); >+ >+ angle::Result streamArrayIndirect(ContextVk *contextVk, >+ size_t vertexCount, >+ BufferHelper *arrayIndirectBuffer, >+ VkDeviceSize arrayIndirectBufferOffset, >+ BufferHelper **indexBufferOut, >+ BufferHelper **indexIndirectBufferOut); >+ >+ void release(ContextVk *contextVk); >+ void destroy(RendererVk *renderer); >+ >+ static void Draw(uint32_t count, uint32_t baseVertex, RenderPassCommandBuffer *commandBuffer); >+ >+ private: >+ BufferHelper mDynamicIndexBuffer; >+ BufferHelper mDynamicIndirectBuffer; >+}; > } // namespace vk > } // namespace rx > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp >index 48d5822d0d018cda00a5549add777a363d6bee35..f0725e18896a20b52ba0ba154397dd5b1ad1efd3 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp >@@ -152,11 +152,9 @@ namespace > #include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000000.inc" > #include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc" > #include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc" >-#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000003.inc" >-#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000004.inc" >-#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000005.inc" > #include "libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000000.inc" > #include "libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000001.inc" >+#include "libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000002.inc" > > // This is compressed SPIR-V binary blob and size > struct CompressedShaderBlob >@@ -338,13 +336,11 @@ constexpr CompressedShaderBlob kOverlayCull_comp_shaders[] = { > {kOverlayCull_comp_00000000, sizeof(kOverlayCull_comp_00000000)}, > {kOverlayCull_comp_00000001, sizeof(kOverlayCull_comp_00000001)}, > {kOverlayCull_comp_00000002, sizeof(kOverlayCull_comp_00000002)}, >- {kOverlayCull_comp_00000003, sizeof(kOverlayCull_comp_00000003)}, >- {kOverlayCull_comp_00000004, sizeof(kOverlayCull_comp_00000004)}, >- {kOverlayCull_comp_00000005, sizeof(kOverlayCull_comp_00000005)}, > }; > constexpr CompressedShaderBlob kOverlayDraw_comp_shaders[] = { > {kOverlayDraw_comp_00000000, sizeof(kOverlayDraw_comp_00000000)}, > {kOverlayDraw_comp_00000001, sizeof(kOverlayDraw_comp_00000001)}, >+ {kOverlayDraw_comp_00000002, sizeof(kOverlayDraw_comp_00000002)}, > }; > > angle::Result GetShader(Context *context, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni >index ff76a2856f30e920b17e3c19cf0a60ba51293c7b..a21cc6a5968828c4d5c6b2d48537927e22139196 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni >@@ -142,9 +142,7 @@ angle_vulkan_internal_shaders = [ > "shaders/gen/OverlayCull.comp.00000000.inc", > "shaders/gen/OverlayCull.comp.00000001.inc", > "shaders/gen/OverlayCull.comp.00000002.inc", >- "shaders/gen/OverlayCull.comp.00000003.inc", >- "shaders/gen/OverlayCull.comp.00000004.inc", >- "shaders/gen/OverlayCull.comp.00000005.inc", > "shaders/gen/OverlayDraw.comp.00000000.inc", > "shaders/gen/OverlayDraw.comp.00000001.inc", >+ "shaders/gen/OverlayDraw.comp.00000002.inc", > ] >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h >index 1a753e57be5a13b7fdf1ad5a43ae6ac7687241d5..7b2fc52b8f8503705a2280e95aa7b1bdfac12eae 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h >@@ -168,14 +168,9 @@ enum SubgroupSize > { > kIs8x4 = 0x00000000, > kIs8x8 = 0x00000001, >+ kIs4x4 = 0x00000002, > }; >-enum SubgroupOp >-{ >- kSupportsBallot = 0x00000000, >- kSupportsArithmetic = 0x00000002, >- kSupportsNone = 0x00000004, >-}; >-constexpr size_t kArrayLen = 0x00000006; >+constexpr size_t kArrayLen = 0x00000003; > } // namespace OverlayCull_comp > > namespace OverlayDraw_comp >@@ -184,8 +179,9 @@ enum SubgroupSize > { > kIs8x4 = 0x00000000, > kIs8x8 = 0x00000001, >+ kIs4x4 = 0x00000002, > }; >-constexpr size_t kArrayLen = 0x00000002; >+constexpr size_t kArrayLen = 0x00000003; > } // namespace OverlayDraw_comp > > } // namespace InternalShader >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.cpp >index e7acfc65460f51312590357e5aaf03a2245a93b0..4eeabb188eb9e9f8070a76469b8037a93443937a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.cpp >@@ -481,6 +481,15 @@ BufferMemory::BufferMemory() : mClientBuffer(nullptr), mMappedMemory(nullptr) {} > > BufferMemory::~BufferMemory() = default; > >+BufferMemory &BufferMemory::operator=(BufferMemory &&other) >+{ >+ std::swap(mClientBuffer, other.mClientBuffer); >+ std::swap(mMappedMemory, other.mMappedMemory); >+ std::swap(mAllocation, other.mAllocation); >+ std::swap(mExternalMemory, other.mExternalMemory); >+ return *this; >+} >+ > angle::Result BufferMemory::initExternal(void *clientBuffer) > { > ASSERT(clientBuffer != nullptr); >@@ -524,23 +533,16 @@ void BufferMemory::destroy(RendererVk *renderer) > } > } > >-void BufferMemory::flush(RendererVk *renderer, >- VkMemoryMapFlags memoryPropertyFlags, >- VkDeviceSize offset, >- VkDeviceSize size) >+void BufferMemory::flush(RendererVk *renderer, VkDeviceSize offset, VkDeviceSize size) > { > if (isExternalBuffer()) > { >- // if the memory type is not host coherent, we perform an explicit flush >- if ((memoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0) >- { >- VkMappedMemoryRange mappedRange = {}; >- mappedRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; >- mappedRange.memory = mExternalMemory.getHandle(); >- mappedRange.offset = offset; >- mappedRange.size = size; >- mExternalMemory.flush(renderer->getDevice(), mappedRange); >- } >+ VkMappedMemoryRange mappedRange = {}; >+ mappedRange.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; >+ mappedRange.memory = mExternalMemory.getHandle(); >+ mappedRange.offset = offset; >+ mappedRange.size = size; >+ mExternalMemory.flush(renderer->getDevice(), mappedRange); > } > else > { >@@ -572,17 +574,17 @@ void BufferMemory::invalidate(RendererVk *renderer, > } > } > >-angle::Result BufferMemory::mapImpl(ContextVk *contextVk, VkDeviceSize size) >+angle::Result BufferMemory::mapImpl(Context *context, VkDeviceSize size) > { > if (isExternalBuffer()) > { >- ANGLE_VK_TRY(contextVk, mExternalMemory.map(contextVk->getRenderer()->getDevice(), 0, size, >- 0, &mMappedMemory)); >+ ANGLE_VK_TRY(context, mExternalMemory.map(context->getRenderer()->getDevice(), 0, size, 0, >+ &mMappedMemory)); > } > else > { >- ANGLE_VK_TRY(contextVk, >- mAllocation.map(contextVk->getRenderer()->getAllocator(), &mMappedMemory)); >+ ANGLE_VK_TRY(context, >+ mAllocation.map(context->getRenderer()->getAllocator(), &mMappedMemory)); > } > > return angle::Result::Continue; >@@ -614,21 +616,20 @@ angle::Result StagingBuffer::init(Context *context, VkDeviceSize size, StagingUs > VkMemoryPropertyFlags requiredFlags = > VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; > >- RendererVk *renderer = context->getRenderer(); >+ RendererVk *renderer = context->getRenderer(); >+ const Allocator &allocator = renderer->getAllocator(); > >- uint32_t memoryTypeIndex = 0; >- BufferMemoryAllocator &bufferMemoryAllocator = renderer->getBufferMemoryAllocator(); >- ANGLE_VK_TRY(context, bufferMemoryAllocator.createBuffer( >- renderer, createInfo, requiredFlags, preferredFlags, >- renderer->getFeatures().persistentlyMappedBuffers.enabled, >- &memoryTypeIndex, &mBuffer, &mAllocation)); >+ uint32_t memoryTypeIndex = 0; >+ ANGLE_VK_TRY(context, >+ allocator.createBuffer(createInfo, requiredFlags, preferredFlags, >+ renderer->getFeatures().persistentlyMappedBuffers.enabled, >+ &memoryTypeIndex, &mBuffer, &mAllocation)); > mSize = static_cast<size_t>(size); > > // Wipe memory to an invalid value when the 'allocateNonZeroMemory' feature is enabled. The > // invalid values ensures our testing doesn't assume zero-initialized memory. > if (renderer->getFeatures().allocateNonZeroMemory.enabled) > { >- const Allocator &allocator = renderer->getAllocator(); > ANGLE_TRY(InitMappableAllocation(context, allocator, &mAllocation, size, kNonZeroInitValue, > requiredFlags)); > } >@@ -885,8 +886,8 @@ void GarbageObject::destroy(RendererVk *renderer) > case HandleType::Allocation: > vma::FreeMemory(renderer->getAllocator().getHandle(), (VmaAllocation)mHandle); > break; >- case HandleType::BufferSubAllocation: >- DestroyVmaBufferSubAllocation((VmaBufferSubAllocation)mHandle); >+ case HandleType::BufferSuballocation: >+ DestroyVmaBufferSuballocation(renderer, (VmaBufferSuballocation)mHandle); > break; > default: > UNREACHABLE(); >@@ -1712,7 +1713,6 @@ BufferBlock::~BufferBlock() > void BufferBlock::destroy(RendererVk *renderer) > { > VkDevice device = renderer->getDevice(); >- ASSERT(mVirtualBlock.valid()); > > if (mMappedMemory) > { >@@ -1736,6 +1736,7 @@ angle::Result BufferBlock::init(ContextVk *contextVk, > ASSERT(!mBuffer.valid()); > ASSERT(!mAllocation.valid()); > >+ mVirtualBlockMutex.init(renderer->isAsyncCommandQueueEnabled()); > ANGLE_VK_TRY(contextVk, mVirtualBlock.init(renderer->getDevice(), flags, size)); > > mBuffer = std::move(buffer); >@@ -1748,46 +1749,29 @@ angle::Result BufferBlock::init(ContextVk *contextVk, > return angle::Result::Continue; > } > >-VirtualBlock &BufferBlock::getVirtualBlock() >-{ >- return mVirtualBlock; >-} >- >-const Buffer &BufferBlock::getBuffer() const >+void BufferBlock::initWithoutVirtualBlock(Context *context, >+ Buffer &buffer, >+ Allocation &allocation, >+ VkMemoryPropertyFlags memoryPropertyFlags, >+ VkDeviceSize size) > { >- return mBuffer; >-} >- >-const Allocation &BufferBlock::getAllocation() const >-{ >- return mAllocation; >-} >- >-VkMemoryPropertyFlags BufferBlock::getMemoryPropertyFlags() const >-{ >- return mMemoryPropertyFlags; >-} >- >-VkDeviceSize BufferBlock::getMemorySize() const >-{ >- return mSize; >-} >- >-VkBool32 BufferBlock::isEmpty() const >-{ >- return vma::IsVirtualBlockEmpty(mVirtualBlock.getHandle()); >-} >+ RendererVk *renderer = context->getRenderer(); >+ ASSERT(!mVirtualBlock.valid()); >+ ASSERT(!mBuffer.valid()); >+ ASSERT(!mAllocation.valid()); > >-bool BufferBlock::isMapped() const >-{ >- return mMappedMemory != nullptr; >+ mBuffer = std::move(buffer); >+ mAllocation = std::move(allocation); >+ mMemoryPropertyFlags = memoryPropertyFlags; >+ mSize = size; >+ mMappedMemory = nullptr; >+ mSerial = renderer->getResourceSerialFactory().generateBufferSerial(); > } > >-angle::Result BufferBlock::map(ContextVk *contextVk) >+angle::Result BufferBlock::map(Context *context) > { > ASSERT(mMappedMemory == nullptr); >- ANGLE_VK_TRY(contextVk, >- mAllocation.map(contextVk->getRenderer()->getAllocator(), &mMappedMemory)); >+ ANGLE_VK_TRY(context, mAllocation.map(context->getRenderer()->getAllocator(), &mMappedMemory)); > return angle::Result::Continue; > } > >@@ -1797,20 +1781,9 @@ void BufferBlock::unmap(const Allocator &allocator) > mMappedMemory = nullptr; > } > >-uint8_t *BufferBlock::getMappedMemory() const >-{ >- ASSERT(mMappedMemory != nullptr); >- return mMappedMemory; >-} >- >-VkResult BufferBlock::allocate(VkDeviceSize size, VkDeviceSize alignment, VkDeviceSize *offsetOut) >-{ >- mCountRemainsEmpty = 0; >- return mVirtualBlock.allocate(size, alignment, offsetOut); >-} >- > void BufferBlock::free(VkDeviceSize offset) > { >+ std::lock_guard<ConditionalMutex> lock(mVirtualBlockMutex); > mVirtualBlock.free(offset); > } > >@@ -1818,63 +1791,5 @@ int32_t BufferBlock::getAndIncrementEmptyCounter() > { > return ++mCountRemainsEmpty; > } >- >-// BufferSubAllocation implementation. >-void BufferSubAllocation::destroy(VkDevice device) >-{ >- if (valid()) >- { >- DestroyVmaBufferSubAllocation(mHandle); >- mHandle = VK_NULL_HANDLE; >- } >-} >- >-VkResult BufferSubAllocation::init(VkDevice device, >- BufferBlock *block, >- VkDeviceSize offset, >- VkDeviceSize size) >-{ >- ASSERT(!valid()); >- ASSERT(block != nullptr); >- ASSERT(offset != VK_WHOLE_SIZE); >- return CreateVmaBufferSubAllocation(block, offset, size, &mHandle); >-} >- >-const BufferBlock *BufferSubAllocation::getBlock() const >-{ >- return mHandle->mBufferBlock; >-} >- >-const Buffer &BufferSubAllocation::getBuffer() const >-{ >- return mHandle->mBufferBlock->getBuffer(); >-} >- >-const Allocation &BufferSubAllocation::getAllocation() const >-{ >- return mHandle->mBufferBlock->getAllocation(); >-} >- >-bool BufferSubAllocation::isMapped() const >-{ >- return mHandle->mBufferBlock->isMapped(); >-} >-uint8_t *BufferSubAllocation::getMappedMemory() const >-{ >- return mHandle->mBufferBlock->getMappedMemory() + getOffset(); >-} >-void BufferSubAllocation::flush(const Allocator &allocator) const >-{ >- mHandle->mBufferBlock->getAllocation().flush(allocator, getOffset(), mHandle->mSize); >-} >-void BufferSubAllocation::invalidate(const Allocator &allocator) const >-{ >- mHandle->mBufferBlock->getAllocation().invalidate(allocator, getOffset(), mHandle->mSize); >-} >- >-VkDeviceSize BufferSubAllocation::getOffset() const >-{ >- return mHandle->mOffset; >-} > } // namespace vk > } // namespace rx >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.h >index 564b79ce2aed3066725959b6b9a33956bdb2f719..a8afa23c3b5325af7a765b6d0d732de0d48b78fc 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_utils.h >@@ -12,6 +12,7 @@ > > #include <atomic> > #include <limits> >+#include <queue> > > #include "GLSLANG/ShaderLang.h" > #include "common/FixedVector.h" >@@ -201,13 +202,28 @@ class Context : angle::NonCopyable > > class RenderPassDesc; > >-#if ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS >-using CommandBuffer = priv::SecondaryCommandBuffer; >+#if ANGLE_USE_CUSTOM_VULKAN_OUTSIDE_RENDER_PASS_CMD_BUFFERS >+using OutsideRenderPassCommandBuffer = priv::SecondaryCommandBuffer; > #else >-using CommandBuffer = VulkanSecondaryCommandBuffer; >+using OutsideRenderPassCommandBuffer = VulkanSecondaryCommandBuffer; >+#endif >+#if ANGLE_USE_CUSTOM_VULKAN_RENDER_PASS_CMD_BUFFERS >+using RenderPassCommandBuffer = priv::SecondaryCommandBuffer; >+#else >+using RenderPassCommandBuffer = VulkanSecondaryCommandBuffer; > #endif > >-using SecondaryCommandBufferList = std::vector<CommandBuffer>; >+struct SecondaryCommandBufferList >+{ >+ std::vector<OutsideRenderPassCommandBuffer> outsideRenderPassCommandBuffers; >+ std::vector<RenderPassCommandBuffer> renderPassCommandBuffers; >+}; >+ >+struct SecondaryCommandPools >+{ >+ CommandPool outsideRenderPassPool; >+ CommandPool renderPassPool; >+}; > > VkImageAspectFlags GetDepthStencilAspectFlags(const angle::Format &format); > VkImageAspectFlags GetFormatAspectFlags(const angle::Format &format); >@@ -259,6 +275,12 @@ GetImplType<T> *GetImpl(const T *glObject) > return GetImplAs<GetImplType<T>>(glObject); > } > >+template <typename T> >+GetImplType<T> *SafeGetImpl(const T *glObject) >+{ >+ return SafeGetImplAs<GetImplType<T>>(glObject); >+} >+ > template <> > inline OverlayVk *GetImpl(const gl::MockOverlay *glObject) > { >@@ -345,7 +367,7 @@ using GarbageAndSerial = ObjectAndSerial<GarbageList>; > > // Houses multiple lists of garbage objects. Each sub-list has a different lifetime. They should be > // sorted such that later-living garbage is ordered later in the list. >-using GarbageQueue = std::vector<GarbageAndSerial>; >+using GarbageQueue = std::queue<GarbageAndSerial>; > > class MemoryProperties final : angle::NonCopyable > { >@@ -379,25 +401,25 @@ class BufferMemory : angle::NonCopyable > public: > BufferMemory(); > ~BufferMemory(); >+ >+ BufferMemory &operator=(BufferMemory &&other); >+ > angle::Result initExternal(void *clientBuffer); > angle::Result init(); > > void destroy(RendererVk *renderer); > >- angle::Result map(ContextVk *contextVk, VkDeviceSize size, uint8_t **ptrOut) >+ angle::Result map(Context *context, VkDeviceSize size, uint8_t **ptrOut) > { > if (mMappedMemory == nullptr) > { >- ANGLE_TRY(mapImpl(contextVk, size)); >+ ANGLE_TRY(mapImpl(context, size)); > } > *ptrOut = mMappedMemory; > return angle::Result::Continue; > } > void unmap(RendererVk *renderer); >- void flush(RendererVk *renderer, >- VkMemoryMapFlags memoryPropertyFlags, >- VkDeviceSize offset, >- VkDeviceSize size); >+ void flush(RendererVk *renderer, VkDeviceSize offset, VkDeviceSize size); > void invalidate(RendererVk *renderer, > VkMemoryMapFlags memoryPropertyFlags, > VkDeviceSize offset, >@@ -410,7 +432,7 @@ class BufferMemory : angle::NonCopyable > Allocation *getMemoryObject() { return &mAllocation; } > > private: >- angle::Result mapImpl(ContextVk *contextVk, VkDeviceSize size); >+ angle::Result mapImpl(Context *context, VkDeviceSize size); > > Allocation mAllocation; // use mAllocation if isExternalBuffer() is false > DeviceMemory mExternalMemory; // use mExternalMemory if isExternalBuffer() is true >@@ -931,11 +953,15 @@ class BufferBlock final : angle::NonCopyable > Allocation &allocation, > VkMemoryPropertyFlags memoryPropertyFlags, > VkDeviceSize size); >+ void initWithoutVirtualBlock(Context *context, >+ Buffer &buffer, >+ Allocation &allocation, >+ VkMemoryPropertyFlags memoryPropertyFlags, >+ VkDeviceSize size); > > BufferBlock &operator=(BufferBlock &&other); > >- VirtualBlock &getVirtualBlock(); >- const Buffer &getBuffer() const; >+ Buffer *getBuffer(); > const Allocation &getAllocation() const; > BufferSerial getBufferSerial() const { return mSerial; } > >@@ -944,10 +970,13 @@ class BufferBlock final : angle::NonCopyable > > VkResult allocate(VkDeviceSize size, VkDeviceSize alignment, VkDeviceSize *offsetOut); > void free(VkDeviceSize offset); >- VkBool32 isEmpty() const; >+ VkBool32 isEmpty(); > >+ bool hasVirtualBlock() const { return mVirtualBlock.valid(); } >+ bool isHostVisible() const; >+ bool isCoherent() const; > bool isMapped() const; >- angle::Result map(ContextVk *contextVk); >+ angle::Result map(Context *context); > void unmap(const Allocator &allocator); > uint8_t *getMappedMemory() const; > >@@ -956,7 +985,11 @@ class BufferBlock final : angle::NonCopyable > int32_t getAndIncrementEmptyCounter(); > > private: >+ // Protect multi-thread access to mVirtualBlock, which could be possible when asyncCommandQueue >+ // is enabled. >+ ConditionalMutex mVirtualBlockMutex; > VirtualBlock mVirtualBlock; >+ > Buffer mBuffer; > Allocation mAllocation; > VkMemoryPropertyFlags mMemoryPropertyFlags; >@@ -970,39 +1003,63 @@ class BufferBlock final : angle::NonCopyable > }; > using BufferBlockPointerVector = std::vector<std::unique_ptr<BufferBlock>>; > >-// BufferSubAllocation >-struct VmaBufferSubAllocation_T >+// BufferSuballocation >+struct VmaBufferSuballocation_T > { > BufferBlock *mBufferBlock; > VkDeviceSize mOffset; > VkDeviceSize mSize; > }; >-VK_DEFINE_HANDLE(VmaBufferSubAllocation) >+VK_DEFINE_HANDLE(VmaBufferSuballocation) > ANGLE_INLINE VkResult >-CreateVmaBufferSubAllocation(BufferBlock *block, >+CreateVmaBufferSuballocation(BufferBlock *block, > VkDeviceSize offset, > VkDeviceSize size, >- VmaBufferSubAllocation *vmaBufferSubAllocationOut) >+ VmaBufferSuballocation *vmaBufferSuballocationOut) > { >- *vmaBufferSubAllocationOut = new VmaBufferSubAllocation_T{block, offset, size}; >- return *vmaBufferSubAllocationOut != VK_NULL_HANDLE ? VK_SUCCESS : VK_ERROR_OUT_OF_HOST_MEMORY; >+ *vmaBufferSuballocationOut = new VmaBufferSuballocation_T{block, offset, size}; >+ return *vmaBufferSuballocationOut != VK_NULL_HANDLE ? VK_SUCCESS : VK_ERROR_OUT_OF_HOST_MEMORY; > } >-ANGLE_INLINE void DestroyVmaBufferSubAllocation(VmaBufferSubAllocation vmaBufferSubAllocation) >+ANGLE_INLINE void DestroyVmaBufferSuballocation(RendererVk *renderer, >+ VmaBufferSuballocation vmaBufferSuballocation) > { >- vmaBufferSubAllocation->mBufferBlock->getVirtualBlock().free(vmaBufferSubAllocation->mOffset); >- delete vmaBufferSubAllocation; >+ ASSERT(vmaBufferSuballocation->mBufferBlock); >+ if (vmaBufferSuballocation->mBufferBlock->hasVirtualBlock()) >+ { >+ vmaBufferSuballocation->mBufferBlock->free(vmaBufferSuballocation->mOffset); >+ } >+ else >+ { >+ // When virtual block is invalid, this is the standalone buffer that are created by >+ // BufferSuballocation::initWithEntireBuffer call. In this case, vmaBufferSuballocation owns >+ // block, we must properly delete the block object. >+ vmaBufferSuballocation->mBufferBlock->destroy(renderer); >+ delete vmaBufferSuballocation->mBufferBlock; >+ } >+ >+ delete vmaBufferSuballocation; > } > >-class BufferSubAllocation final : public WrappedObject<BufferSubAllocation, VmaBufferSubAllocation> >+class BufferSuballocation final : public WrappedObject<BufferSuballocation, VmaBufferSuballocation> > { > public: >- BufferSubAllocation() = default; >- void destroy(VkDevice device); >+ BufferSuballocation() = default; >+ void destroy(RendererVk *renderer); >+ > VkResult init(VkDevice device, BufferBlock *block, VkDeviceSize offset, VkDeviceSize size); >+ VkResult initWithEntireBuffer(Context *context, >+ Buffer &buffer, >+ Allocation &allocation, >+ VkMemoryPropertyFlags memoryPropertyFlags, >+ VkDeviceSize size); > >- const BufferBlock *getBlock() const; >+ BufferBlock *getBlock() const; > const Buffer &getBuffer() const; >+ VkDeviceSize getSize() const; > const Allocation &getAllocation() const; >+ VkMemoryMapFlags getMemoryPropertyFlags() const; >+ bool isHostVisible() const; >+ bool isCoherent() const; > bool isMapped() const; > uint8_t *getMappedMemory() const; > void flush(const Allocator &allocator) const; >@@ -1010,6 +1067,167 @@ class BufferSubAllocation final : public WrappedObject<BufferSubAllocation, VmaB > VkDeviceSize getOffset() const; > }; > >+// BufferBlock implementation. >+ANGLE_INLINE Buffer *BufferBlock::getBuffer() >+{ >+ return &mBuffer; >+} >+ >+ANGLE_INLINE const Allocation &BufferBlock::getAllocation() const >+{ >+ return mAllocation; >+} >+ >+ANGLE_INLINE VkMemoryPropertyFlags BufferBlock::getMemoryPropertyFlags() const >+{ >+ return mMemoryPropertyFlags; >+} >+ >+ANGLE_INLINE VkDeviceSize BufferBlock::getMemorySize() const >+{ >+ return mSize; >+} >+ >+ANGLE_INLINE VkBool32 BufferBlock::isEmpty() >+{ >+ std::lock_guard<ConditionalMutex> lock(mVirtualBlockMutex); >+ return vma::IsVirtualBlockEmpty(mVirtualBlock.getHandle()); >+} >+ >+ANGLE_INLINE bool BufferBlock::isHostVisible() const >+{ >+ return (mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0; >+} >+ >+ANGLE_INLINE bool BufferBlock::isCoherent() const >+{ >+ return (mMemoryPropertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0; >+} >+ >+ANGLE_INLINE bool BufferBlock::isMapped() const >+{ >+ return mMappedMemory != nullptr; >+} >+ >+ANGLE_INLINE uint8_t *BufferBlock::getMappedMemory() const >+{ >+ ASSERT(mMappedMemory != nullptr); >+ return mMappedMemory; >+} >+ >+ANGLE_INLINE VkResult BufferBlock::allocate(VkDeviceSize size, >+ VkDeviceSize alignment, >+ VkDeviceSize *offsetOut) >+{ >+ std::lock_guard<ConditionalMutex> lock(mVirtualBlockMutex); >+ mCountRemainsEmpty = 0; >+ return mVirtualBlock.allocate(size, alignment, offsetOut); >+} >+ >+// BufferSuballocation implementation. >+ANGLE_INLINE void BufferSuballocation::destroy(RendererVk *renderer) >+{ >+ if (valid()) >+ { >+ DestroyVmaBufferSuballocation(renderer, mHandle); >+ mHandle = VK_NULL_HANDLE; >+ } >+} >+ >+ANGLE_INLINE VkResult BufferSuballocation::init(VkDevice device, >+ BufferBlock *block, >+ VkDeviceSize offset, >+ VkDeviceSize size) >+{ >+ ASSERT(!valid()); >+ ASSERT(block != nullptr); >+ ASSERT(offset != VK_WHOLE_SIZE); >+ return CreateVmaBufferSuballocation(block, offset, size, &mHandle); >+} >+ >+ANGLE_INLINE VkResult >+BufferSuballocation::initWithEntireBuffer(Context *context, >+ Buffer &buffer, >+ Allocation &allocation, >+ VkMemoryPropertyFlags memoryPropertyFlags, >+ VkDeviceSize size) >+{ >+ ASSERT(!valid()); >+ >+ std::unique_ptr<BufferBlock> block = std::make_unique<BufferBlock>(); >+ block->initWithoutVirtualBlock(context, buffer, allocation, memoryPropertyFlags, size); >+ >+ VmaBufferSuballocation vmaBufferSuballocation = new VmaBufferSuballocation_T; >+ if (vmaBufferSuballocation == nullptr) >+ { >+ return VK_ERROR_OUT_OF_HOST_MEMORY; >+ } >+ else >+ { >+ vmaBufferSuballocation->mBufferBlock = block.release(); >+ vmaBufferSuballocation->mOffset = 0; >+ vmaBufferSuballocation->mSize = vmaBufferSuballocation->mBufferBlock->getMemorySize(); >+ } >+ >+ mHandle = vmaBufferSuballocation; >+ return VK_SUCCESS; >+} >+ >+ANGLE_INLINE BufferBlock *BufferSuballocation::getBlock() const >+{ >+ return mHandle->mBufferBlock; >+} >+ >+ANGLE_INLINE const Buffer &BufferSuballocation::getBuffer() const >+{ >+ return *getBlock()->getBuffer(); >+} >+ >+ANGLE_INLINE VkDeviceSize BufferSuballocation::getSize() const >+{ >+ return mHandle->mSize; >+} >+ >+ANGLE_INLINE const Allocation &BufferSuballocation::getAllocation() const >+{ >+ return mHandle->mBufferBlock->getAllocation(); >+} >+ >+ANGLE_INLINE VkMemoryMapFlags BufferSuballocation::getMemoryPropertyFlags() const >+{ >+ return mHandle->mBufferBlock->getMemoryPropertyFlags(); >+} >+ >+ANGLE_INLINE bool BufferSuballocation::isHostVisible() const >+{ >+ return mHandle->mBufferBlock->isHostVisible(); >+} >+ANGLE_INLINE bool BufferSuballocation::isCoherent() const >+{ >+ return mHandle->mBufferBlock->isCoherent(); >+} >+ANGLE_INLINE bool BufferSuballocation::isMapped() const >+{ >+ return mHandle->mBufferBlock->isMapped(); >+} >+ANGLE_INLINE uint8_t *BufferSuballocation::getMappedMemory() const >+{ >+ return mHandle->mBufferBlock->getMappedMemory() + getOffset(); >+} >+ANGLE_INLINE void BufferSuballocation::flush(const Allocator &allocator) const >+{ >+ mHandle->mBufferBlock->getAllocation().flush(allocator, getOffset(), mHandle->mSize); >+} >+ANGLE_INLINE void BufferSuballocation::invalidate(const Allocator &allocator) const >+{ >+ mHandle->mBufferBlock->getAllocation().invalidate(allocator, getOffset(), mHandle->mSize); >+} >+ >+ANGLE_INLINE VkDeviceSize BufferSuballocation::getOffset() const >+{ >+ return mHandle->mOffset; >+} >+ > #if defined(ANGLE_ENABLE_PERF_COUNTER_OUTPUT) > constexpr bool kOutputCumulativePerfCounters = ANGLE_ENABLE_PERF_COUNTER_OUTPUT; > #else >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_wrapper.h b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_wrapper.h >index 57abc1efba0ca2a0d055cd0ca6ce7b7590ff7314..5724ef3c863cc69490df7e09ace33502b0024ea5 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_wrapper.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/vk_wrapper.h >@@ -34,7 +34,8 @@ namespace vk > FUNC(Allocation) \ > FUNC(Allocator) \ > FUNC(Buffer) \ >- FUNC(BufferSubAllocation) \ >+ FUNC(BufferBlock) \ >+ FUNC(BufferSuballocation) \ > FUNC(BufferView) \ > FUNC(CommandPool) \ > FUNC(DescriptorPool) \ >@@ -457,6 +458,22 @@ class Allocator : public WrappedObject<Allocator, VmaAllocator> > uint32_t apiVersion, > VkDeviceSize preferredLargeHeapBlockSize); > >+ // Initializes the buffer handle and memory allocation. >+ VkResult createBuffer(const VkBufferCreateInfo &bufferCreateInfo, >+ VkMemoryPropertyFlags requiredFlags, >+ VkMemoryPropertyFlags preferredFlags, >+ bool persistentlyMappedBuffers, >+ uint32_t *memoryTypeIndexOut, >+ Buffer *bufferOut, >+ Allocation *allocationOut) const; >+ >+ void getMemoryTypeProperties(uint32_t memoryTypeIndex, VkMemoryPropertyFlags *flagsOut) const; >+ VkResult findMemoryTypeIndexForBufferInfo(const VkBufferCreateInfo &bufferCreateInfo, >+ VkMemoryPropertyFlags requiredFlags, >+ VkMemoryPropertyFlags preferredFlags, >+ bool persistentlyMappedBuffers, >+ uint32_t *memoryTypeIndexOut) const; >+ > void buildStatsString(char **statsString, VkBool32 detailedMap); > void freeStatsString(char *statsString); > }; >@@ -473,7 +490,7 @@ class Allocation final : public WrappedObject<Allocation, VmaAllocation> > void invalidate(const Allocator &allocator, VkDeviceSize offset, VkDeviceSize size) const; > > private: >- friend class BufferMemoryAllocator; >+ friend class Allocator; > }; > > class RenderPass final : public WrappedObject<RenderPass, VkRenderPass> >@@ -504,7 +521,7 @@ class Buffer final : public WrappedObject<Buffer, VkBuffer> > void getMemoryRequirements(VkDevice device, VkMemoryRequirements *memoryRequirementsOut); > > private: >- friend class BufferMemoryAllocator; >+ friend class Allocator; > }; > > class BufferView final : public WrappedObject<BufferView, VkBufferView> >@@ -1355,6 +1372,42 @@ ANGLE_INLINE VkResult Allocator::init(VkPhysicalDevice physicalDevice, > preferredLargeHeapBlockSize, &mHandle); > } > >+ANGLE_INLINE VkResult Allocator::createBuffer(const VkBufferCreateInfo &bufferCreateInfo, >+ VkMemoryPropertyFlags requiredFlags, >+ VkMemoryPropertyFlags preferredFlags, >+ bool persistentlyMappedBuffers, >+ uint32_t *memoryTypeIndexOut, >+ Buffer *bufferOut, >+ Allocation *allocationOut) const >+{ >+ ASSERT(valid()); >+ ASSERT(bufferOut && !bufferOut->valid()); >+ ASSERT(allocationOut && !allocationOut->valid()); >+ return vma::CreateBuffer(mHandle, &bufferCreateInfo, requiredFlags, preferredFlags, >+ persistentlyMappedBuffers, memoryTypeIndexOut, &bufferOut->mHandle, >+ &allocationOut->mHandle); >+} >+ >+ANGLE_INLINE void Allocator::getMemoryTypeProperties(uint32_t memoryTypeIndex, >+ VkMemoryPropertyFlags *flagsOut) const >+{ >+ ASSERT(valid()); >+ vma::GetMemoryTypeProperties(mHandle, memoryTypeIndex, flagsOut); >+} >+ >+ANGLE_INLINE VkResult >+Allocator::findMemoryTypeIndexForBufferInfo(const VkBufferCreateInfo &bufferCreateInfo, >+ VkMemoryPropertyFlags requiredFlags, >+ VkMemoryPropertyFlags preferredFlags, >+ bool persistentlyMappedBuffers, >+ uint32_t *memoryTypeIndexOut) const >+{ >+ ASSERT(valid()); >+ return vma::FindMemoryTypeIndexForBufferInfo(mHandle, &bufferCreateInfo, requiredFlags, >+ preferredFlags, persistentlyMappedBuffers, >+ memoryTypeIndexOut); >+} >+ > ANGLE_INLINE void Allocator::buildStatsString(char **statsString, VkBool32 detailedMap) > { > ASSERT(valid()); >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp >index 46aa1b82317f71a98987d5eb1071b440b4222594..496b6f06132e5e302993467b4ea0c37c12ce7315 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/vulkan/win32/DisplayVkWin32.cpp >@@ -63,26 +63,27 @@ egl::Error DisplayVkWin32::initialize(egl::Display *display) > > HINSTANCE hinstance = GetModuleHandle(nullptr); > >- std::ostringstream stream; >- stream << "ANGLE DisplayVkWin32 " << gl::FmtHex(display) << " Intermediate Window Class"; >- >- const LPSTR idcArrow = MAKEINTRESOURCEA(32512); >- std::string className = stream.str(); >- WNDCLASSA wndClass; >- if (!GetClassInfoA(hinstance, className.c_str(), &wndClass)) >+ std::wostringstream stream; >+ stream << L"ANGLE DisplayVkWin32 " << gl::FmtHex<egl::Display *, wchar_t>(display) >+ << L" Intermediate Window Class"; >+ >+ const LPWSTR idcArrow = MAKEINTRESOURCEW(32512); >+ std::wstring className = stream.str(); >+ WNDCLASSW wndClass; >+ if (!GetClassInfoW(hinstance, className.c_str(), &wndClass)) > { >- WNDCLASSA intermediateClassDesc = {}; >+ WNDCLASSW intermediateClassDesc = {}; > intermediateClassDesc.style = CS_OWNDC; >- intermediateClassDesc.lpfnWndProc = DefWindowProcA; >+ intermediateClassDesc.lpfnWndProc = DefWindowProcW; > intermediateClassDesc.cbClsExtra = 0; > intermediateClassDesc.cbWndExtra = 0; > intermediateClassDesc.hInstance = GetModuleHandle(nullptr); > intermediateClassDesc.hIcon = nullptr; >- intermediateClassDesc.hCursor = LoadCursorA(nullptr, idcArrow); >- intermediateClassDesc.hbrBackground = 0; >+ intermediateClassDesc.hCursor = LoadCursorW(nullptr, idcArrow); >+ intermediateClassDesc.hbrBackground = nullptr; > intermediateClassDesc.lpszMenuName = nullptr; > intermediateClassDesc.lpszClassName = className.c_str(); >- mWindowClass = RegisterClassA(&intermediateClassDesc); >+ mWindowClass = RegisterClassW(&intermediateClassDesc); > if (!mWindowClass) > { > return egl::EglNotInitialized() >@@ -91,10 +92,9 @@ egl::Error DisplayVkWin32::initialize(egl::Display *display) > } > } > >- mMockWindow = >- CreateWindowExA(0, reinterpret_cast<const char *>(mWindowClass), "ANGLE Mock Window", >- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, >- CW_USEDEFAULT, nullptr, nullptr, nullptr, nullptr); >+ mMockWindow = CreateWindowExW(0, reinterpret_cast<LPCWSTR>(mWindowClass), L"ANGLE Mock Window", >+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, >+ CW_USEDEFAULT, nullptr, nullptr, nullptr, nullptr); > if (!mMockWindow) > { > return egl::EglNotInitialized() << "Failed to create mock OpenGL window."; >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp >index c854cb074f3653fe0d0a741f2fdcbb54ae1dbb8b..a661eda7992c5234192e4fc41ab1190120e5c4f0 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.cpp >@@ -564,6 +564,7 @@ bool ValidateGetPlatformDisplayCommon(const ValidationContext *val, > bool enableD3D11on12 = false; > bool presentPathSpecified = false; > bool luidSpecified = false; >+ bool deviceIdSpecified = false; > > Optional<EGLAttrib> majorVersion; > Optional<EGLAttrib> minorVersion; >@@ -759,6 +760,16 @@ bool ValidateGetPlatformDisplayCommon(const ValidationContext *val, > return false; > } > break; >+ case EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE: >+ case EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE: >+ if (!clientExtensions.platformANGLEDeviceId) >+ { >+ val->setError(EGL_BAD_ATTRIBUTE, >+ "EGL_ANGLE_platform_angle_device_id is not supported"); >+ return false; >+ } >+ deviceIdSpecified = true; >+ break; > default: > break; > } >@@ -842,6 +853,19 @@ bool ValidateGetPlatformDisplayCommon(const ValidationContext *val, > } > } > >+ if (deviceIdSpecified) >+ { >+ if (attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE, 0) == 0 && >+ attribMap.get(EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE, 0) == 0) >+ { >+ val->setError(EGL_BAD_ATTRIBUTE, >+ "If either EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE " >+ "and/or EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE are " >+ "specified, at least one must non-zero."); >+ return false; >+ } >+ } >+ > if (deviceType.valid()) > { > switch (deviceType.value()) >@@ -1436,13 +1460,6 @@ bool ValidateCreateContextAttribute(const ValidationContext *val, > } > break; > >- case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR: >- val->setError(EGL_BAD_ATTRIBUTE, >- "EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR is not" >- " valid for GLES with EGL 1.4 and KHR_create_context. Use" >- " EXT_create_context_robustness."); >- return false; >- > case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT: > if (!display->getExtensions().createContextRobustness) > { >@@ -1451,6 +1468,23 @@ bool ValidateCreateContextAttribute(const ValidationContext *val, > } > break; > >+ case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY: >+ { >+ // We either need to have - >+ // 1. EGL 1.5 which added support for this as part of core spec >+ // 2. EGL_KHR_create_context extension which requires EGL 1.4 >+ constexpr EGLint kRequiredMajorVersion = 1; >+ constexpr EGLint kRequiredMinorVersion = 5; >+ if ((kEglMajorVersion < kRequiredMajorVersion || >+ kEglMinorVersion < kRequiredMinorVersion) && >+ !display->getExtensions().createContext) >+ { >+ val->setError(EGL_BAD_ATTRIBUTE); >+ return false; >+ } >+ break; >+ } >+ > case EGL_CONTEXT_OPENGL_NO_ERROR_KHR: > if (!display->getExtensions().createContextNoError) > { >@@ -1676,6 +1710,7 @@ bool ValidateCreateContextAttributeValue(const ValidationContext *val, > break; > > case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT: >+ case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY: > if (value != EGL_LOSE_CONTEXT_ON_RESET_EXT && value != EGL_NO_RESET_NOTIFICATION_EXT) > { > val->setError(EGL_BAD_ATTRIBUTE); >@@ -5978,6 +6013,13 @@ bool ValidateSwapBuffersWithFrameTokenANGLE(const ValidationContext *val, > return true; > } > >+bool ValidatePrepareSwapBuffersANGLE(const ValidationContext *val, >+ const Display *display, >+ const Surface *surface) >+{ >+ return ValidateSwapBuffers(val, display, surface); >+} >+ > bool ValidateSignalSyncKHR(const ValidationContext *val, > const Display *display, > const Sync *sync, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h b/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h >index 6915a7728b7fb5d8f4b86ae770b395ebe66b7a8e..8f04de288f55e32e771f662fb2fea3a282bff79e 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL.h >@@ -23,6 +23,8 @@ class Context; > > namespace egl > { >+constexpr EGLint kEglMajorVersion = 1; >+constexpr EGLint kEglMinorVersion = 5; > > class AttributeMap; > struct ClientExtensions; >@@ -186,4 +188,14 @@ typename std::remove_reference<PackedT>::type PackParam(FromT attribs) > } \ > } while (0) > >+#define ANGLE_EGLBOOLEAN_TRY(EXPR) \ >+ do \ >+ { \ >+ EGLBoolean ANGLE_LOCAL_VAR = (EXPR); \ >+ if (ANGLE_LOCAL_VAR != EGL_TRUE) \ >+ { \ >+ return ANGLE_LOCAL_VAR; \ >+ } \ >+ } while (0) >+ > #endif // LIBANGLE_VALIDATIONEGL_H_ >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL_autogen.h b/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL_autogen.h >index b1890c0fc33626a3a137a8ff2bd2aacd33e780bd..01ea446e22b4cd3216a05e50b2a37278cb833705 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationEGL_autogen.h >@@ -251,6 +251,11 @@ bool ValidateReacquireHighPowerGPUANGLE(const ValidationContext *val, > const gl::Context *ctxPacked); > bool ValidateHandleGPUSwitchANGLE(const ValidationContext *val, const egl::Display *dpyPacked); > >+// EGL_ANGLE_prepare_swap_buffers >+bool ValidatePrepareSwapBuffersANGLE(const ValidationContext *val, >+ const egl::Display *dpyPacked, >+ const Surface *surfacePacked); >+ > // EGL_ANGLE_program_cache_control > bool ValidateProgramCacheGetAttribANGLE(const ValidationContext *val, > const egl::Display *dpyPacked, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp >index c7ac3b939bd11379603f613de37f8890b4b33035..74aa2c6f52903b65b5566e030a89fcfb8b24e687 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationES.cpp >@@ -1765,6 +1765,97 @@ bool ValidateBindRenderbufferBase(const Context *context, > return true; > } > >+bool ValidateFramebufferParameteriBase(const Context *context, >+ angle::EntryPoint entryPoint, >+ GLenum target, >+ GLenum pname, >+ GLint param) >+{ >+ if (!ValidFramebufferTarget(context, target)) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidFramebufferTarget); >+ return false; >+ } >+ >+ switch (pname) >+ { >+ case GL_FRAMEBUFFER_DEFAULT_WIDTH: >+ { >+ GLint maxWidth = context->getCaps().maxFramebufferWidth; >+ if (param < 0 || param > maxWidth) >+ { >+ context->validationError(entryPoint, GL_INVALID_VALUE, kExceedsFramebufferWidth); >+ return false; >+ } >+ break; >+ } >+ case GL_FRAMEBUFFER_DEFAULT_HEIGHT: >+ { >+ GLint maxHeight = context->getCaps().maxFramebufferHeight; >+ if (param < 0 || param > maxHeight) >+ { >+ context->validationError(entryPoint, GL_INVALID_VALUE, kExceedsFramebufferHeight); >+ return false; >+ } >+ break; >+ } >+ case GL_FRAMEBUFFER_DEFAULT_SAMPLES: >+ { >+ GLint maxSamples = context->getCaps().maxFramebufferSamples; >+ if (param < 0 || param > maxSamples) >+ { >+ context->validationError(entryPoint, GL_INVALID_VALUE, kExceedsFramebufferSamples); >+ return false; >+ } >+ break; >+ } >+ case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS: >+ { >+ break; >+ } >+ case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT: >+ { >+ if (!context->getExtensions().geometryShaderAny() && >+ context->getClientVersion() < ES_3_2) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, >+ kGeometryShaderExtensionNotEnabled); >+ return false; >+ } >+ GLint maxLayers = context->getCaps().maxFramebufferLayers; >+ if (param < 0 || param > maxLayers) >+ { >+ context->validationError(entryPoint, GL_INVALID_VALUE, kInvalidFramebufferLayer); >+ return false; >+ } >+ break; >+ } >+ case GL_FRAMEBUFFER_FLIP_Y_MESA: >+ { >+ if (!context->getExtensions().framebufferFlipYMESA) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >+ return false; >+ } >+ break; >+ } >+ default: >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >+ return false; >+ } >+ } >+ >+ const Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); >+ ASSERT(framebuffer); >+ if (framebuffer->isDefault()) >+ { >+ context->validationError(entryPoint, GL_INVALID_OPERATION, kDefaultFramebuffer); >+ return false; >+ } >+ return true; >+} >+ > bool ValidateFramebufferRenderbufferBase(const Context *context, > angle::EntryPoint entryPoint, > GLenum target, >@@ -3133,9 +3224,9 @@ bool ValidateCopyImageSubDataTargetRegion(const Context *context, > > // INVALID_OPERATION is generated if either object is a texture and the texture is not > // complete >- // This will handle the texture completeness check. Note that this is missing >- // completeness validation that ignores format-based compleness rules. >- if (!texture->isSamplerComplete(context, nullptr)) >+ // This will handle the texture completeness check. Note that this ignores format-based >+ // compleness rules. >+ if (!texture->isSamplerCompleteForCopyImage(context, nullptr)) > { > context->validationError(entryPoint, GL_INVALID_OPERATION, kNotTextureComplete); > return false; >@@ -4412,12 +4503,12 @@ bool ValidateGetUniformBase(const Context *context, > return true; > } > >-static bool ValidateSizedGetUniform(const Context *context, >- angle::EntryPoint entryPoint, >- ShaderProgramID program, >- UniformLocation location, >- GLsizei bufSize, >- GLsizei *length) >+bool ValidateSizedGetUniform(const Context *context, >+ angle::EntryPoint entryPoint, >+ ShaderProgramID program, >+ UniformLocation location, >+ GLsizei bufSize, >+ GLsizei *length) > { > if (length) > { >@@ -4431,7 +4522,7 @@ static bool ValidateSizedGetUniform(const Context *context, > > if (bufSize < 0) > { >- context->validationError(entryPoint, GL_INVALID_VALUE, kNegativeBufferSize); >+ context->validationError(entryPoint, GL_INVALID_OPERATION, kNegativeBufferSize); > return false; > } > >@@ -5533,6 +5624,57 @@ bool ValidateGetFramebufferAttachmentParameterivBase(const Context *context, > return true; > } > >+bool ValidateGetFramebufferParameterivBase(const Context *context, >+ angle::EntryPoint entryPoint, >+ GLenum target, >+ GLenum pname, >+ const GLint *params) >+{ >+ if (!ValidFramebufferTarget(context, target)) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidFramebufferTarget); >+ return false; >+ } >+ >+ switch (pname) >+ { >+ case GL_FRAMEBUFFER_DEFAULT_WIDTH: >+ case GL_FRAMEBUFFER_DEFAULT_HEIGHT: >+ case GL_FRAMEBUFFER_DEFAULT_SAMPLES: >+ case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS: >+ break; >+ case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT: >+ if (!context->getExtensions().geometryShaderAny() && >+ context->getClientVersion() < ES_3_2) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, >+ kGeometryShaderExtensionNotEnabled); >+ return false; >+ } >+ break; >+ case GL_FRAMEBUFFER_FLIP_Y_MESA: >+ if (!context->getExtensions().framebufferFlipYMESA) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >+ return false; >+ } >+ break; >+ default: >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >+ return false; >+ } >+ >+ const Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); >+ ASSERT(framebuffer); >+ >+ if (framebuffer->isDefault()) >+ { >+ context->validationError(entryPoint, GL_INVALID_OPERATION, kDefaultFramebuffer); >+ return false; >+ } >+ return true; >+} >+ > bool ValidateGetFramebufferAttachmentParameterivRobustANGLE(const Context *context, > angle::EntryPoint entryPoint, > GLenum target, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h b/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h >index 32bcd73593a1a88b965b4933dd43e807185bced0..a33f830c28f197528b6b192ab7a6cbc682fd979a 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationES.h >@@ -128,6 +128,11 @@ bool ValidateBindRenderbufferBase(const Context *context, > angle::EntryPoint entryPoint, > GLenum target, > RenderbufferID renderbuffer); >+bool ValidateFramebufferParameteriBase(const Context *context, >+ angle::EntryPoint entryPoint, >+ GLenum target, >+ GLenum pname, >+ GLint param); > bool ValidateFramebufferRenderbufferBase(const Context *context, > angle::EntryPoint entryPoint, > GLenum target, >@@ -497,6 +502,12 @@ bool ValidateGetUniformBase(const Context *context, > angle::EntryPoint entryPoint, > ShaderProgramID program, > UniformLocation location); >+bool ValidateSizedGetUniform(const Context *context, >+ angle::EntryPoint entryPoint, >+ ShaderProgramID program, >+ UniformLocation location, >+ GLsizei bufSize, >+ GLsizei *length); > bool ValidateGetnUniformfvEXT(const Context *context, > angle::EntryPoint entryPoint, > ShaderProgramID program, >@@ -634,6 +645,12 @@ bool ValidateGetFramebufferAttachmentParameterivBase(const Context *context, > GLenum pname, > GLsizei *numParams); > >+bool ValidateGetFramebufferParameterivBase(const Context *context, >+ angle::EntryPoint entryPoint, >+ GLenum target, >+ GLenum pname, >+ const GLint *params); >+ > bool ValidateGetBufferParameterBase(const Context *context, > angle::EntryPoint entryPoint, > BufferBinding target, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h b/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h >index c58378f8f7ddafdd9df38e30382f14943a68dead..399779aa7cfda0e926027a7ecf65e9520bd0cc5f 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationES2.h >@@ -158,7 +158,10 @@ ANGLE_INLINE bool ValidateBindTexture(const Context *context, > Texture *textureObject = context->getTexture(texture); > if (textureObject && textureObject->getType() != target) > { >- context->validationError(entryPoint, GL_INVALID_OPERATION, err::kTextureTargetMismatch); >+ context->validationErrorF( >+ entryPoint, GL_INVALID_OPERATION, err::kTextureTargetMismatchWithLabel, >+ static_cast<uint8_t>(target), static_cast<uint8_t>(textureObject->getType()), >+ textureObject->getLabel().c_str()); > return false; > } > >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp >index dfa0dfac3b25fc36540a7aa07093b43b51cdb341..26dc7c28580b93abcf101df3be900c214a2f6aba 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationES3.cpp >@@ -1959,8 +1959,11 @@ bool ValidateCompressedTexImage3D(const Context *context, > // 3D texture target validation > if (target != TextureTarget::_3D && target != TextureTarget::_2DArray) > { >- context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidTextureTarget); >- return false; >+ if (context->getClientVersion() < ES_3_2 || target != TextureTarget::CubeMapArray) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidTextureTarget); >+ return false; >+ } > } > > // validateES3TexImageFormat sets the error code if there is an error >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationES31.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/validationES31.cpp >index 9886a8e8c50d8a27312cac671c4a6616cc62fb3d..b240ca64e2f86896029f5875529299d1b5696552 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationES31.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationES31.cpp >@@ -1110,80 +1110,7 @@ bool ValidateFramebufferParameteri(const Context *context, > return false; > } > >- if (!ValidFramebufferTarget(context, target)) >- { >- context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidFramebufferTarget); >- return false; >- } >- >- switch (pname) >- { >- case GL_FRAMEBUFFER_DEFAULT_WIDTH: >- { >- GLint maxWidth = context->getCaps().maxFramebufferWidth; >- if (param < 0 || param > maxWidth) >- { >- context->validationError(entryPoint, GL_INVALID_VALUE, kExceedsFramebufferWidth); >- return false; >- } >- break; >- } >- case GL_FRAMEBUFFER_DEFAULT_HEIGHT: >- { >- GLint maxHeight = context->getCaps().maxFramebufferHeight; >- if (param < 0 || param > maxHeight) >- { >- context->validationError(entryPoint, GL_INVALID_VALUE, kExceedsFramebufferHeight); >- return false; >- } >- break; >- } >- case GL_FRAMEBUFFER_DEFAULT_SAMPLES: >- { >- GLint maxSamples = context->getCaps().maxFramebufferSamples; >- if (param < 0 || param > maxSamples) >- { >- context->validationError(entryPoint, GL_INVALID_VALUE, kExceedsFramebufferSamples); >- return false; >- } >- break; >- } >- case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS: >- { >- break; >- } >- case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT: >- { >- if (!context->getExtensions().geometryShaderAny() && >- context->getClientVersion() < ES_3_2) >- { >- context->validationError(entryPoint, GL_INVALID_ENUM, >- kGeometryShaderExtensionNotEnabled); >- return false; >- } >- GLint maxLayers = context->getCaps().maxFramebufferLayers; >- if (param < 0 || param > maxLayers) >- { >- context->validationError(entryPoint, GL_INVALID_VALUE, kInvalidFramebufferLayer); >- return false; >- } >- break; >- } >- default: >- { >- context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >- return false; >- } >- } >- >- const Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); >- ASSERT(framebuffer); >- if (framebuffer->isDefault()) >- { >- context->validationError(entryPoint, GL_INVALID_OPERATION, kDefaultFramebuffer); >- return false; >- } >- return true; >+ return ValidateFramebufferParameteriBase(context, entryPoint, target, pname, param); > } > > bool ValidateGetFramebufferParameteriv(const Context *context, >@@ -1198,42 +1125,7 @@ bool ValidateGetFramebufferParameteriv(const Context *context, > return false; > } > >- if (!ValidFramebufferTarget(context, target)) >- { >- context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidFramebufferTarget); >- return false; >- } >- >- switch (pname) >- { >- case GL_FRAMEBUFFER_DEFAULT_WIDTH: >- case GL_FRAMEBUFFER_DEFAULT_HEIGHT: >- case GL_FRAMEBUFFER_DEFAULT_SAMPLES: >- case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS: >- break; >- case GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT: >- if (!context->getExtensions().geometryShaderAny() && >- context->getClientVersion() < ES_3_2) >- { >- context->validationError(entryPoint, GL_INVALID_ENUM, >- kGeometryShaderExtensionNotEnabled); >- return false; >- } >- break; >- default: >- context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >- return false; >- } >- >- const Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); >- ASSERT(framebuffer); >- >- if (framebuffer->isDefault()) >- { >- context->validationError(entryPoint, GL_INVALID_OPERATION, kDefaultFramebuffer); >- return false; >- } >- return true; >+ return ValidateGetFramebufferParameterivBase(context, entryPoint, target, pname, params); > } > > bool ValidateGetFramebufferParameterivRobustANGLE(const Context *context, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationES32.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/validationES32.cpp >index 5a27a7fa0e82dbc45a2f97c05f08b29cde1a122a..3fda98b565af391a196305cf42aa033e47b20c8c 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationES32.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationES32.cpp >@@ -424,7 +424,7 @@ bool ValidateGetnUniformfv(const Context *context, > GLsizei bufSize, > const GLfloat *params) > { >- return true; >+ return ValidateSizedGetUniform(context, entryPoint, program, location, bufSize, nullptr); > } > > bool ValidateGetnUniformiv(const Context *context, >@@ -434,7 +434,7 @@ bool ValidateGetnUniformiv(const Context *context, > GLsizei bufSize, > const GLint *params) > { >- return true; >+ return ValidateSizedGetUniform(context, entryPoint, program, location, bufSize, nullptr); > } > > bool ValidateGetnUniformuiv(const Context *context, >@@ -444,7 +444,7 @@ bool ValidateGetnUniformuiv(const Context *context, > GLsizei bufSize, > const GLuint *params) > { >- return true; >+ return ValidateSizedGetUniform(context, entryPoint, program, location, bufSize, nullptr); > } > > bool ValidateIsEnabledi(const Context *context, >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT.cpp b/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT.cpp >index 50a3908e48079c77c644ce99989507b587970aa4..75629c694723d18d1f62c37ee6d3550d51f94fdc 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT.cpp >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT.cpp >@@ -2615,8 +2615,12 @@ bool ValidateFramebufferParameteriMESA(const Context *context, > GLenum pname, > GLint param) > { >- UNIMPLEMENTED(); >- return false; >+ if (pname != GL_FRAMEBUFFER_FLIP_Y_MESA) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >+ return false; >+ } >+ return ValidateFramebufferParameteriBase(context, entryPoint, target, pname, param); > } > > bool ValidateGetFramebufferParameterivMESA(const Context *context, >@@ -2625,8 +2629,12 @@ bool ValidateGetFramebufferParameterivMESA(const Context *context, > GLenum pname, > const GLint *params) > { >- UNIMPLEMENTED(); >- return false; >+ if (pname != GL_FRAMEBUFFER_FLIP_Y_MESA) >+ { >+ context->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPname); >+ return false; >+ } >+ return ValidateGetFramebufferParameterivBase(context, entryPoint, target, pname, params); > } > > } // namespace gl >diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT_autogen.h b/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT_autogen.h >index 2c0186a7b2679d847c2b751a2175621df2bfd5c3..8afe20578c8ed41829573d55d1cc3d82a509a655 100644 >--- a/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libANGLE/validationESEXT_autogen.h >@@ -18,6 +18,8 @@ namespace gl > { > class Context; > >+// GL_ANDROID_extension_pack_es31a >+ > // GL_ANGLE_base_vertex_base_instance > bool ValidateDrawArraysInstancedBaseInstanceANGLE(const Context *context, > angle::EntryPoint entryPoint, >@@ -1678,6 +1680,8 @@ bool ValidateValidateProgramPipelineEXT(const Context *context, > angle::EntryPoint entryPoint, > ProgramPipelineID pipelinePacked); > >+// GL_EXT_shader_framebuffer_fetch >+ > // GL_EXT_shader_framebuffer_fetch_non_coherent > bool ValidateFramebufferFetchBarrierEXT(const Context *context, angle::EntryPoint entryPoint); > >diff --git a/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.cpp b/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.cpp >index 9e80e83c7ce4b478db52d3efb1864f394b62c05f..d8276c4983d29f36f7cbc300ef3bacd309d64625 100644 >--- a/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.cpp >@@ -71,6 +71,7 @@ PFNEGLQUERYSTRINGIANGLEPROC l_EGL_QueryStringiANGLE; > PFNEGLHANDLEGPUSWITCHANGLEPROC l_EGL_HandleGPUSwitchANGLE; > PFNEGLREACQUIREHIGHPOWERGPUANGLEPROC l_EGL_ReacquireHighPowerGPUANGLE; > PFNEGLRELEASEHIGHPOWERGPUANGLEPROC l_EGL_ReleaseHighPowerGPUANGLE; >+PFNEGLPREPARESWAPBUFFERSANGLEPROC l_EGL_PrepareSwapBuffersANGLE; > PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC l_EGL_ProgramCacheGetAttribANGLE; > PFNEGLPROGRAMCACHEPOPULATEANGLEPROC l_EGL_ProgramCachePopulateANGLE; > PFNEGLPROGRAMCACHEQUERYANGLEPROC l_EGL_ProgramCacheQueryANGLE; >@@ -215,6 +216,8 @@ void LoadEGL_EGL(LoadProc loadProc) > loadProc("EGL_ReacquireHighPowerGPUANGLE")); > l_EGL_ReleaseHighPowerGPUANGLE = reinterpret_cast<PFNEGLRELEASEHIGHPOWERGPUANGLEPROC>( > loadProc("EGL_ReleaseHighPowerGPUANGLE")); >+ l_EGL_PrepareSwapBuffersANGLE = reinterpret_cast<PFNEGLPREPARESWAPBUFFERSANGLEPROC>( >+ loadProc("EGL_PrepareSwapBuffersANGLE")); > l_EGL_ProgramCacheGetAttribANGLE = reinterpret_cast<PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC>( > loadProc("EGL_ProgramCacheGetAttribANGLE")); > l_EGL_ProgramCachePopulateANGLE = reinterpret_cast<PFNEGLPROGRAMCACHEPOPULATEANGLEPROC>( >diff --git a/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.h b/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.h >index b6a23e5cbfac52fb5ed381b851f9d62d0d99b133..fea8d25440e463d83747de63a0b0497397888a51 100644 >--- a/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libEGL/egl_loader_autogen.h >@@ -76,6 +76,7 @@ > #define EGL_HandleGPUSwitchANGLE l_EGL_HandleGPUSwitchANGLE > #define EGL_ReacquireHighPowerGPUANGLE l_EGL_ReacquireHighPowerGPUANGLE > #define EGL_ReleaseHighPowerGPUANGLE l_EGL_ReleaseHighPowerGPUANGLE >+#define EGL_PrepareSwapBuffersANGLE l_EGL_PrepareSwapBuffersANGLE > #define EGL_ProgramCacheGetAttribANGLE l_EGL_ProgramCacheGetAttribANGLE > #define EGL_ProgramCachePopulateANGLE l_EGL_ProgramCachePopulateANGLE > #define EGL_ProgramCacheQueryANGLE l_EGL_ProgramCacheQueryANGLE >@@ -182,6 +183,7 @@ ANGLE_NO_EXPORT extern PFNEGLQUERYSTRINGIANGLEPROC l_EGL_QueryStringiANGLE; > ANGLE_NO_EXPORT extern PFNEGLHANDLEGPUSWITCHANGLEPROC l_EGL_HandleGPUSwitchANGLE; > ANGLE_NO_EXPORT extern PFNEGLREACQUIREHIGHPOWERGPUANGLEPROC l_EGL_ReacquireHighPowerGPUANGLE; > ANGLE_NO_EXPORT extern PFNEGLRELEASEHIGHPOWERGPUANGLEPROC l_EGL_ReleaseHighPowerGPUANGLE; >+ANGLE_NO_EXPORT extern PFNEGLPREPARESWAPBUFFERSANGLEPROC l_EGL_PrepareSwapBuffersANGLE; > ANGLE_NO_EXPORT extern PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC l_EGL_ProgramCacheGetAttribANGLE; > ANGLE_NO_EXPORT extern PFNEGLPROGRAMCACHEPOPULATEANGLEPROC l_EGL_ProgramCachePopulateANGLE; > ANGLE_NO_EXPORT extern PFNEGLPROGRAMCACHEQUERYANGLEPROC l_EGL_ProgramCacheQueryANGLE; >diff --git a/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.cpp b/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.cpp >index 35d89eda35f39a21def79cf070c2d69f68dd9927..23c03bb58466301913b08068f6e4d364129943c6 100644 >--- a/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.cpp >@@ -519,6 +519,13 @@ void EGLAPIENTRY eglHandleGPUSwitchANGLE(EGLDisplay dpy) > return EGL_HandleGPUSwitchANGLE(dpy); > } > >+// EGL_ANGLE_prepare_swap_buffers >+EGLBoolean EGLAPIENTRY eglPrepareSwapBuffersANGLE(EGLDisplay dpy, EGLSurface surface) >+{ >+ EnsureEGLLoaded(); >+ return EGL_PrepareSwapBuffersANGLE(dpy, surface); >+} >+ > // EGL_ANGLE_program_cache_control > EGLint EGLAPIENTRY eglProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib) > { >diff --git a/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.def b/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.def >index 73ef5096fba037076f3693ce718e95a840c47b3d..3a6107297eba3a803286131133f2805d48d54489 100644 >--- a/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.def >+++ b/Source/ThirdParty/ANGLE/src/libEGL/libEGL_autogen.def >@@ -96,6 +96,9 @@ EXPORTS > eglReacquireHighPowerGPUANGLE > eglReleaseHighPowerGPUANGLE > >+ ; EGL_ANGLE_prepare_swap_buffers >+ eglPrepareSwapBuffersANGLE >+ > ; EGL_ANGLE_program_cache_control > eglProgramCacheGetAttribANGLE > eglProgramCachePopulateANGLE >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs.cpp >index 77e16b8d7b5832431762d30875921a71ba0018bb..06a2002c8321f054817a61bccf785d1f6488550a 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs.cpp >@@ -13,8 +13,10 @@ > #include "libANGLE/EGLSync.h" > #include "libANGLE/Surface.h" > #include "libANGLE/Thread.h" >+#include "libANGLE/entry_points_utils.h" > #include "libANGLE/queryutils.h" > #include "libANGLE/validationEGL.h" >+#include "libANGLE/validationEGL_autogen.h" > #include "libGLESv2/global_state.h" > > namespace egl >@@ -587,6 +589,33 @@ EGLBoolean SwapBuffersWithDamageKHR(Thread *thread, > return EGL_TRUE; > } > >+EGLBoolean PrepareSwapBuffersANGLE(EGLDisplay dpy, EGLSurface surface) >+ >+{ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); >+ >+ egl::Display *dpyPacked = PackParam<egl::Display *>(dpy); >+ Surface *surfacePacked = PackParam<Surface *>(surface); >+ Thread *thread = egl::GetCurrentThread(); >+ { >+ ANGLE_SCOPED_GLOBAL_LOCK(); >+ >+ EGL_EVENT(PrepareSwapBuffersANGLE, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR "", >+ (uintptr_t)dpy, (uintptr_t)surface); >+ >+ ANGLE_EGL_VALIDATE(thread, PrepareSwapBuffersANGLE, GetDisplayIfValid(dpyPacked), >+ EGLBoolean, dpyPacked, surfacePacked); >+ >+ ANGLE_EGL_TRY_RETURN(thread, dpyPacked->prepareForCall(), "eglPrepareSwapBuffersANGLE", >+ GetDisplayIfValid(dpyPacked), EGL_FALSE); >+ } >+ ANGLE_EGL_TRY_RETURN(thread, surfacePacked->prepareSwap(thread->getContext()), "prepareSwap", >+ GetSurfaceIfValid(dpyPacked, surfacePacked), EGL_FALSE); >+ >+ thread->setSuccess(); >+ return EGL_TRUE; >+} >+ > EGLint WaitSyncKHR(Thread *thread, Display *display, Sync *syncObject, EGLint flags) > { > ANGLE_EGL_TRY_RETURN(thread, display->prepareForCall(), "eglWaitSync", >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs_autogen.h b/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs_autogen.h >index fa9fb0d517e9833e5c53ca703e5966d583698704..0f65de66258ef5b03ad715318e7777d23847e838 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/egl_ext_stubs_autogen.h >@@ -225,6 +225,7 @@ EGLBoolean SwapBuffersWithFrameTokenANGLE(Thread *thread, > egl::Display *dpyPacked, > Surface *surfacePacked, > EGLFrameTokenANGLE frametoken); >+EGLBoolean PrepareSwapBuffersANGLE(EGLDisplay dpy, EGLSurface surface); > void ReleaseHighPowerGPUANGLE(Thread *thread, egl::Display *dpyPacked, gl::Context *ctxPacked); > void ReacquireHighPowerGPUANGLE(Thread *thread, egl::Display *dpyPacked, gl::Context *ctxPacked); > void HandleGPUSwitchANGLE(Thread *thread, egl::Display *dpyPacked); >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/egl_stubs.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/egl_stubs.cpp >index fa37ae68e8e87aefd111440463611f737665691b..0554b7f40c65d6a2690380fe7483818886e20533 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/egl_stubs.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/egl_stubs.cpp >@@ -449,9 +449,13 @@ EGLBoolean Initialize(Thread *thread, Display *display, EGLint *major, EGLint *m > EGL_FALSE); > > if (major) >- *major = 1; >+ { >+ *major = kEglMajorVersion; >+ } > if (minor) >- *minor = 5; >+ { >+ *minor = kEglMinorVersion; >+ } > > thread->setSuccess(); > return EGL_TRUE; >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_autogen.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_autogen.cpp >index 89eccf6957d3e039f04371291de187c22c70e299..3bd9761b1a6bb4d68c3847c1528eaf5e44c75269 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_autogen.cpp >@@ -12,6 +12,7 @@ > > #include "libANGLE/entry_points_utils.h" > #include "libANGLE/validationEGL_autogen.h" >+#include "libGLESv2/egl_ext_stubs_autogen.h" > #include "libGLESv2/egl_stubs_autogen.h" > #include "libGLESv2/global_state.h" > >@@ -26,6 +27,7 @@ EGLBoolean EGLAPIENTRY EGL_ChooseConfig(EGLDisplay dpy, > EGLint config_size, > EGLint *num_config) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ChooseConfig, > "dpy = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR ", configs = 0x%016" PRIxPTR >@@ -48,6 +50,8 @@ EGLBoolean EGLAPIENTRY EGL_CopyBuffers(EGLDisplay dpy, > EGLSurface surface, > EGLNativePixmapType target) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CopyBuffers, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", target = 0x%016" PRIxPTR "", >@@ -69,6 +73,7 @@ EGLContext EGLAPIENTRY EGL_CreateContext(EGLDisplay dpy, > EGLContext share_context, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateContext, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", share_context = 0x%016" PRIxPTR >@@ -92,6 +97,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePbufferSurface(EGLDisplay dpy, > EGLConfig config, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreatePbufferSurface, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR >@@ -115,6 +121,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePixmapSurface(EGLDisplay dpy, > EGLNativePixmapType pixmap, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreatePixmapSurface, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", pixmap = 0x%016" PRIxPTR >@@ -138,6 +145,7 @@ EGLSurface EGLAPIENTRY EGL_CreateWindowSurface(EGLDisplay dpy, > EGLNativeWindowType win, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateWindowSurface, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", win = 0x%016" PRIxPTR >@@ -158,6 +166,7 @@ EGLSurface EGLAPIENTRY EGL_CreateWindowSurface(EGLDisplay dpy, > > EGLBoolean EGLAPIENTRY EGL_DestroyContext(EGLDisplay dpy, EGLContext ctx) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DestroyContext, "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR "", (uintptr_t)dpy, > (uintptr_t)ctx); >@@ -175,6 +184,8 @@ EGLBoolean EGLAPIENTRY EGL_DestroyContext(EGLDisplay dpy, EGLContext ctx) > > EGLBoolean EGLAPIENTRY EGL_DestroySurface(EGLDisplay dpy, EGLSurface surface) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DestroySurface, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)surface); >@@ -195,6 +206,7 @@ EGLBoolean EGLAPIENTRY EGL_GetConfigAttrib(EGLDisplay dpy, > EGLint attribute, > EGLint *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetConfigAttrib, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR >@@ -217,6 +229,7 @@ EGLBoolean EGLAPIENTRY EGL_GetConfigs(EGLDisplay dpy, > EGLint config_size, > EGLint *num_config) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetConfigs, > "dpy = 0x%016" PRIxPTR ", configs = 0x%016" PRIxPTR >@@ -235,6 +248,7 @@ EGLBoolean EGLAPIENTRY EGL_GetConfigs(EGLDisplay dpy, > > EGLDisplay EGLAPIENTRY EGL_GetCurrentDisplay() > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetCurrentDisplay, ""); > >@@ -247,6 +261,7 @@ EGLDisplay EGLAPIENTRY EGL_GetCurrentDisplay() > > EGLSurface EGLAPIENTRY EGL_GetCurrentSurface(EGLint readdraw) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetCurrentSurface, "readdraw = %d", readdraw); > >@@ -259,6 +274,7 @@ EGLSurface EGLAPIENTRY EGL_GetCurrentSurface(EGLint readdraw) > > EGLDisplay EGLAPIENTRY EGL_GetDisplay(EGLNativeDisplayType display_id) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetDisplay, "display_id = 0x%016" PRIxPTR "", (uintptr_t)display_id); > >@@ -271,6 +287,7 @@ EGLDisplay EGLAPIENTRY EGL_GetDisplay(EGLNativeDisplayType display_id) > > EGLint EGLAPIENTRY EGL_GetError() > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetError, ""); > >@@ -283,6 +300,7 @@ EGLint EGLAPIENTRY EGL_GetError() > > __eglMustCastToProperFunctionPointerType EGLAPIENTRY EGL_GetProcAddress(const char *procname) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetProcAddress, "procname = 0x%016" PRIxPTR "", (uintptr_t)procname); > >@@ -296,6 +314,7 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY EGL_GetProcAddress(const ch > > EGLBoolean EGLAPIENTRY EGL_Initialize(EGLDisplay dpy, EGLint *major, EGLint *minor) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(Initialize, > "dpy = 0x%016" PRIxPTR ", major = 0x%016" PRIxPTR ", minor = 0x%016" PRIxPTR "", >@@ -316,6 +335,8 @@ EGLBoolean EGLAPIENTRY EGL_MakeCurrent(EGLDisplay dpy, > EGLSurface read, > EGLContext ctx) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(MakeCurrent, > "dpy = 0x%016" PRIxPTR ", draw = 0x%016" PRIxPTR ", read = 0x%016" PRIxPTR >@@ -340,6 +361,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryContext(EGLDisplay dpy, > EGLint attribute, > EGLint *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryContext, > "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR >@@ -359,6 +381,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryContext(EGLDisplay dpy, > > const char *EGLAPIENTRY EGL_QueryString(EGLDisplay dpy, EGLint name) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryString, "dpy = 0x%016" PRIxPTR ", name = %d", (uintptr_t)dpy, name); > >@@ -377,6 +400,8 @@ EGLBoolean EGLAPIENTRY EGL_QuerySurface(EGLDisplay dpy, > EGLint attribute, > EGLint *value) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QuerySurface, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR >@@ -396,6 +421,8 @@ EGLBoolean EGLAPIENTRY EGL_QuerySurface(EGLDisplay dpy, > > EGLBoolean EGLAPIENTRY EGL_SwapBuffers(EGLDisplay dpy, EGLSurface surface) > { >+ ANGLE_EGLBOOLEAN_TRY(PrepareSwapBuffersANGLE(dpy, surface)); >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(SwapBuffers, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR "", (uintptr_t)dpy, > (uintptr_t)surface); >@@ -413,6 +440,7 @@ EGLBoolean EGLAPIENTRY EGL_SwapBuffers(EGLDisplay dpy, EGLSurface surface) > > EGLBoolean EGLAPIENTRY EGL_Terminate(EGLDisplay dpy) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(Terminate, "dpy = 0x%016" PRIxPTR "", (uintptr_t)dpy); > >@@ -427,6 +455,7 @@ EGLBoolean EGLAPIENTRY EGL_Terminate(EGLDisplay dpy) > > EGLBoolean EGLAPIENTRY EGL_WaitGL() > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(WaitGL, ""); > >@@ -439,6 +468,7 @@ EGLBoolean EGLAPIENTRY EGL_WaitGL() > > EGLBoolean EGLAPIENTRY EGL_WaitNative(EGLint engine) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(WaitNative, "engine = %d", engine); > >@@ -452,6 +482,8 @@ EGLBoolean EGLAPIENTRY EGL_WaitNative(EGLint engine) > // EGL 1.1 > EGLBoolean EGLAPIENTRY EGL_BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(BindTexImage, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", buffer = %d", > (uintptr_t)dpy, (uintptr_t)surface, buffer); >@@ -469,6 +501,8 @@ EGLBoolean EGLAPIENTRY EGL_BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLi > > EGLBoolean EGLAPIENTRY EGL_ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ReleaseTexImage, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", buffer = %d", > (uintptr_t)dpy, (uintptr_t)surface, buffer); >@@ -489,6 +523,8 @@ EGLBoolean EGLAPIENTRY EGL_SurfaceAttrib(EGLDisplay dpy, > EGLint attribute, > EGLint value) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(SurfaceAttrib, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", attribute = %d, value = %d", >@@ -507,6 +543,7 @@ EGLBoolean EGLAPIENTRY EGL_SurfaceAttrib(EGLDisplay dpy, > > EGLBoolean EGLAPIENTRY EGL_SwapInterval(EGLDisplay dpy, EGLint interval) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(SwapInterval, "dpy = 0x%016" PRIxPTR ", interval = %d", (uintptr_t)dpy, interval); > >@@ -523,6 +560,7 @@ EGLBoolean EGLAPIENTRY EGL_SwapInterval(EGLDisplay dpy, EGLint interval) > // EGL 1.2 > EGLBoolean EGLAPIENTRY EGL_BindAPI(EGLenum api) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(BindAPI, "api = 0x%X", api); > >@@ -539,6 +577,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePbufferFromClientBuffer(EGLDisplay dpy, > EGLConfig config, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreatePbufferFromClientBuffer, > "dpy = 0x%016" PRIxPTR ", buftype = 0x%X, buffer = 0x%016" PRIxPTR >@@ -561,6 +600,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePbufferFromClientBuffer(EGLDisplay dpy, > > EGLenum EGLAPIENTRY EGL_QueryAPI() > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryAPI, ""); > >@@ -573,6 +613,7 @@ EGLenum EGLAPIENTRY EGL_QueryAPI() > > EGLBoolean EGLAPIENTRY EGL_ReleaseThread() > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ReleaseThread, ""); > >@@ -585,6 +626,7 @@ EGLBoolean EGLAPIENTRY EGL_ReleaseThread() > > EGLBoolean EGLAPIENTRY EGL_WaitClient() > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(WaitClient, ""); > >@@ -598,6 +640,7 @@ EGLBoolean EGLAPIENTRY EGL_WaitClient() > // EGL 1.4 > EGLContext EGLAPIENTRY EGL_GetCurrentContext() > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetCurrentContext, ""); > >@@ -611,6 +654,7 @@ EGLContext EGLAPIENTRY EGL_GetCurrentContext() > // EGL 1.5 > EGLint EGLAPIENTRY EGL_ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ClientWaitSync, > "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d, timeout = %llu", >@@ -633,6 +677,7 @@ EGLImage EGLAPIENTRY EGL_CreateImage(EGLDisplay dpy, > EGLClientBuffer buffer, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateImage, > "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR >@@ -656,6 +701,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurface(EGLDisplay dpy, > void *native_pixmap, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreatePlatformPixmapSurface, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_pixmap = 0x%016" PRIxPTR >@@ -680,6 +726,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurface(EGLDisplay dpy, > void *native_window, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreatePlatformWindowSurface, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_window = 0x%016" PRIxPTR >@@ -701,6 +748,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurface(EGLDisplay dpy, > > EGLSync EGLAPIENTRY EGL_CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateSync, "dpy = 0x%016" PRIxPTR ", type = 0x%X, attrib_list = 0x%016" PRIxPTR "", > (uintptr_t)dpy, type, (uintptr_t)attrib_list); >@@ -718,6 +766,7 @@ EGLSync EGLAPIENTRY EGL_CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib > > EGLBoolean EGLAPIENTRY EGL_DestroyImage(EGLDisplay dpy, EGLImage image) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DestroyImage, "dpy = 0x%016" PRIxPTR ", image = 0x%016" PRIxPTR "", (uintptr_t)dpy, > (uintptr_t)image); >@@ -735,6 +784,7 @@ EGLBoolean EGLAPIENTRY EGL_DestroyImage(EGLDisplay dpy, EGLImage image) > > EGLBoolean EGLAPIENTRY EGL_DestroySync(EGLDisplay dpy, EGLSync sync) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DestroySync, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR "", (uintptr_t)dpy, > (uintptr_t)sync); >@@ -754,6 +804,7 @@ EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplay(EGLenum platform, > void *native_display, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetPlatformDisplay, > "platform = 0x%X, native_display = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR >@@ -775,6 +826,7 @@ EGLBoolean EGLAPIENTRY EGL_GetSyncAttrib(EGLDisplay dpy, > EGLint attribute, > EGLAttrib *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetSyncAttrib, > "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR >@@ -794,6 +846,7 @@ EGLBoolean EGLAPIENTRY EGL_GetSyncAttrib(EGLDisplay dpy, > > EGLBoolean EGLAPIENTRY EGL_WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(WaitSync, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d", > (uintptr_t)dpy, (uintptr_t)sync, flags); >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.cpp >index 2c0d59b0161fa5e9de6e1b087bdf7ac0faf79d3a..9695304c913691095da6d3525e06ccafe652aee3 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.cpp >@@ -24,6 +24,7 @@ void EGLAPIENTRY EGL_SetBlobCacheFuncsANDROID(EGLDisplay dpy, > EGLSetBlobFuncANDROID set, > EGLGetBlobFuncANDROID get) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(SetBlobCacheFuncsANDROID, > "dpy = 0x%016" PRIxPTR ", set = 0x%016" PRIxPTR ", get = 0x%016" PRIxPTR "", >@@ -42,6 +43,7 @@ void EGLAPIENTRY EGL_SetBlobCacheFuncsANDROID(EGLDisplay dpy, > // EGL_ANDROID_create_native_client_buffer > EGLClientBuffer EGLAPIENTRY EGL_CreateNativeClientBufferANDROID(const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateNativeClientBufferANDROID, "attrib_list = 0x%016" PRIxPTR "", > (uintptr_t)attrib_list); >@@ -61,6 +63,8 @@ EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingSupportedANDROID(EGLDisplay dpy, > EGLSurface surface, > EGLint name) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetCompositorTimingSupportedANDROID, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", name = %d", (uintptr_t)dpy, >@@ -84,6 +88,8 @@ EGLBoolean EGLAPIENTRY EGL_GetCompositorTimingANDROID(EGLDisplay dpy, > const EGLint *names, > EGLnsecsANDROID *values) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetCompositorTimingANDROID, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR >@@ -107,6 +113,8 @@ EGLBoolean EGLAPIENTRY EGL_GetNextFrameIdANDROID(EGLDisplay dpy, > EGLSurface surface, > EGLuint64KHR *frameId) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetNextFrameIdANDROID, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", frameId = 0x%016" PRIxPTR "", >@@ -127,6 +135,8 @@ EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampSupportedANDROID(EGLDisplay dpy, > EGLSurface surface, > EGLint timestamp) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetFrameTimestampSupportedANDROID, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", timestamp = %d", >@@ -151,6 +161,8 @@ EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampsANDROID(EGLDisplay dpy, > const EGLint *timestamps, > EGLnsecsANDROID *values) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetFrameTimestampsANDROID, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR >@@ -174,6 +186,7 @@ EGLBoolean EGLAPIENTRY EGL_GetFrameTimestampsANDROID(EGLDisplay dpy, > // EGL_ANDROID_get_native_client_buffer > EGLClientBuffer EGLAPIENTRY EGL_GetNativeClientBufferANDROID(const struct AHardwareBuffer *buffer) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetNativeClientBufferANDROID, "buffer = 0x%016" PRIxPTR "", (uintptr_t)buffer); > >@@ -187,6 +200,7 @@ EGLClientBuffer EGLAPIENTRY EGL_GetNativeClientBufferANDROID(const struct AHardw > // EGL_ANDROID_native_fence_sync > EGLint EGLAPIENTRY EGL_DupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DupNativeFenceFDANDROID, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)sync); >@@ -207,6 +221,8 @@ EGLBoolean EGLAPIENTRY EGL_PresentationTimeANDROID(EGLDisplay dpy, > EGLSurface surface, > EGLnsecsANDROID time) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(PresentationTimeANDROID, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", time = %llu", (uintptr_t)dpy, >@@ -228,6 +244,7 @@ EGLDeviceEXT EGLAPIENTRY EGL_CreateDeviceANGLE(EGLint device_type, > void *native_device, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateDeviceANGLE, > "device_type = %d, native_device = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR >@@ -244,6 +261,7 @@ EGLDeviceEXT EGLAPIENTRY EGL_CreateDeviceANGLE(EGLint device_type, > > EGLBoolean EGLAPIENTRY EGL_ReleaseDeviceANGLE(EGLDeviceEXT device) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ReleaseDeviceANGLE, "device = 0x%016" PRIxPTR "", (uintptr_t)device); > >@@ -259,6 +277,7 @@ EGLBoolean EGLAPIENTRY EGL_ReleaseDeviceANGLE(EGLDeviceEXT device) > // EGL_ANGLE_feature_control > const char *EGLAPIENTRY EGL_QueryStringiANGLE(EGLDisplay dpy, EGLint name, EGLint index) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryStringiANGLE, "dpy = 0x%016" PRIxPTR ", name = %d, index = %d", (uintptr_t)dpy, > name, index); >@@ -277,6 +296,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribANGLE(EGLDisplay dpy, > EGLint attribute, > EGLAttrib *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryDisplayAttribANGLE, > "dpy = 0x%016" PRIxPTR ", attribute = %d, value = 0x%016" PRIxPTR "", (uintptr_t)dpy, >@@ -295,6 +315,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribANGLE(EGLDisplay dpy, > // EGL_ANGLE_power_preference > void EGLAPIENTRY EGL_ReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ReleaseHighPowerGPUANGLE, "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)ctx); >@@ -312,6 +333,7 @@ void EGLAPIENTRY EGL_ReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx) > > void EGLAPIENTRY EGL_ReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ReacquireHighPowerGPUANGLE, "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)ctx); >@@ -329,6 +351,7 @@ void EGLAPIENTRY EGL_ReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx) > > void EGLAPIENTRY EGL_HandleGPUSwitchANGLE(EGLDisplay dpy) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(HandleGPUSwitchANGLE, "dpy = 0x%016" PRIxPTR "", (uintptr_t)dpy); > >@@ -341,9 +364,16 @@ void EGLAPIENTRY EGL_HandleGPUSwitchANGLE(EGLDisplay dpy) > HandleGPUSwitchANGLE(thread, dpyPacked); > } > >+// EGL_ANGLE_prepare_swap_buffers >+EGLBoolean EGLAPIENTRY EGL_PrepareSwapBuffersANGLE(EGLDisplay dpy, EGLSurface surface) >+{ >+ return PrepareSwapBuffersANGLE(dpy, surface); >+} >+ > // EGL_ANGLE_program_cache_control > EGLint EGLAPIENTRY EGL_ProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ProgramCacheGetAttribANGLE, "dpy = 0x%016" PRIxPTR ", attrib = 0x%X", (uintptr_t)dpy, > attrib); >@@ -365,6 +395,7 @@ void EGLAPIENTRY EGL_ProgramCacheQueryANGLE(EGLDisplay dpy, > void *binary, > EGLint *binarysize) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ProgramCacheQueryANGLE, > "dpy = 0x%016" PRIxPTR ", index = %d, key = 0x%016" PRIxPTR >@@ -389,6 +420,7 @@ void EGLAPIENTRY EGL_ProgramCachePopulateANGLE(EGLDisplay dpy, > const void *binary, > EGLint binarysize) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ProgramCachePopulateANGLE, > "dpy = 0x%016" PRIxPTR ", key = 0x%016" PRIxPTR >@@ -407,6 +439,7 @@ void EGLAPIENTRY EGL_ProgramCachePopulateANGLE(EGLDisplay dpy, > > EGLint EGLAPIENTRY EGL_ProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, EGLint mode) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ProgramCacheResizeANGLE, "dpy = 0x%016" PRIxPTR ", limit = %d, mode = %d", > (uintptr_t)dpy, limit, mode); >@@ -427,6 +460,8 @@ EGLBoolean EGLAPIENTRY EGL_QuerySurfacePointerANGLE(EGLDisplay dpy, > EGLint attribute, > void **value) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QuerySurfacePointerANGLE, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR >@@ -449,6 +484,7 @@ EGLBoolean EGLAPIENTRY EGL_CreateStreamProducerD3DTextureANGLE(EGLDisplay dpy, > EGLStreamKHR stream, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateStreamProducerD3DTextureANGLE, > "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR >@@ -472,6 +508,7 @@ EGLBoolean EGLAPIENTRY EGL_StreamPostD3DTextureANGLE(EGLDisplay dpy, > void *texture, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(StreamPostD3DTextureANGLE, > "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", texture = 0x%016" PRIxPTR >@@ -495,6 +532,8 @@ EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithFrameTokenANGLE(EGLDisplay dpy, > EGLSurface surface, > EGLFrameTokenANGLE frametoken) > { >+ ANGLE_EGLBOOLEAN_TRY(PrepareSwapBuffersANGLE(dpy, surface)); >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(SwapBuffersWithFrameTokenANGLE, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", frametoken = 0x%llX", >@@ -517,6 +556,8 @@ EGLBoolean EGLAPIENTRY EGL_GetMscRateANGLE(EGLDisplay dpy, > EGLint *numerator, > EGLint *denominator) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetMscRateANGLE, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", numerator = 0x%016" PRIxPTR >@@ -540,6 +581,7 @@ EGLBoolean EGLAPIENTRY EGL_ExportVkImageANGLE(EGLDisplay dpy, > void *vk_image, > void *vk_image_create_info) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ExportVkImageANGLE, > "dpy = 0x%016" PRIxPTR ", image = 0x%016" PRIxPTR ", vk_image = 0x%016" PRIxPTR >@@ -565,6 +607,8 @@ EGLBoolean EGLAPIENTRY EGL_GetSyncValuesCHROMIUM(EGLDisplay dpy, > EGLuint64KHR *msc, > EGLuint64KHR *sbc) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetSyncValuesCHROMIUM, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", ust = 0x%016" PRIxPTR >@@ -587,6 +631,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryDeviceAttribEXT(EGLDeviceEXT device, > EGLint attribute, > EGLAttrib *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryDeviceAttribEXT, > "device = 0x%016" PRIxPTR ", attribute = %d, value = 0x%016" PRIxPTR "", >@@ -604,6 +649,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryDeviceAttribEXT(EGLDeviceEXT device, > > const char *EGLAPIENTRY EGL_QueryDeviceStringEXT(EGLDeviceEXT device, EGLint name) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryDeviceStringEXT, "device = 0x%016" PRIxPTR ", name = %d", (uintptr_t)device, > name); >@@ -619,6 +665,7 @@ const char *EGLAPIENTRY EGL_QueryDeviceStringEXT(EGLDeviceEXT device, EGLint nam > > EGLBoolean EGLAPIENTRY EGL_QueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryDisplayAttribEXT, > "dpy = 0x%016" PRIxPTR ", attribute = %d, value = 0x%016" PRIxPTR "", (uintptr_t)dpy, >@@ -640,6 +687,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, > void *native_pixmap, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreatePlatformPixmapSurfaceEXT, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_pixmap = 0x%016" PRIxPTR >@@ -664,6 +712,7 @@ EGLSurface EGLAPIENTRY EGL_CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, > void *native_window, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreatePlatformWindowSurfaceEXT, > "dpy = 0x%016" PRIxPTR ", config = 0x%016" PRIxPTR ", native_window = 0x%016" PRIxPTR >@@ -687,6 +736,7 @@ EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplayEXT(EGLenum platform, > void *native_display, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetPlatformDisplayEXT, > "platform = 0x%X, native_display = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR >@@ -707,6 +757,7 @@ EGLDisplay EGLAPIENTRY EGL_GetPlatformDisplayEXT(EGLenum platform, > EGLint EGLAPIENTRY EGL_DebugMessageControlKHR(EGLDEBUGPROCKHR callback, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DebugMessageControlKHR, > "callback = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "", (uintptr_t)callback, >@@ -727,6 +778,7 @@ EGLint EGLAPIENTRY EGL_LabelObjectKHR(EGLDisplay display, > EGLObjectKHR object, > EGLLabelKHR label) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(LabelObjectKHR, > "display = 0x%016" PRIxPTR ", objectType = 0x%X, object = 0x%016" PRIxPTR >@@ -746,6 +798,7 @@ EGLint EGLAPIENTRY EGL_LabelObjectKHR(EGLDisplay display, > > EGLBoolean EGLAPIENTRY EGL_QueryDebugKHR(EGLint attribute, EGLAttrib *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryDebugKHR, "attribute = %d, value = 0x%016" PRIxPTR "", attribute, > (uintptr_t)value); >@@ -763,6 +816,7 @@ EGLint EGLAPIENTRY EGL_ClientWaitSyncKHR(EGLDisplay dpy, > EGLint flags, > EGLTimeKHR timeout) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(ClientWaitSyncKHR, > "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d, timeout = %llu", >@@ -781,6 +835,7 @@ EGLint EGLAPIENTRY EGL_ClientWaitSyncKHR(EGLDisplay dpy, > > EGLSyncKHR EGLAPIENTRY EGL_CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateSyncKHR, > "dpy = 0x%016" PRIxPTR ", type = 0x%X, attrib_list = 0x%016" PRIxPTR "", >@@ -799,6 +854,7 @@ EGLSyncKHR EGLAPIENTRY EGL_CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGL > > EGLBoolean EGLAPIENTRY EGL_DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DestroySyncKHR, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR "", (uintptr_t)dpy, > (uintptr_t)sync); >@@ -819,6 +875,7 @@ EGLBoolean EGLAPIENTRY EGL_GetSyncAttribKHR(EGLDisplay dpy, > EGLint attribute, > EGLint *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(GetSyncAttribKHR, > "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR >@@ -843,6 +900,7 @@ EGLImageKHR EGLAPIENTRY EGL_CreateImageKHR(EGLDisplay dpy, > EGLClientBuffer buffer, > const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateImageKHR, > "dpy = 0x%016" PRIxPTR ", ctx = 0x%016" PRIxPTR >@@ -863,6 +921,7 @@ EGLImageKHR EGLAPIENTRY EGL_CreateImageKHR(EGLDisplay dpy, > > EGLBoolean EGLAPIENTRY EGL_DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DestroyImageKHR, "dpy = 0x%016" PRIxPTR ", image = 0x%016" PRIxPTR "", (uintptr_t)dpy, > (uintptr_t)image); >@@ -883,6 +942,8 @@ EGLBoolean EGLAPIENTRY EGL_LockSurfaceKHR(EGLDisplay dpy, > EGLSurface surface, > const EGLint *attrib_list) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(LockSurfaceKHR, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR >@@ -906,6 +967,8 @@ EGLBoolean EGLAPIENTRY EGL_QuerySurface64KHR(EGLDisplay dpy, > EGLint attribute, > EGLAttribKHR *value) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QuerySurface64KHR, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR >@@ -925,6 +988,8 @@ EGLBoolean EGLAPIENTRY EGL_QuerySurface64KHR(EGLDisplay dpy, > > EGLBoolean EGLAPIENTRY EGL_UnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(UnlockSurfaceKHR, "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)surface); >@@ -943,6 +1008,7 @@ EGLBoolean EGLAPIENTRY EGL_UnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) > // EGL_KHR_reusable_sync > EGLBoolean EGLAPIENTRY EGL_SignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(SignalSyncKHR, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", mode = 0x%X", > (uintptr_t)dpy, (uintptr_t)sync, mode); >@@ -969,6 +1035,7 @@ EGLBoolean EGLAPIENTRY EGL_SignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenu > // EGL_KHR_stream > EGLStreamKHR EGLAPIENTRY EGL_CreateStreamKHR(EGLDisplay dpy, const EGLint *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(CreateStreamKHR, "dpy = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)attrib_list); >@@ -986,6 +1053,7 @@ EGLStreamKHR EGLAPIENTRY EGL_CreateStreamKHR(EGLDisplay dpy, const EGLint *attri > > EGLBoolean EGLAPIENTRY EGL_DestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(DestroyStreamKHR, "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)stream); >@@ -1006,6 +1074,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryStreamKHR(EGLDisplay dpy, > EGLenum attribute, > EGLint *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryStreamKHR, > "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR >@@ -1028,6 +1097,7 @@ EGLBoolean EGLAPIENTRY EGL_QueryStreamu64KHR(EGLDisplay dpy, > EGLenum attribute, > EGLuint64KHR *value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(QueryStreamu64KHR, > "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR >@@ -1050,6 +1120,7 @@ EGLBoolean EGLAPIENTRY EGL_StreamAttribKHR(EGLDisplay dpy, > EGLenum attribute, > EGLint value) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(StreamAttribKHR, > "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", attribute = 0x%X, value = %d", >@@ -1069,6 +1140,7 @@ EGLBoolean EGLAPIENTRY EGL_StreamAttribKHR(EGLDisplay dpy, > // EGL_KHR_stream_consumer_gltexture > EGLBoolean EGLAPIENTRY EGL_StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(StreamConsumerAcquireKHR, "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)stream); >@@ -1086,6 +1158,7 @@ EGLBoolean EGLAPIENTRY EGL_StreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR > > EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(StreamConsumerGLTextureExternalKHR, > "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "", (uintptr_t)dpy, >@@ -1104,6 +1177,7 @@ EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EG > > EGLBoolean EGLAPIENTRY EGL_StreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(StreamConsumerReleaseKHR, "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR "", > (uintptr_t)dpy, (uintptr_t)stream); >@@ -1125,6 +1199,8 @@ EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithDamageKHR(EGLDisplay dpy, > const EGLint *rects, > EGLint n_rects) > { >+ ANGLE_EGLBOOLEAN_TRY(PrepareSwapBuffersANGLE(dpy, surface)); >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(SwapBuffersWithDamageKHR, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR ", rects = 0x%016" PRIxPTR >@@ -1145,6 +1221,7 @@ EGLBoolean EGLAPIENTRY EGL_SwapBuffersWithDamageKHR(EGLDisplay dpy, > // EGL_KHR_wait_sync > EGLint EGLAPIENTRY EGL_WaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(WaitSyncKHR, "dpy = 0x%016" PRIxPTR ", sync = 0x%016" PRIxPTR ", flags = %d", > (uintptr_t)dpy, (uintptr_t)sync, flags); >@@ -1168,6 +1245,8 @@ EGLBoolean EGLAPIENTRY EGL_PostSubBufferNV(EGLDisplay dpy, > EGLint width, > EGLint height) > { >+ >+ ANGLE_SCOPED_GLOBAL_SURFACE_LOCK(); > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(PostSubBufferNV, > "dpy = 0x%016" PRIxPTR ", surface = 0x%016" PRIxPTR >@@ -1190,6 +1269,7 @@ EGLBoolean EGLAPIENTRY EGL_StreamConsumerGLTextureExternalAttribsNV(EGLDisplay d > EGLStreamKHR stream, > const EGLAttrib *attrib_list) > { >+ > ANGLE_SCOPED_GLOBAL_LOCK(); > EGL_EVENT(StreamConsumerGLTextureExternalAttribsNV, > "dpy = 0x%016" PRIxPTR ", stream = 0x%016" PRIxPTR ", attrib_list = 0x%016" PRIxPTR >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.h b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.h >index 3becf6890d07d6576628b6da57ffdbf835fbdb3c..ed4760226697d1a07b814b6b5be56761b2e1ea2c 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_egl_ext_autogen.h >@@ -79,6 +79,9 @@ ANGLE_EXPORT void EGLAPIENTRY EGL_ReleaseHighPowerGPUANGLE(EGLDisplay dpy, EGLCo > ANGLE_EXPORT void EGLAPIENTRY EGL_ReacquireHighPowerGPUANGLE(EGLDisplay dpy, EGLContext ctx); > ANGLE_EXPORT void EGLAPIENTRY EGL_HandleGPUSwitchANGLE(EGLDisplay dpy); > >+// EGL_ANGLE_prepare_swap_buffers >+ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_PrepareSwapBuffersANGLE(EGLDisplay dpy, EGLSurface surface); >+ > // EGL_ANGLE_program_cache_control > ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib); > ANGLE_EXPORT void EGLAPIENTRY EGL_ProgramCacheQueryANGLE(EGLDisplay dpy, >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.cpp >index c417bba2665996d32755e2641afcf7974576006e..18450fb7c0e6159899373b103c565e7b7192d98e 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.cpp >@@ -36,6 +36,8 @@ using namespace gl; > > extern "C" { > >+// GL_ANDROID_extension_pack_es31a >+ > // GL_ANGLE_base_vertex_base_instance > void GL_APIENTRY GL_DrawArraysInstancedBaseInstanceANGLE(GLenum mode, > GLint first, >@@ -7697,6 +7699,8 @@ void GL_APIENTRY GL_ValidateProgramPipelineEXT(GLuint pipeline) > } > } > >+// GL_EXT_shader_framebuffer_fetch >+ > // GL_EXT_shader_framebuffer_fetch_non_coherent > void GL_APIENTRY GL_FramebufferFetchBarrierEXT() > { >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.h b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.h >index a08ffb31fe6319132c46a16048e47cece5e3a6db..543d367b796fb3cc44e89ed333271de3e5dcc00f 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/entry_points_gles_ext_autogen.h >@@ -20,6 +20,8 @@ > > extern "C" { > >+// GL_ANDROID_extension_pack_es31a >+ > // GL_ANGLE_base_vertex_base_instance > ANGLE_EXPORT void GL_APIENTRY GL_DrawArraysInstancedBaseInstanceANGLE(GLenum mode, > GLint first, >@@ -1156,6 +1158,8 @@ ANGLE_EXPORT void GL_APIENTRY GL_UseProgramStagesEXT(GLuint pipeline, > GLuint program); > ANGLE_EXPORT void GL_APIENTRY GL_ValidateProgramPipelineEXT(GLuint pipeline); > >+// GL_EXT_shader_framebuffer_fetch >+ > // GL_EXT_shader_framebuffer_fetch_non_coherent > ANGLE_EXPORT void GL_APIENTRY GL_FramebufferFetchBarrierEXT(); > >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp >index f3d11f6803575d4a4e727c24b93af7b86c3ae874..276c694c2cd3c3490edba8ad364493475c95199c 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.cpp >@@ -26,6 +26,9 @@ namespace > ANGLE_REQUIRE_CONSTANT_INIT std::atomic<angle::GlobalMutex *> g_Mutex(nullptr); > static_assert(std::is_trivially_destructible<decltype(g_Mutex)>::value, > "global mutex is not trivially destructible"); >+ANGLE_REQUIRE_CONSTANT_INIT std::atomic<angle::GlobalMutex *> g_SurfaceMutex(nullptr); >+static_assert(std::is_trivially_destructible<decltype(g_SurfaceMutex)>::value, >+ "global mutex is not trivially destructible"); > > ANGLE_REQUIRE_CONSTANT_INIT gl::Context *g_LastContext(nullptr); > static_assert(std::is_trivially_destructible<decltype(g_LastContext)>::value, >@@ -84,19 +87,29 @@ Thread *AllocateCurrentThread() > return thread; > } > >-void AllocateMutex() >+void AllocateGlobalMutex(std::atomic<angle::GlobalMutex *> &mutex) > { >- if (g_Mutex == nullptr) >+ if (mutex == nullptr) > { > std::unique_ptr<angle::GlobalMutex> newMutex(new angle::GlobalMutex()); > angle::GlobalMutex *expected = nullptr; >- if (g_Mutex.compare_exchange_strong(expected, newMutex.get())) >+ if (mutex.compare_exchange_strong(expected, newMutex.get())) > { > newMutex.release(); > } > } > } > >+void AllocateMutex() >+{ >+ AllocateGlobalMutex(g_Mutex); >+} >+ >+void AllocateSurfaceMutex() >+{ >+ AllocateGlobalMutex(g_SurfaceMutex); >+} >+ > } // anonymous namespace > > #if defined(ANGLE_PLATFORM_APPLE) >@@ -137,6 +150,12 @@ angle::GlobalMutex &GetGlobalMutex() > return *g_Mutex; > } > >+angle::GlobalMutex &GetGlobalSurfaceMutex() >+{ >+ AllocateSurfaceMutex(); >+ return *g_SurfaceMutex; >+} >+ > gl::Context *GetGlobalLastContext() > { > return g_LastContext; >@@ -216,6 +235,19 @@ namespace egl > > namespace > { >+ >+void DeallocateGlobalMutex(std::atomic<angle::GlobalMutex *> &mutex) >+{ >+ angle::GlobalMutex *toDelete = mutex.exchange(nullptr); >+ if (!mutex) >+ return; >+ { >+ // Wait for toDelete to become released by other threads before deleting. >+ std::lock_guard<angle::GlobalMutex> lock(*toDelete); >+ } >+ SafeDelete(toDelete); >+} >+ > void DeallocateCurrentThread() > { > SafeDelete(gCurrentThread); >@@ -223,12 +255,12 @@ void DeallocateCurrentThread() > > void DeallocateMutex() > { >- angle::GlobalMutex *mutex = g_Mutex.exchange(nullptr); >- { >- // Wait for the mutex to become released by other threads before deleting. >- std::lock_guard<angle::GlobalMutex> lock(*mutex); >- } >- SafeDelete(mutex); >+ DeallocateGlobalMutex(g_Mutex); >+} >+ >+void DeallocateSurfaceMutex() >+{ >+ DeallocateGlobalMutex(g_SurfaceMutex); > } > > bool InitializeProcess() >@@ -241,6 +273,7 @@ bool InitializeProcess() > void TerminateProcess() > { > DeallocateDebug(); >+ DeallocateSurfaceMutex(); > DeallocateMutex(); > DeallocateCurrentThread(); > } >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.h b/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.h >index 4f7454297f3649816846e3200f5c35d83b5fde86..b187ab8fc972f16ba5875f8bbe8335d852496a77 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.h >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/global_state.h >@@ -101,6 +101,7 @@ extern thread_local Thread *gCurrentThread; > #endif > > angle::GlobalMutex &GetGlobalMutex(); >+angle::GlobalMutex &GetGlobalSurfaceMutex(); > gl::Context *GetGlobalLastContext(); > void SetGlobalLastContext(gl::Context *context); > Thread *GetCurrentThread(); >@@ -119,8 +120,14 @@ class ScopedSyncCurrentContextFromThread > > } // namespace egl > >+#define ANGLE_GLOBAL_SURFACE_LOCK_VAR_NAME globalSurfaceMutexLock >+#define ANGLE_SCOPED_GLOBAL_SURFACE_LOCK() \ >+ std::lock_guard<angle::GlobalMutex> ANGLE_GLOBAL_SURFACE_LOCK_VAR_NAME( \ >+ egl::GetGlobalSurfaceMutex()) >+ >+#define ANGLE_GLOBAL_LOCK_VAR_NAME globalMutexLock > #define ANGLE_SCOPED_GLOBAL_LOCK() \ >- std::lock_guard<angle::GlobalMutex> globalMutexLock(egl::GetGlobalMutex()) >+ std::lock_guard<angle::GlobalMutex> ANGLE_GLOBAL_LOCK_VAR_NAME(egl::GetGlobalMutex()) > > namespace gl > { >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.cpp >index 692682240e62034c219f6f48582e7bbac67173aa..61cf5603421a77e8d9059430e575dfefa3549e89 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.cpp >@@ -2713,6 +2713,8 @@ void GL_APIENTRY glVertexPointer(GLint size, GLenum type, GLsizei stride, const > return GL_VertexPointer(size, type, stride, pointer); > } > >+// GL_ANDROID_extension_pack_es31a >+ > // GL_ANGLE_base_vertex_base_instance > void GL_APIENTRY glDrawArraysInstancedBaseInstanceANGLE(GLenum mode, > GLint first, >@@ -4711,6 +4713,8 @@ void GL_APIENTRY glValidateProgramPipelineEXT(GLuint pipeline) > return GL_ValidateProgramPipelineEXT(pipeline); > } > >+// GL_EXT_shader_framebuffer_fetch >+ > // GL_EXT_shader_framebuffer_fetch_non_coherent > void GL_APIENTRY glFramebufferFetchBarrierEXT() > { >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.def b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.def >index b12272a60c6e962b0b708bf5fe0698880927a399..d928fd30f25e7b21ecb80d70af512fafd832ea71 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.def >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_autogen.def >@@ -460,6 +460,8 @@ EXPORTS > glTranslatex > glVertexPointer > >+ ; GL_ANDROID_extension_pack_es31a >+ > ; GL_ANGLE_base_vertex_base_instance > glDrawArraysInstancedBaseInstanceANGLE > glDrawElementsInstancedBaseVertexBaseInstanceANGLE >@@ -829,6 +831,8 @@ EXPORTS > glUseProgramStagesEXT > glValidateProgramPipelineEXT > >+ ; GL_EXT_shader_framebuffer_fetch >+ > ; GL_EXT_shader_framebuffer_fetch_non_coherent > glFramebufferFetchBarrierEXT > >@@ -1219,6 +1223,9 @@ EXPORTS > EGL_ReacquireHighPowerGPUANGLE > EGL_ReleaseHighPowerGPUANGLE > >+ ; EGL_ANGLE_prepare_swap_buffers >+ EGL_PrepareSwapBuffersANGLE >+ > ; EGL_ANGLE_program_cache_control > EGL_ProgramCacheGetAttribANGLE > EGL_ProgramCachePopulateANGLE >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_no_capture_autogen.def b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_no_capture_autogen.def >index 59e89daf294a16f2b9497187aa70cf6f475aec69..b556cdda7c063a6093578e1d3786af86db3058d7 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_no_capture_autogen.def >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_no_capture_autogen.def >@@ -460,6 +460,8 @@ EXPORTS > glTranslatex > glVertexPointer > >+ ; GL_ANDROID_extension_pack_es31a >+ > ; GL_ANGLE_base_vertex_base_instance > glDrawArraysInstancedBaseInstanceANGLE > glDrawElementsInstancedBaseVertexBaseInstanceANGLE >@@ -829,6 +831,8 @@ EXPORTS > glUseProgramStagesEXT > glValidateProgramPipelineEXT > >+ ; GL_EXT_shader_framebuffer_fetch >+ > ; GL_EXT_shader_framebuffer_fetch_non_coherent > glFramebufferFetchBarrierEXT > >@@ -1219,6 +1223,9 @@ EXPORTS > EGL_ReacquireHighPowerGPUANGLE > EGL_ReleaseHighPowerGPUANGLE > >+ ; EGL_ANGLE_prepare_swap_buffers >+ EGL_PrepareSwapBuffersANGLE >+ > ; EGL_ANGLE_program_cache_control > EGL_ProgramCacheGetAttribANGLE > EGL_ProgramCachePopulateANGLE >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_with_capture_autogen.def b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_with_capture_autogen.def >index 55f9f6c791e3e9e11775daeda472a59d218cd48d..eddebdcb8193d5d7f8a54504f7aa1ccf203a11ef 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_with_capture_autogen.def >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/libGLESv2_with_capture_autogen.def >@@ -460,6 +460,8 @@ EXPORTS > glTranslatex > glVertexPointer > >+ ; GL_ANDROID_extension_pack_es31a >+ > ; GL_ANGLE_base_vertex_base_instance > glDrawArraysInstancedBaseInstanceANGLE > glDrawElementsInstancedBaseVertexBaseInstanceANGLE >@@ -829,6 +831,8 @@ EXPORTS > glUseProgramStagesEXT > glValidateProgramPipelineEXT > >+ ; GL_EXT_shader_framebuffer_fetch >+ > ; GL_EXT_shader_framebuffer_fetch_non_coherent > glFramebufferFetchBarrierEXT > >@@ -1219,6 +1223,9 @@ EXPORTS > EGL_ReacquireHighPowerGPUANGLE > EGL_ReleaseHighPowerGPUANGLE > >+ ; EGL_ANGLE_prepare_swap_buffers >+ EGL_PrepareSwapBuffersANGLE >+ > ; EGL_ANGLE_program_cache_control > EGL_ProgramCacheGetAttribANGLE > EGL_ProgramCachePopulateANGLE >diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/proc_table_egl_autogen.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/proc_table_egl_autogen.cpp >index cd08152b8df9a26b235b56fb4b12e1e4f9edb169..0ed920fd60a8b680eeffccb6ebaec56f5ccb10ca 100644 >--- a/Source/ThirdParty/ANGLE/src/libGLESv2/proc_table_egl_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/proc_table_egl_autogen.cpp >@@ -88,6 +88,7 @@ const ProcEntry g_procTable[] = { > {"eglLockSurfaceKHR", P(EGL_LockSurfaceKHR)}, > {"eglMakeCurrent", P(EGL_MakeCurrent)}, > {"eglPostSubBufferNV", P(EGL_PostSubBufferNV)}, >+ {"eglPrepareSwapBuffersANGLE", P(EGL_PrepareSwapBuffersANGLE)}, > {"eglPresentationTimeANDROID", P(EGL_PresentationTimeANDROID)}, > {"eglProgramCacheGetAttribANGLE", P(EGL_ProgramCacheGetAttribANGLE)}, > {"eglProgramCachePopulateANGLE", P(EGL_ProgramCachePopulateANGLE)}, >@@ -929,5 +930,5 @@ const ProcEntry g_procTable[] = { > {"glWaitSync", P(GL_WaitSync)}, > {"glWeightPointerOES", P(GL_WeightPointerOES)}}; > >-const size_t g_numProcs = 896; >+const size_t g_numProcs = 897; > } // namespace egl >diff --git a/Source/ThirdParty/ANGLE/src/tests/BUILD.gn b/Source/ThirdParty/ANGLE/src/tests/BUILD.gn >index b6ef18d282dbc9c9f27be6a20f2c1becaf95e882..5f2dec4200fef77598ff6ada4c9d38866021a22f 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/BUILD.gn >+++ b/Source/ThirdParty/ANGLE/src/tests/BUILD.gn >@@ -3,7 +3,6 @@ > # found in the LICENSE file. > > import("//build/config/chromecast_build.gni") >-import("//build/config/win/control_flow_guard.gni") > import("//testing/test.gni") > import("../../gni/angle.gni") > import("angle_unittests.gni") >@@ -965,14 +964,6 @@ if (build_angle_gles1_conform_tests) { > ### dEQP tests > ###----------------------------------------------------- > >-config("win_x86_disable_guards_cfg_compiler") { >- if (is_win && target_cpu == "x86" && win_enable_cfg_guards) { >- # See crbug.com/1260874 avoid bad unwinding of exceptions when >- # compiled with cfg guards for x86. >- configs = [ "//build/config/win:disable_guards_cfg_compiler" ] >- } >-} >- > if (build_angle_deqp_tests && !is_fuchsia) { > import("deqp_support/deqp.gni") > import("deqp_support/deqp_data_autogen.gni") >@@ -1088,7 +1079,7 @@ if (build_angle_deqp_tests && !is_fuchsia) { > testonly = true > forward_variables_from(invoker, "*") > suppressed_configs += deqp_undefine_configs >- configs += [ ":win_x86_disable_guards_cfg_compiler" ] >+ > if (is_clang) { > cflags += [ > # Suppress a spurious header warning. http://crbug.com/995046 >@@ -1327,7 +1318,7 @@ if (build_angle_deqp_tests && !is_fuchsia) { > "$angle_root/util:angle_test_utils", > "$angle_root/util:angle_util", > ] >- configs += [ ":win_x86_disable_guards_cfg_compiler" ] >+ > suppressed_configs += deqp_undefine_configs > public_configs += [ ":$config_name" ] > >@@ -1367,7 +1358,6 @@ if (build_angle_deqp_tests && !is_fuchsia) { > "deqp_support/${expectations_file}", > "${invoker.mustpass_dir}/${invoker.mustpass_name}", > ] >- configs += [ ":win_x86_disable_guards_cfg_compiler" ] > } > } > >diff --git a/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni b/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni >index 77f7932aea3a596e24e2a2171b0ee60ee1e2ba3f..bb63181b2357869c17a53d07857597d1aaf4dc34 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni >+++ b/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests.gni >@@ -14,6 +14,7 @@ angle_end2end_tests_sources = [ > "egl_tests/EGLCreateContextAttribsTest.cpp", > "egl_tests/EGLDebugTest.cpp", > "egl_tests/EGLDisplayPowerPreferenceTest.cpp", >+ "egl_tests/EGLLockSurface3Test.cpp", > "egl_tests/EGLMultiContextTest.cpp", > "egl_tests/EGLNoConfigContextTest.cpp", > "egl_tests/EGLPreRotationTest.cpp", >@@ -70,6 +71,7 @@ angle_end2end_tests_sources = [ > "gl_tests/ExternalWrapTest.cpp", > "gl_tests/FenceSyncTests.cpp", > "gl_tests/FloatingPointSurfaceTest.cpp", >+ "gl_tests/FragDepthTest.cpp", > "gl_tests/FramebufferFetchTest.cpp", > "gl_tests/FramebufferMixedSamplesTest.cpp", > "gl_tests/FramebufferMultiviewTest.cpp", >diff --git a/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests_expectations.txt b/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests_expectations.txt >index 9ed4a8d6e3b89eabc1f418ebc6a88ee2b788f5eb..7dbc08e91c9d74537b0e7ec7a2ea07b2fd6d0324 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests_expectations.txt >+++ b/Source/ThirdParty/ANGLE/src/tests/angle_end2end_tests_expectations.txt >@@ -4,6 +4,12 @@ > > // See deqp_support/README.md for format. > >+// Thread sanitizer skips. >+6718 TSAN : MultithreadingTestES3.MultithreadFenceDraw/* = SKIP >+6718 TSAN : MultithreadingTestES3.MultithreadFenceTexImage/* = SKIP >+6746 TSAN : *AsyncQueue* = SKIP >+6804 LINUX VULKAN TSAN : MultithreadingTest.MultiContextDrawWithSwapBuffers/* = SKIP >+ > // Generic > // Fails in the flush thread when calling eglMakeCurrent. > 6063 OPENGL : SimpleStateChangeTestES31.DrawThenChangeFBOThenDrawThenFlushInAnotherThreadThenDrawIndexed/* = SKIP >@@ -23,7 +29,6 @@ > 6743 OPENGL : SimpleStateChangeTestES3.RespecifyBufferAfterBeginTransformFeedback/* = SKIP > 6743 GLES : SimpleStateChangeTestES3.RespecifyBufferAfterBeginTransformFeedback/* = SKIP > >- > // Direct SPIR-V generation. The following tests pass on some platforms but not others. Need to investigate. > 4889 VULKAN : GeometryShaderTest.LayeredFramebufferPreRenderClear2DArrayColor/* = SKIP > 4889 VULKAN : GeometryShaderTest.LayeredFramebufferPreRenderClear3DColor/* = SKIP >@@ -53,6 +58,7 @@ > 6217 WIN INTEL OPENGL : GLSLTest_ES31.StorageBufferBoolVectorPassedToFunctions/* = SKIP > 6826 WIN NVIDIA OPENGL : GLSLTest.VectorAndMatrixScalarizationDoesNotAffectRendering/* = SKIP > 6826 WIN NVIDIA GLES : GLSLTest.VectorAndMatrixScalarizationDoesNotAffectRendering/* = SKIP >+4716 WIN NVIDIA GLES : CopyTextureTest.CopyOutsideMipmap/* = SKIP > > // Linux > 6065 LINUX INTEL VULKAN : SimpleStateChangeTestES31.DrawThenUpdateUBOThenDrawThenDrawIndexed/* = SKIP >@@ -100,6 +106,13 @@ > // Fails on older mesa in some sequence of test > 6563 LINUX INTEL VULKAN : TransformFeedbackTest.EndWithDifferentProgram/* = SKIP > >+// Linux AMD >+6855 LINUX AMD OPENGL : ClearTestES3.ClearMaxAttachmentsAfterDraw/* = SKIP >+6855 LINUX AMD OPENGL : GeometryShaderTest.LayeredFramebufferClear2DArrayColor/* = SKIP >+6855 LINUX AMD OPENGL : GeometryShaderTest.LayeredFramebufferPreRenderClear2DArrayColor/* = SKIP >+6855 LINUX AMD OPENGL : SimpleStateChangeTestES3.DepthInvalidateThenClear/* = SKIP >+6855 LINUX AMD VULKAN : WebGL2ValidationStateChangeTest.MultiAttachmentDrawFramebufferNegativeAPI/* = SKIP >+ > // Mac > > 6025 MAC AMD OPENGL : IndexBufferOffsetTestES3.UseAsUBOThenUpdateThenUInt8Index/* = SKIP >@@ -126,12 +139,13 @@ > 6570 MAC INTEL OPENGL : WebGLCompatibilityTest.RGB32FTextures/* = SKIP > 6603 MAC OPENGL : ProgramBinaryES3Test.SaveAndLoadDetachedShaders/* = SKIP > 6643 MAC AMD OPENGL : TransformFeedbackTest.TransformFeedbackQueryPausedDrawThenResume/* = SKIP >+6643 MAC AMD OPENGL : TransformFeedbackTest.TransformFeedbackPausedDrawThenResume/* = SKIP > 6738 MAC AMD OPENGL : Texture3DTestES3.PixelUnpackStateTex* = SKIP > > // Failures from Transform Feedback Enablement. Passes on BigSur > 6407 MAC NVIDIA METAL : TransformFeedbackTest.OptimizedVaryings/ES3_Metal = SKIP >-6415 MAC INTEL METAL : CompressedTextureBPTCTest.Test/RGB_BPTC_SIGNED_FLOAT__ES3_Metal = SKIP >-6415 MAC INTEL METAL : CompressedTexturePVRTC1SRGBTest.Test/SRGB_PVRTC_2BPPV1__ES3_Metal = SKIP >+6415 MAC INTEL METAL : CompressedTextureBPTCTest.Test/ES3_Metal__RGB_BPTC_SIGNED_FLOAT = SKIP >+6415 MAC INTEL METAL : CompressedTexturePVRTC1SRGBTest.Test/ES3_Metal__SRGB_PVRTC_2BPPV1 = SKIP > 5345 MAC METAL AMD : TransformFeedbackTest.BufferOutOfMemory/ES3_Metal = SKIP > 5345 MAC METAL INTEL : TransformFeedbackTest.BufferOutOfMemory/ES3_Metal = SKIP > >@@ -345,6 +359,8 @@ > 5981 PIXEL4ORXL VULKAN : Texture3DCopy.UnsizedFormats/* = SKIP > 5981 PIXEL4ORXL VULKAN : TransformFeedbackTestIOBlocks.Interleaved/* = SKIP > 6744 PIXEL4ORXL VULKAN : SimpleStateChangeTestES3.OutOfBoundsByteAttribute/* = SKIP >+6843 PIXEL4ORXL VULKAN : ImageTest.SourceYUVAHBTargetExternalRGBSampleInitData/* = SKIP >+6843 PIXEL4ORXL VULKAN : ImageTestES3.SourceYUVAHBTargetExternalYUVSampleLinearFiltering/* = SKIP > > 6167 NEXUS5X GLES : DepthStencilTestES3.FramebufferClearThenStencilAttachedThenStencilTestState/* = SKIP > 6167 NEXUS5X GLES : DepthStencilTestES3.FramebufferClearThenStencilTestStateThenStencilAttached/* = SKIP >@@ -360,6 +376,40 @@ > 6179 NEXUS5X GLES : GLSLTest_ES31.BoolInInterfaceBlocks/* = SKIP > 6179 PIXEL4ORXL GLES : GLSLTest_ES31.BoolInInterfaceBlocks/* = SKIP > >+// Pixel 6 expectations. >+6931 PIXEL6 VULKAN : BlitFramebufferTest.OOBWrite/* = SKIP >+6931 PIXEL6 VULKAN : BufferDataTestES3.MapInvalidateThenBufferSubData/* = SKIP >+6931 PIXEL6 VULKAN : EGLSurfaceTest.ResizeWindowWithDraw/* = SKIP >+6931 PIXEL6 VULKAN : EGLSyncTest.AndroidNativeFence_ClientWait/* = SKIP >+6931 PIXEL6 VULKAN : ExternalBufferTestES31.* = SKIP >+6931 PIXEL6 VULKAN : FramebufferMultiviewLayeredClearTest.ScissoredClearBufferfi/* = SKIP >+6931 PIXEL6 VULKAN : FramebufferTest_ES31.MultipleTextureMultisampleResolveWithBlitMultipleResolves* = SKIP >+6931 PIXEL6 VULKAN : FramebufferTest_ES31.MultisampleResolveWithBlitThenDrawAttachment1/* = SKIP >+6931 PIXEL6 VULKAN : GLSLTest.PointCoordConsistency/* = SKIP >+6931 PIXEL6 VULKAN : GLSLTest_ES31.ArraysOfArraysImage/* = SKIP >+6931 PIXEL6 VULKAN : GLSLTest_ES31.BoolInInterfaceBlocks/* = SKIP >+6931 PIXEL6 VULKAN : GLSLTest_ES31.ConsecutiveArraysOfArraysImage/* = SKIP >+6931 PIXEL6 VULKAN : GeometryShaderTest.GeometryShaderImplementationDependentLimits/* = SKIP >+6931 PIXEL6 VULKAN : ImageTestES3.RGBXAHBImport* = SKIP >+6931 PIXEL6 VULKAN : IndexedBufferCopyTest.IndexRangeBug/* = SKIP >+6931 PIXEL6 VULKAN : IndexedPointsTest* = SKIP >+6931 PIXEL6 VULKAN : MultisampleTest.Point/* = SKIP >+6931 PIXEL6 VULKAN : MultithreadingTestES3.* = SKIP >+6931 PIXEL6 VULKAN : PointSpritesTest.PointCoordAndPointSizeCompliance/* = SKIP >+6931 PIXEL6 VULKAN : PointSpritesTest.PointCoordRegressionTest/* = SKIP >+6931 PIXEL6 VULKAN : PointSpritesTest.PointSizeAboveMaxIsClamped/* = SKIP >+6931 PIXEL6 VULKAN : PointSpritesTest.PointSizeEnabledCompliance/* = SKIP >+6931 PIXEL6 VULKAN : PointSpritesTest.PointSpriteAlternatingDrawTypes/* = SKIP >+6931 PIXEL6 VULKAN : PointSpritesTest.PointWithoutAttributesCompliance/* = SKIP >+6931 PIXEL6 VULKAN : PointSpritesTest.UsingPointCoordInsideFunction/* = SKIP >+6931 PIXEL6 VULKAN : ProgramInterfaceTestES31.ReloadFromCacheShouldNotCrash/* = SKIP >+6931 PIXEL6 VULKAN : ProgramPipelineTest31.ImageUniforms/* = SKIP >+6931 PIXEL6 VULKAN : ShaderStorageBufferTest31.CompoundAssignmentOperator/* = SKIP >+6931 PIXEL6 VULKAN : Texture2DTest.TexStorageWithPBOMiddlePixelDifferent/* = SKIP >+6931 PIXEL6 VULKAN : TransformFeedbackTestES32.* = SKIP >+6931 PIXEL6 VULKAN : TransformFeedbackTestIOBlocks.Separate/* = SKIP >+6931 PIXEL6 VULKAN : WebGLCompatibilityTest.FramebufferFloatColorAttachmentMRT/* = SKIP >+ > // AMD windows failures. The GPU and driver on our bots are very old and buggy. > // http://crbug.com/1224996 > 1224996 WIN AMD VULKAN : BootAnimationTest.DefaultBootAnimation/* = SKIP >@@ -413,13 +463,39 @@ > 6652 WIN AMD VULKAN : DrawTextureTest.ColorArrayDifferentTypes/* = SKIP > 6652 WIN AMD VULKAN : PointSpriteTest.TrianglesNotTreatedAsPointSprites/* = SKIP > >-6718 TSAN : MultithreadingTestES3.MultithreadFenceDraw/* = SKIP >-6718 TSAN : MultithreadingTestES3.MultithreadFenceTexImage/* = SKIP >-6746 TSAN : *Vulkan_AsyncQueue = SKIP >-6804 LINUX VULKAN TSAN : MultithreadingTest.MultiContextDrawWithSwapBuffers/* = SKIP >- > // Indexed indirect draw offset bug > 6751 METAL : MultiDrawIndirectTest.MultiDrawElementsIndirect* = SKIP > 6751 D3D11 : MultiDrawIndirectTest.MultiDrawElementsIndirect* = SKIP > 6751 METAL : DrawBaseVertexBaseInstanceTest.MultiDrawElementsInstancedBaseVertexBaseInstance/* = SKIP > 6751 D3D11 : DrawBaseVertexBaseInstanceTest.MultiDrawElementsInstancedBaseVertexBaseInstance/* = SKIP >+ >+// ASAN flakes with Vulkan / SwiftShader / AsyncQueue >+6875 ASAN VULKAN SWIFTSHADER : ComputeShaderTest.*/ES3_1_Vulkan_SwiftShader_AsyncQueue = SKIP >+6875 SWIFTSHADER : TransformFeedbackTest.SpanMultipleRenderPasses/* = SKIP >+ >+// Regression after a buffer change. >+6881 INTEL VULKAN LINUX : Texture2DTest.TexStorageWithPBOMiddlePixelDifferent/* = SKIP >+ >+// Cubemap sampling with explicit derivatives >+3814 PIXEL4ORXL VULKAN : CubeMapTextureTest.SampleCoordinateTransformGrad/* = SKIP >+3814 PIXEL4ORXL VULKAN : CubeMapTextureTest.SampleCoordinateTransformGrad_ES3/* = SKIP >+3814 PIXEL4ORXL GLES : CubeMapTextureTest.SampleCoordinateTransformGrad_ES3/* = SKIP >+3856 WIN D3D11 : CubeMapTextureTest.SampleCoordinateTransformGrad/* = SKIP >+3856 WIN D3D11 : CubeMapTextureTest.SampleCoordinateTransformGrad_ES3/* = SKIP >+6891 WIN D3D9 : CubeMapTextureTest.SampleCoordinateTransformGrad/* = SKIP >+6824 METAL INTEL : CubeMapTextureTest.SampleCoordinateTransformGrad/* = SKIP >+6824 METAL INTEL : CubeMapTextureTest.SampleCoordinateTransformGrad_ES3/* = SKIP >+ >+2799 NVIDIA OPENGL WIN : RobustBufferAccessBehaviorTest.DrawElementsIndexOutOfRangeWithStaticDraw/* = SKIP >+2799 NVIDIA OPENGL WIN : RobustBufferAccessBehaviorTest.DrawElementsIndexOutOfRangeWithDynamicDraw/* = SKIP >+2861 ANDROID GLES : RobustBufferAccessBehaviorTest.NoBufferData/* = SKIP >+2861 ANDROID GLES : RobustBufferAccessBehaviorTest.EmptyBuffer/* = SKIP >+3099 AMD OPENGL : RobustBufferAccessBehaviorTest.EmptyBuffer/* = SKIP >+ >+// Missing ETC2 support on macOS OpenGL >+3853 MAC OPENGL : Texture2DTestES3RobustInit.TextureCOMPRESSEDRGB8A1ETC2/* = SKIP >+3853 MAC OPENGL : Texture2DTestES3RobustInit.TextureCOMPRESSEDSRGB8A1ETC2/* = SKIP >+ >+// Missing Vulkan image initialization >+6941 VULKAN : Texture2DTestES3RobustInit.TextureCOMPRESSEDRGB8A1ETC2/* = SKIP >+6941 VULKAN : Texture2DTestES3RobustInit.TextureCOMPRESSEDSRGB8A1ETC2/* = SKIP >diff --git a/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/BUILD.gn b/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/BUILD.gn >index 602a1d4dc148be71c359e8eb6eda496623f11543..739667a9dcd2d97aea7523f0e751b313cafc11fb 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/BUILD.gn >+++ b/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/BUILD.gn >@@ -14,82 +14,62 @@ declare_args() { > angle_capture_replay_composite_file_id = 1 > } > >+angle_trace_fixture("angle_capture_replay_tests_fixture") { >+ gl_header = "angle_trace_gl.h" >+ public_deps = [ >+ "$angle_root:libEGL", >+ "$angle_root/util:angle_util", >+ ] >+} >+ >+_test_names_file = "test_names_${angle_capture_replay_composite_file_id}.json" >+ > if (angle_build_capture_replay_tests) { > assert(angle_with_capture_by_default, "Must build with capture by default.") > >- angle_trace_fixture("angle_capture_replay_tests_fixture") { >- gl_header = "angle_trace_gl.h" >- public_deps = [ >- "$angle_root:libEGL", >- "$angle_root/util:angle_util", >- ] >+ angle_trace_library("angle_capture_replay_library") { >+ _tracedir = angle_capture_replay_test_trace_dir >+ trace_dir = _tracedir >+ json_path = "$_tracedir/$_test_names_file" >+ trace_fixture = ":angle_capture_replay_tests_fixture" >+ short_names = true > } >+} > >- _dir = angle_capture_replay_test_trace_dir >- >- # Build each trace into a module. Use a short name to work around file path limits on Windows. >- # TODO(jmadill): Merge this config with restricted traces. http://anglebug.com/5133 >- >- _test_names_file = "test_names_${angle_capture_replay_composite_file_id}.json" >- _test_names_json = read_file("$_dir/$_test_names_file", "json") >- >- _trace_counter = 1 >- _traces = [] >- foreach(_trace, _test_names_json.traces) { >- _trace_json_path = "$_dir/$_trace.json" >- >- # This extra empty step is needed to prevent GN from warning on reassignment. >- _trace_data = { >- } >- _trace_data = read_file(_trace_json_path, "json") >- _ctx = _trace_data.WindowSurfaceContextID >- _target = "cr_trace_${_trace_counter}" >- _trace_counter += 1 >- angle_trace(_target) { >- trace_prefix = "$_dir/${_trace}_context${_ctx}" >- sources = rebase_path(_trace_data.TraceFiles, ".", _dir) >- data = [] >- fixture = ":angle_capture_replay_tests_fixture" >- output_name = _trace >- } >- >- _traces += [ ":${_target}" ] >+angle_executable("capture_replay_tests") { >+ testonly = true >+ sources = [ "CaptureReplayTests.cpp" ] >+ deps = [ >+ ":angle_capture_replay_tests_fixture", >+ "$angle_root:angle_common", >+ "$angle_root:angle_compression", >+ "$angle_root/util:angle_frame_capture_test_utils", >+ ] >+ >+ configs += [ >+ "$angle_root:library_name_config", >+ "$angle_root:libANGLE_config", >+ ] >+ defines = [] >+ >+ if ((is_linux || is_chromeos) && !is_component_build) { >+ # Set rpath to find shared libs in a non-component build. >+ configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ] > } > >- angle_executable("capture_replay_tests") { >- testonly = true >- sources = [ "CaptureReplayTests.cpp" ] >- data = [ "$_dir/$_test_names_file" ] >- deps = [ >- ":angle_capture_replay_tests_fixture", >- "$angle_root:angle_common", >- "$angle_root:angle_compression", >- "$angle_root/util:angle_frame_capture_test_utils", >- ] + _traces >- configs += [ >- "$angle_root:library_name_config", >- "$angle_root:libANGLE_config", >- ] >- defines = [] >+ suppressed_configs += [ "$angle_root:constructor_and_destructor_warnings" ] > >- if ((is_linux || is_chromeos) && !is_component_build) { >- # Set rpath to find shared libs in a non-component build. >- configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ] >- } >+ # Disable optimization to avoid optimizing huge files. >+ _trace_folder_relative_path = "./" + angle_capture_replay_test_trace_dir >+ _data_path = rebase_path(_trace_folder_relative_path, root_out_dir) >+ defines = [ >+ "ANGLE_CAPTURE_REPLAY_TEST_DATA_DIR=\"${_data_path}\"", >+ "ANGLE_CAPTURE_REPLAY_TEST_NAMES_PATH=\"${_data_path}/${_test_names_file}\"", >+ "ANGLE_REPLAY_EXPORT=", >+ ] >+ include_dirs = [ "." ] > >- suppressed_configs += [ "$angle_root:constructor_and_destructor_warnings" ] >- >- # Disable optimization to avoid optimizing huge files. >- _trace_folder_relative_path = "./" + angle_capture_replay_test_trace_dir >- _data_path = rebase_path(_trace_folder_relative_path, root_out_dir) >- defines = [ >- "ANGLE_CAPTURE_REPLAY_TEST_DATA_DIR=\"${_data_path}\"", >- "ANGLE_CAPTURE_REPLAY_TEST_NAMES_PATH=\"${_data_path}/${_test_names_file}\"", >- "ANGLE_REPLAY_EXPORT=", >- ] >- include_dirs = [ "." ] >- } >-} else { >- group("capture_replay_tests") { >+ if (angle_build_capture_replay_tests) { >+ data_deps = [ ":angle_capture_replay_library" ] > } > } >diff --git a/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/capture_replay_expectations.txt b/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/capture_replay_expectations.txt >index f22fd460218a97a3c19c722062b3c1530a1d3f56..ab5b162b255fce2609ef181cc6e2321c0c8dd644 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/capture_replay_expectations.txt >+++ b/Source/ThirdParty/ANGLE/src/tests/capture_replay_tests/capture_replay_expectations.txt >@@ -41,7 +41,7 @@ > 5822 : ExternalWrapTest.NoWrap/* = CRASH > 5822 : ExternalWrapTest.Repeat/* = CRASH > >-6267 : FramebufferTest.MultiContextNoRenderingFeedbackLoops/* = COMPILE_FAIL >+6267 : FramebufferTest.MultiContextNoRenderingFeedbackLoops/* = SKIP_FOR_CAPTURE > > 6286 : ImageTest.Deletion/* = FAIL > 6286 : ImageTest.MipLevels/* = FAIL >@@ -122,7 +122,6 @@ > 6314 : FramebufferTest_ES3.RenderAndInvalidateImmutableTextureWithBeyondMaxLevel/* = CRASH > 6180 : ImageTestES3.SourceCubeTargetExternalESSL3/* = FAIL > 6334 : MipmapTestES3.GenerateMipmapBaseLevelOutOfRangeImmutableTexture/* = CRASH >-6324 : OcclusionQueriesTestES3.UnresolveNotCounted/* = CRASH > 6333 : Texture2DFloatTestES3.TextureHalfFloatLinearLegacyTest/* = CRASH > 6333 : Texture2DFloatTestES3.TextureHalfFloatSampleLegacyTest/* = CRASH > 6334 : Texture2DTestES3.ImmutableTextureBaseLevelOutOfRange/* = CRASH >@@ -170,22 +169,7 @@ > 6631 : MultithreadingTest.MultiContextDrawWithSwapBuffers/* = CRASH > > # ES3_1 >-6180 : ProgramPipelineTest31.DifferentTextureTypes/* = FAIL >-6180 : ProgramPipelineTest31.DrawWith2DTexture/* = FAIL >-6180 : ProgramPipelineTest31.FragmentStageUniformTest/* = FAIL >-6180 : ProgramPipelineTest31.ImageUniforms/* = FAIL >-6180 : ProgramPipelineTest31.MaxFragmentShaderStorageBufferObjects/* = FAIL >-6180 : ProgramPipelineTest31.MaxFragmentUniformBufferObjects/* = FAIL >-6180 : ProgramPipelineTest31.PipelineWithoutVertexShader/* = FAIL >-6180 : ProgramPipelineTest31.ProgramPipelineVaryings/* = FAIL >-6180 : ProgramPipelineTest31.SampleTextureAThenTextureB/* = FAIL >-6180 : ProgramPipelineTest31.UseCreateShaderProgramv/* = FAIL >-6180 : ProgramPipelineTest31.VaryingIOBlockSeparableProgram/* = FAIL >-6180 : ProgramPipelineTest31.VaryingLocationMismatch/* = FAIL > 6180 : ProgramPipelineTest31.VerifyPpoLinkErrorSignalledCorrectly/* = FAIL >-6180 : SimpleStateChangeTestComputeES31PPO.DeleteImageTextureInUse/* = FAIL >-6180 : Texture2DTestES31PPO.TexStorage/* = FAIL >-6180 : Texture2DTestES31PPO.SingleTextureMultipleSamplers/* = FAIL > > # ES3_1 Crashed > 6180 : EGLMultiContextTest.ComputeShaderOkayWithRendering/* = CRASH >@@ -202,6 +186,7 @@ > 6611 : TextureMultisampleTest.ResolveToDefaultFramebuffer/ES3_1* = CRASH > 6611 : TextureMultisampleTest.ValidateTextureStorageMultisampleParameters/ES3_1* = CRASH > 6605 : TextureBufferTestES31.MapTextureBufferInvalidateThenWrite/* = FAIL >+6895 : AtomicCounterBufferTest31.AtomicCounterBufferRepeatedBindUnbind/* = CRASH > > # ES3_1 gtest skips > 6180 : GLSLTest_ES31.InterpolateAtWithSwizzle/* = NOT_RUN >@@ -216,3 +201,8 @@ > 6663 : Texture2DTest.UploadThenFSThenVSThenNewRPThenFS/* = NOT_RUN > > 6741 : VulkanImageTest.* = SKIP_FOR_CAPTURE >+ >+6941 : Texture2DTestES3RobustInit.TextureCOMPRESSEDRGB8A1ETC2/* = NOT_RUN >+6941 : Texture2DTestES3RobustInit.TextureCOMPRESSEDSRGB8A1ETC2/* = NOT_RUN >+ >+6875 : TransformFeedbackTest.SpanMultipleRenderPasses/* = NOT_RUN >diff --git a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ConstructCompiler_test.cpp b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ConstructCompiler_test.cpp >index 1834aba9658ec50b249f14d3a5e92cdab04093dc..735cafff4027c5e4f795bf145f9e393b5c1bbf48 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ConstructCompiler_test.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/compiler_tests/ConstructCompiler_test.cpp >@@ -19,6 +19,7 @@ TEST(ConstructCompilerTest, DefaultParameters) > ShHandle compiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, SH_WEBGL_SPEC, > SH_GLSL_COMPATIBILITY_OUTPUT, &resources); > ASSERT_NE(nullptr, compiler); >+ sh::Destruct(compiler); > } > > // Test invalid MaxDrawBuffers zero. >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/README.md b/Source/ThirdParty/ANGLE/src/tests/deqp_support/README.md >index dd59bc82af133b7f42ab2a9c98b8cf46cdcb4562..7b382ef23e9d7abc44bfd64599f187edb61d1a4d 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/README.md >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/README.md >@@ -18,6 +18,10 @@ exists to let the test harness know which tests it should skip (as they are know > expect to see failed. Warnings are generated if a test unexpectedly passes, but an unexpected > failure is an error. This let's ANGLE ensure there are no regressions. > >+If multiple test expectations in a file match a specific test due to >+wildcards, the test harness picks the first match in the file as the >+overriding expectation. >+ > While developing a feature, or testing on a new platform, the expectations files can be modified to > reflect the reality of the situation. The expected format for every line in these files is: > >@@ -31,7 +35,7 @@ reflect the reality of the situation. The expected format for every line in the > NVIDIA AMD INTEL > DEBUG RELEASE > D3D9 D3D11 OPENGL GLES VULKAN >- NEXUS5X PIXEL2ORXL >+ NEXUS5X PIXEL2ORXL PIXEL4ORXL PIXEL6 > QUADROP400 > SWIFTSHADER > PREROTATION PREROTATION90 PREROTATION180 PREROTATION270 >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_egl_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_egl_TestExpectations >index d25074561720123171c593412c70a5c5a73fb06b..467b24ba32c83773356a27c2effb4ca6ff63b8d6 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_egl_TestExpectations >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_egl_TestExpectations >@@ -124,7 +124,14 @@ > 6277 ANDROID VULKAN : dEQP-EGL.functional.image.render_multiple_contexts.gles2_android_native_rgb8_read_pixels = FAIL > 6277 ANDROID VULKAN : dEQP-EGL.functional.image.render_multiple_contexts.gles2_android_native_rgb8_texture = FAIL > >+// Pixel 6 Vulkan >+6900 PIXEL6 VULKAN : dEQP-EGL.functional.get_proc_address.extension.egl_ext_image_dma_buf_import_modifiers = FAIL >+6899 PIXEL6 VULKAN : dEQP-EGL.functional.query_context.*.rgb888_window = FAIL >+ > // Robustness failures on multiple platforms >+6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.uniform_block.compute = SKIP >+6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.uniform_block.compute = SKIP >+ > 3711 : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.* = FAIL > 3711 : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.* = FAIL > >@@ -269,10 +276,7 @@ > 6528 PIXEL4ORXL GLES : dEQP-EGL.functional.thread_cleanup.multi_context_* = FAIL > 6528 PIXEL4ORXL GLES : dEQP-EGL.functional.thread_cleanup.single_context_* = FAIL > >-6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.reads.uniform_block.compute = SKIP >-6707 NVIDIA : dEQP-EGL.functional.robustness.reset_context.shaders.out_of_bounds.reset_status.writes.uniform_block.compute = SKIP >- > 6678 TSAN : dEQP-EGL.functional.multithread.* = SKIP >-6678 TSAN : dEQP-EGL.functional.sharing.gles2.multithread.random* = FLAKY >+6678 TSAN : dEQP-EGL.functional.sharing.gles2.multithread.* = SKIP > > 6678 UBSAN : dEQP-EGL.functional.sharing.gles2.multithread.* = SKIP >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles2_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles2_TestExpectations >index 75935a0d1a875dbe3048ca033984fa879476be0c..8c644375169096e3501449627f33d881a32e9f03 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles2_TestExpectations >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles2_TestExpectations >@@ -362,7 +362,7 @@ > 6297 MAC METAL : dEQP-GLES2.functional.attribute_location.bind_aliasing.cond* = FAIL > > // Test bug - fails in ASAN. >-6678 : dEQP-GLES2.functional.negative_api.texture.compressedtexsubimage2d* = SKIP >+6678 ASAN : dEQP-GLES2.functional.negative_api.texture.compressedtexsubimage2d* = SKIP > > // Vulkan > 4944 VULKAN ANDROID : dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgba4 = FAIL >@@ -692,6 +692,11 @@ > 6528 PIXEL4ORXL GLES : dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_array_function_arg_vertex = FAIL > 6528 PIXEL4ORXL GLES : dEQP-GLES2.functional.shaders.struct.uniform.sampler_in_function_arg_vertex = FAIL > >+// Pixel 6 test expectations. >+6898 PIXEL6 VULKAN : dEQP-GLES2.functional.clipping.point.wide_point_* = FAIL >+6898 PIXEL6 VULKAN : dEQP-GLES2.functional.rasterization.primitives.points = FAIL >+6898 PIXEL6 VULKAN : dEQP-GLES2.functional.shaders.builtin_variable.pointcoord = FAIL >+ > 6709 LINUX NVIDIA GTX1660 VULKAN : dEQP-GLES2.functional.shaders.random.all_features.fragment.13 = FAIL > 6709 LINUX NVIDIA GTX1660 VULKAN : dEQP-GLES2.functional.shaders.random.all_features.fragment.26 = FAIL > 6709 LINUX NVIDIA GTX1660 VULKAN : dEQP-GLES2.functional.shaders.random.all_features.fragment.31 = FAIL >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles31_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles31_TestExpectations >index 8ab868c23479c959f3c9aff00959ea67349e8908..21840a7c71c02cf92046c56329f7cd9219b0279e 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles31_TestExpectations >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles31_TestExpectations >@@ -17,6 +17,9 @@ > // Times out shader compilation because it uses so many resources. > 3445 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.48 = SKIP > >+// Slow tests. >+6021 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.36 = TIMEOUT >+ > // D3D11 Failing Tests > // Below cases are failed due to binding multi-UAVs to a single buffer is not supported in D3D backend. > // http://anglebug.com/3032 >@@ -85,7 +88,10 @@ > 4234 D3D11 : dEQP-GLES31.functional.debug.negative_coverage.callbacks.compute.program_not_active = SKIP > 4234 OPENGL : dEQP-GLES31.functional.debug.negative_coverage.callbacks.compute.program_not_active = SKIP > >-// OPENGL Failing Tests >+// OpenGL Passing tests. >+3584 OPENGL : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.*samplercubearray* = PASS >+ >+// OpenGL Failing Tests > 1442 NVIDIA OPENGL : dEQP-GLES31.functional.fbo.no_attachments.maximums.all = FAIL > 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.atomic_counter_buffer.referenced_by* = FAIL > 1442 OPENGL : dEQP-GLES31.functional.program_interface_query.buffer_limited_query.resource_query = FAIL >@@ -106,6 +112,7 @@ > 5197 LINUX OPENGL : dEQP-GLES31.functional.compute.indirect_dispatch.gen_in_compute.large_offset_multiple_invocations = TIMEOUT > > // OpenGL/D3D11 Failing Tests >+1951 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.* = SKIP > 1442 OPENGL : dEQP-GLES31.functional.shaders.opaque_type_indexing.* = FAIL > 1442 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.* = FAIL > 1442 OPENGL : dEQP-GLES31.functional.separate_shader.* = SKIP >@@ -115,8 +122,6 @@ > 1442 OPENGL : dEQP-GLES31.functional.state_query.program_pipeline.* = SKIP > 1442 D3D11 : dEQP-GLES31.functional.state_query.program_pipeline.* = SKIP > >-3584 OPENGL : dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.*samplercubearray* = PASS >- > // These tests are failing because of compile errors with SSBOs in compute shaders. > > 1442 D3D11 : dEQP-GLES31.functional.stencil_texturing.* = SKIP >@@ -125,7 +130,6 @@ > > 1729 D3D11 : dEQP-GLES31.functional.atomic_counter.* = SKIP > 1951 D3D11 : dEQP-GLES31.functional.layout_binding.ssbo.* = SKIP >-1951 D3D11 : dEQP-GLES31.functional.shaders.opaque_type_indexing.ssbo.* = SKIP > 4330 D3D11 : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_vertex.* = SKIP > 4329 D3D11 : dEQP-GLES31.functional.program_interface_query.buffer_variable.referenced_by.separable_fragment.* = SKIP > 4329 D3D11 : dEQP-GLES31.functional.program_interface_query.buffer_variable.random.* = SKIP >@@ -139,10 +143,6 @@ > // This case is skipped since it uses atomic counter builtin functions which haven't been implemented. > 1729 D3D11 : dEQP-GLES31.functional.state_query.program.active_atomic_counter_buffers_get_programiv = SKIP > >-// The D3D backend does not expect missing shader stages >-1588 D3D11 : dEQP-GLES31.functional.separate_shader.validation.es31.varying.* = SKIP >- >- > //// > //// Failures blocking an official GLES 3.1 conformance run on SwiftShader > //// >@@ -202,16 +202,6 @@ > 4371 VULKAN ANDROID : dEQP-GLES31.functional.shaders.implicit_conversions.es31.arithmetic.input_before_literal.add.int_to_uvec3_vertex = FAIL > 4371 SWIFTSHADER : dEQP-GLES31.functional.shaders.implicit_conversions.* = FAIL > >-// Swiftshader fails to create a correct source/destination srgb8_alpha8_astc image before copy, however 5x4 is correct >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*rgba*srgb8_alpha8_astc_*_khr.*_to_texture2d* = FAIL >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*rgba*srgb8_alpha8_astc_*_khr.*_to_cubemap* = FAIL >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_*_khr_rgba*.*cubemap_to* = FAIL >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_*_khr_rgba*.*texture2d*_to* = FAIL >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*texture2d*_to_texture2d* = PASS >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*texture2d*_to_cubemap = PASS >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*cubemap*_to_texture2d* = PASS >-5275 SWIFTSHADER NOSAN : dEQP-GLES31.functional.copy_image.*srgb8_alpha8_astc_5x4_khr.*cubemap_to_cubemap = PASS >- > // Desktop cards without native etc support, angle emulated format fails > 5276 AMD VULKAN : dEQP-GLES31.functional.copy_image.compressed.viewclass_eac* = FAIL > 5276 AMD VULKAN : dEQP-GLES31.functional.copy_image.compressed.viewclass_etc* = FAIL >@@ -275,17 +265,6 @@ > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.android_extension_pack.extensions.oes_sample_variables = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.android_extension_pack.shaders.es31.extension_directive.oes_texture_storage_multisample_2d_array = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.android_extension_pack.shaders.es32.extension_directive.ext_shader_io_blocks = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.get_dec.1_counter_100_calls_10_threads = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.get_dec.4_counters_5_calls_10_threads = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.get_inc_dec.8_counters_5_calls_10_threads = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.inc.4_counters_100_calls_1_thread = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.inc_branch.8_counters_5_calls_1_thread = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.inc_dec_branch.8_counters_5_calls_1_thread = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_dec.8_counters_5_calls_1_thread = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.default_offset_set.get_inc.8_counters_1_call_1000_threads = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.reset_default_offset.inc_dec.8_counters_1_call_1000_threads = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.get_dec.8_counters_1_call_1000_threads = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.atomic_counter.layout.reverse_offset.inc_dec.8_counters_5_calls_1_thread = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.blend_equation_advanced.coherent.hsl_hue = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.blend_equation_advanced.msaa.colordodge = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.blend_equation_advanced.msaa.screen = SKIP >@@ -605,8 +584,6 @@ > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui.texture2d_to_renderbuffer = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui.texture3d_to_cubemap = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rg16ui.texture3d_to_renderbuffer = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb10_a2.texture2d_to_cubemap = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgb9_e5.cubemap_to_cubemap = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8i.texture3d_to_cubemap = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8_snorm_rgba8ui.texture2d_array_to_texture2d_array = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_32_bits.rgba8i_r32ui.texture2d_array_to_cubemap = SKIP >@@ -693,7 +670,6 @@ > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.debug.negative_coverage.callbacks.texture.compressedteximage3d_invalid_border = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.debug.negative_coverage.callbacks.texture.compressedtexsubimage3d_neg_level = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.clear_bufferfv = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.debug.negative_coverage.get_error.buffer.framebuffer_texture = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.debug.negative_coverage.get_error.framebuffer_fetch.invalid_vertex_inout = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader.bind_transform_feedback = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.debug.negative_coverage.get_error.shader.sampler_parameteri = SKIP >@@ -733,10 +709,6 @@ > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.color.texcubearray.r11f_g11f_b10f = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.color.texcubearray.r16f = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.color.texcubearray.rgba4 = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.npot_size.1025x1025 = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.npot_size.31x31 = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.size.1024x1024 = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.fbo.no_attachments.size.256x1024 = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.geometry_shading.basic.output_max = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.geometry_shading.basic.primitive_id = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.geometry_shading.input.basic_primitive.line_strip = SKIP >@@ -757,7 +729,6 @@ > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.atomic.max_r32ui_return_value = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.atomic.xor_r32ui_result = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.format_reinterpret.rgba16i_rgba16f = SKIP >-5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.store.rgba32i_single_layer = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.3d.store.rgba8_snorm = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.buffer.atomic.add_r32i_result = SKIP > 5990 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.image_load_store.buffer.atomic.max_r32ui_result = SKIP >@@ -1381,8 +1352,15 @@ > // Fails when the expression being interpolated as an indexed varying array. > 6194 PIXEL4ORXL VULKAN : dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.array_element.* = FAIL > >-// Slow tests. >-6021 : dEQP-GLES31.functional.ssbo.layout.random.all_shared_buffer.36 = TIMEOUT >+// Pixel 6 expectations >+6905 PIXEL6 VULKAN : dEQP-GLES31.functional.debug.negative_coverage.*.invalid_inout_version = SKIP >+6907 PIXEL6 VULKAN : dEQP-GLES31.functional.debug.negative_coverage.*.invalid_vertex_inout = SKIP >+6909 PIXEL6 VULKAN : dEQP-GLES31.functional.shaders.framebuffer_fetch.basic.framebuffer_texture_layer = SKIP >+6908 PIXEL6 VULKAN : dEQP-GLES31.functional.shaders.linkage.es31.tessellation.varying.rules.internal_different_precision = SKIP >+ >+6910 PIXEL6 VULKAN : dEQP-GLES31.functional.geometry_shading.layered.layer_provoking_vertex_* = FAIL >+6910 PIXEL6 VULKAN : dEQP-GLES31.functional.geometry_shading.query.max_geometry_input_components = FAIL >+6910 PIXEL6 VULKAN : dEQP-GLES31.functional.shaders.linkage.es31.tessellation_geometry.varying.rules.different_precision = FAIL > > // ASAN Test bugs > 6678 ASAN : dEQP-GLES31.functional.ssbo.array_length.* = SKIP >@@ -1391,8 +1369,6 @@ > 6678 ASAN : dEQP-GLES31.functional.debug.error_filters.case_18 = SKIP > 6678 ASAN : dEQP-GLES31.functional.debug.error_groups.case_11 = SKIP > >-6705 TSAN : dEQP-GLES31.functional.copy_image.compressed.viewclass_astc* = SKIP >- > 6678 UBSAN : dEQP-GLES31.functional.copy_image.non_compressed.viewclass_* = SKIP > 6678 UBSAN : dEQP-GLES31.functional.texture.multisample.samples_* = SKIP > 6678 UBSAN : dEQP-GLES31.functional.shaders.builtin_functions.precision.* = SKIP >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles3_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles3_TestExpectations >index 59f5fafa0bb1ddeae4bc89d7a95f7da934a6d31d..4c303785cf2e02550f6a8b3d4cb89377b74e7520 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles3_TestExpectations >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_gles3_TestExpectations >@@ -296,6 +296,12 @@ > // Flaky test > 3305 LINUX OPENGL : dEQP-GLES3.functional.shaders.builtin_functions.common.uintbitstofloat.uint_highp_vertex = FAIL > >+// Seems to fail on all desktop GL >+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8 = FAIL >+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_out_of_bounds_blit_to_default = FAIL >+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_scale_blit_to_default = FAIL >+2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_nearest_scale_blit_to_default = FAIL >+ > // Mac failures (overbroad suppresions) > 3466 MAC OPENGL : dEQP-GLES3.functional.attribute_location.bind_aliasing.cond* = SKIP > 3466 MAC OPENGL : dEQP-GLES3.functional.attribute_location.bind_aliasing.max_cond* = SKIP >@@ -481,12 +487,6 @@ > 2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.red_unsigned_byte = FAIL > 2567 ANDROID GLES : dEQP-GLES3.functional.fbo.completeness.renderable.texture.stencil.rg_unsigned_byte = FAIL > >-// Seems to fail on all desktop GL >-2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8 = FAIL >-2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_out_of_bounds_blit_to_default = FAIL >-2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_linear_scale_blit_to_default = FAIL >-2960 OPENGL : dEQP-GLES3.functional.fbo.blit.default_framebuffer.srgb8_alpha8_nearest_scale_blit_to_default = FAIL >- > // Fails on Windows + Linux. > 2222 OPENGL NVIDIA : dEQP-GLES3.functional.fbo.completeness.samples.rbo2_rbo2_rbo0 = FAIL > 2222 OPENGL NVIDIA : dEQP-GLES3.functional.fbo.completeness.samples.rbo1_rbo2_rbo0 = FAIL >@@ -558,8 +558,6 @@ > > /////////// Metal //////////////// > >-// last provoking vertex (for flat shading) is not supported >-5232 MAC METAL : dEQP-GLES3.*flatshading* = FAIL > 5232 MAC METAL AMD : dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack.unpacksnorm2x16_fragment = FAIL > 5232 MAC METAL AMD : dEQP-GLES3.functional.shaders.builtin_functions.pack_unpack.unpackunorm2x16_fragment = FAIL > >@@ -1794,6 +1792,11 @@ > 6528 PIXEL4ORXL GLES : dEQP-GLES3.functional.transform_feedback.random.interleaved.triangles.10 = FAIL > 6528 PIXEL4ORXL GLES : dEQP-GLES3.functional.transform_feedback.random_full_array_capture.* = FAIL > >+// Pixel 6 expectations >+6917 PIXEL6 VULKAN : dEQP-GLES3.functional.transform_feedback.array_element.* = FAIL >+6917 PIXEL6 VULKAN : dEQP-GLES3.functional.transform_feedback.random.interleaved.* = FAIL >+6917 PIXEL6 VULKAN : dEQP-GLES3.functional.transform_feedback.random.separate.* = FAIL >+ > 6709 LINUX NVIDIA GTX1660 VULKAN : dEQP-GLES3.functional.shaders.random.all_features.fragment.26 = FAIL > 6709 LINUX NVIDIA GTX1660 VULKAN : dEQP-GLES3.functional.shaders.random.all_features.fragment.31 = FAIL > >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles31_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles31_TestExpectations >index 4aa8761b122773cfab1f9140c2851c945817401b..3b99feb3537e1f5c1cdb67c288f488fcdfb06129 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles31_TestExpectations >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles31_TestExpectations >@@ -270,6 +270,17 @@ > 5990 PIXEL4ORXL VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8ui.samples_4.mask_7 = SKIP > 5990 PIXEL4ORXL VULKAN : KHR-GLES31.core.sample_variables.mask.rgba8ui.samples_4.mask_zero = SKIP > >+// Pixel 6 expectations. >+6918 PIXEL6 VULKAN : KHR-GLES31.core.compute_shader.resources-max = FAIL >+6918 PIXEL6 VULKAN : KHR-GLES31.core.geometry_shader.api.max_atomic_counters = FAIL >+6918 PIXEL6 VULKAN : KHR-GLES31.core.geometry_shader.constant_variables.constant_variables = FAIL >+6918 PIXEL6 VULKAN : KHR-GLES31.core.geometry_shader.layered_rendering.layered_rendering = FAIL >+6918 PIXEL6 VULKAN : KHR-GLES31.core.geometry_shader.linking.more_ACBs_in_GS_than_supported = FAIL >+6918 PIXEL6 VULKAN : KHR-GLES31.core.geometry_shader.primitive_queries.* = FAIL >+6918 PIXEL6 VULKAN : KHR-GLES31.core.shader_storage_buffer_object.advanced-usage-operators-cs = FAIL >+6918 PIXEL6 VULKAN : KHR-GLES31.core.shader_storage_buffer_object.basic-operations-case1-cs = FAIL >+ >+ > // Slow tests > 5755 SWIFTSHADER : KHR-GLES31.core.arrays_of_arrays.SizedDeclarationsPrimitive = TIMEOUT > 6295 : KHR-GLES31.core.arrays_of_arrays.ConstructorsAndUnsizedDeclConstructors1 = TIMEOUT >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles32_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles32_TestExpectations >index f3316d46a2abccd8083d830d3a6b5ef6b118d322..2798d35d6113914c9d9235dbc8aa186857997228 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles32_TestExpectations >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles32_TestExpectations >@@ -8,8 +8,6 @@ > > // Geometry shader support (conditioned to windows as that's our only bot capable of running these > // tests) >-// Translator's lack of support for redefining gl_PerVertex >-5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.api.getProgramiv3 = FAIL > // API validation bugs > 5579 VULKAN WIN : KHR-GLES32.core.geometry_shader.qualifiers.flat_interpolation = FAIL > // Wrong results >@@ -30,7 +28,6 @@ > // Vulkan Validation error regarding buffer usage bits for transform feedback: > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.vertex.vertex_spacing = FAIL > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.single.program_object_properties = FAIL >-5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_MaxPatchVertices_Position_PointSize = FAIL > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_PatchVerticesIn = FAIL > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_shader_tessellation.gl_InvocationID_PatchVerticesIn_PrimitiveID = FAIL > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_shader_tessellation.TCS_TES = FAIL >@@ -41,7 +38,6 @@ > // Translator validation bugs > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.single.max_patch_vertices = FAIL > // Bug in front-end where builtins are not correctly marked active in every stage >-5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_control_to_tessellation_evaluation.data_pass_through = FAIL > // Test failures > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_shader_quads_tessellation.* = FAIL > 5557 VULKAN WIN : KHR-GLES32.core.tessellation_shader.tessellation_shader_triangles_tessellation.identical_triangles = FAIL >@@ -96,10 +92,6 @@ > // Validation error from EXT_gpu_shader5 > 5361 VULKAN : KHR-GLES32.core.gpu_shader5.precise_qualifier = FAIL > >-// Validation error from EXT_copy_image >-5363 VULKAN : KHR-GLES32.core.copy_image.r32i_texture = FAIL >-5363 VULKAN : KHR-GLES32.core.copy_image.r32ui_texture = FAIL >- > // No known implementation supports STORAGE_TEXEL_BUFFER support for RGB32 formats > 3573 VULKAN : KHR-GLES32.core.texture_buffer.texture_buffer_texture_buffer_range = SKIP > >@@ -107,7 +99,8 @@ > 5342 VULKAN : KHR-GLES32.core.texture_buffer.texture_buffer_atomic_functions = FAIL > > // Desktop cards without native etc support >-5276 AMD VULKAN : KHR-GLES32.core.texture_cube_map_array.etc2_texture = FAIL >+5276 AMD VULKAN LINUX : KHR-GLES32.core.texture_cube_map_array.etc2_texture = FAIL >+5276 AMD VULKAN WIN : KHR-GLES32.core.texture_cube_map_array.etc2_texture = FAIL > 5276 NVIDIA VULKAN : KHR-GLES32.core.texture_cube_map_array.etc2_texture = FAIL > > // New failures with latest dEQP roll (2021-03-05) >diff --git a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles3_TestExpectations b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles3_TestExpectations >index 39333dae6b459c9b6a16db62d94f656c48ab3740..0d48efcd5fefc2ef1d7b547d0f4760948dfa5be1 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles3_TestExpectations >+++ b/Source/ThirdParty/ANGLE/src/tests/deqp_support/deqp_khr_gles3_TestExpectations >@@ -77,3 +77,7 @@ > 6678 UBSAN : KHR-GLES3.core.internalformat.texture2d.*half_float* = SKIP > 6678 UBSAN : KHR-GLES3.packed_pixels.* = SKIP > 6678 UBSAN : KHR-GLES3.copy_tex_image_conversions.required.* = SKIP >+ >+// Pixel 6 expectations. >+6919 PIXEL6 VULKAN : KHR-GLES3.packed_pixels.pbo_rectangle.rgb = FAIL >+6919 PIXEL6 VULKAN : KHR-GLES3.packed_pixels.pbo_rectangle.rgb8 = FAIL >diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp >index f3a94aff2d1302e33219f4e1d2facf1d9ab3b7d3..f8b3b332db89367219fce4ea89649eebbf497aba 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLContextSharingTest.cpp >@@ -123,12 +123,21 @@ class EGLContextSharingTestNoFixture : public EGLContextSharingTest > return result; > } > >- bool createContext(EGLConfig config, EGLContext *context) >+ bool createContext(EGLConfig config, >+ EGLContext *context, >+ EGLContext share_context = EGL_NO_CONTEXT) > { > bool result = false; >- EGLint attribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE}; >+ EGLint attribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, >+ EGL_CONTEXT_VIRTUALIZATION_GROUP_ANGLE, mVirtualizationGroup++, >+ EGL_NONE}; >+ >+ if (!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_ANGLE_context_virtualization")) >+ { >+ attribs[2] = EGL_NONE; >+ } > >- *context = eglCreateContext(mDisplay, config, nullptr, attribs); >+ *context = eglCreateContext(mDisplay, config, share_context, attribs); > result = (*context != EGL_NO_CONTEXT); > EXPECT_TRUE(result); > return result; >@@ -166,6 +175,7 @@ class EGLContextSharingTestNoFixture : public EGLContextSharingTest > const EGLint kWidth = 64; > const EGLint kHeight = 64; > EGLint mMajorVersion = 0; >+ std::atomic<EGLint> mVirtualizationGroup; > }; > > // Tests that creating resources works after freeing the share context. >@@ -962,6 +972,116 @@ TEST_P(EGLContextSharingTestNoFixture, EglTerminateMultipleTimes) > EXPECT_EGL_SUCCESS(); > mDisplay = EGL_NO_DISPLAY; > } >+ >+// Test that we can eglSwapBuffers in one thread while another thread renders to a texture. >+TEST_P(EGLContextSharingTestNoFixture, SwapBuffersShared) >+{ >+ EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE}; >+ mDisplay = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, >+ reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs); >+ EXPECT_TRUE(mDisplay != EGL_NO_DISPLAY); >+ EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr)); >+ >+ EGLConfig config = EGL_NO_CONFIG_KHR; >+ EXPECT_TRUE(chooseConfig(&config)); >+ >+ mOsWindow->initialize("EGLContextSharingTestNoFixture", kWidth, kHeight); >+ EXPECT_TRUE(createWindowSurface(config, mOsWindow->getNativeWindow(), &mSurface)); >+ ASSERT_EGL_SUCCESS() << "eglCreateWindowSurface failed."; >+ >+ EGLSurface pbufferSurface; >+ EXPECT_TRUE(createPbufferSurface(mDisplay, config, kWidth, kHeight, &pbufferSurface)); >+ >+ // Create the two contextss >+ EXPECT_TRUE(createContext(config, &mContexts[0])); >+ EXPECT_TRUE(createContext(config, &mContexts[1], mContexts[0])); >+ >+ eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[0]); >+ ANGLE_SKIP_TEST_IF(!platformSupportsMultithreading()); >+ eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); >+ >+ // Synchronization tools to ensure the two threads are interleaved as designed by this test. >+ std::mutex mutex; >+ std::condition_variable condVar; >+ >+ enum class Step >+ { >+ Start, >+ TextureInitialized, >+ Finish, >+ Abort, >+ }; >+ >+ Step currentStep = Step::Start; >+ >+ // Sample a texture in the swap thread. >+ std::thread swapThread = std::thread([&]() { >+ ThreadSynchronization<Step> threadSynchronization(¤tStep, &mutex, &condVar); >+ ASSERT_TRUE(threadSynchronization.waitForStep(Step::Start)); >+ eglMakeCurrent(mDisplay, mSurface, mSurface, mContexts[0]); >+ >+ glGenTextures(1, &mTexture); >+ glBindTexture(GL_TEXTURE_2D, mTexture); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ nullptr); >+ >+ threadSynchronization.nextStep(Step::TextureInitialized); >+ >+ ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D()); >+ glUseProgram(program); >+ >+ for (int i = 0; i < 100; ++i) >+ { >+ glClear(GL_COLOR_BUFFER_BIT); >+ drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ eglSwapBuffers(mDisplay, mSurface); >+ } >+ eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); >+ eglReleaseThread(); >+ }); >+ >+ // Render to the texture in the render thread. >+ std::thread renderThread = std::thread([&]() { >+ ThreadSynchronization<Step> threadSynchronization(¤tStep, &mutex, &condVar); >+ ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, pbufferSurface, pbufferSurface, mContexts[1])); >+ >+ GLFramebuffer fbo; >+ glBindFramebuffer(GL_FRAMEBUFFER, fbo); >+ >+ ANGLE_GL_PROGRAM(redProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red()); >+ ANGLE_GL_PROGRAM(greenProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green()); >+ ANGLE_GL_PROGRAM(blueProgram, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue()); >+ >+ // The render thread will draw to the texture. >+ ASSERT_TRUE(threadSynchronization.waitForStep(Step::TextureInitialized)); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0); >+ glDisable(GL_DEPTH_TEST); >+ >+ for (int i = 0; i < 400; ++i) >+ { >+ glClear(GL_COLOR_BUFFER_BIT); >+ glUseProgram(redProgram); >+ drawQuad(redProgram, essl1_shaders::PositionAttrib(), 0.5f); >+ >+ glClear(GL_COLOR_BUFFER_BIT); >+ glUseProgram(greenProgram); >+ drawQuad(greenProgram, essl1_shaders::PositionAttrib(), 0.5f); >+ >+ glClear(GL_COLOR_BUFFER_BIT); >+ glUseProgram(blueProgram); >+ drawQuad(blueProgram, essl1_shaders::PositionAttrib(), 0.5f); >+ } >+ eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); >+ eglReleaseThread(); >+ }); >+ >+ swapThread.join(); >+ renderThread.join(); >+ >+ eglDestroySurface(mDisplay, pbufferSurface); >+ ASSERT_EGL_SUCCESS(); >+} > } // anonymous namespace > > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLContextSharingTest); >diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLDisplayPowerPreferenceTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLDisplayPowerPreferenceTest.cpp >index b86668eb4a931ca6ee5d2b6bb86122635bf5e50c..49c3016c2786c86b1a8ae6f3cedfd6524cc39253 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLDisplayPowerPreferenceTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLDisplayPowerPreferenceTest.cpp >@@ -10,6 +10,7 @@ > #include <gtest/gtest.h> > > #include "common/debug.h" >+#include "common/string_utils.h" > #include "gpu_info_util/SystemInfo.h" > #include "test_utils/ANGLETest.h" > #include "util/OSWindow.h" >@@ -41,6 +42,7 @@ class EGLDisplayPowerPreferenceTest : public ANGLETest > return i; > } > } >+ // Can't find GPU > ASSERT(false); > return 0; > } >@@ -52,18 +54,26 @@ class EGLDisplayPowerPreferenceTest : public ANGLETest > std::string rendererString(renderer); > for (int i = 0; i < static_cast<int>(mSystemInfo.gpus.size()); ++i) > { >- if (rendererString.find(VendorName(mSystemInfo.gpus[i].vendorId)) != std::string::npos) >+ std::vector<std::string> vendorTokens; >+ angle::SplitStringAlongWhitespace(VendorName(mSystemInfo.gpus[i].vendorId), >+ &vendorTokens); >+ for (std::string &token : vendorTokens) > { >- return i; >+ if (rendererString.find(token) != std::string::npos) >+ { >+ return i; >+ } > } > } >+ // Can't find active GPU >+ ASSERT(false); > return 0; > } > > SystemInfo mSystemInfo; > }; > >-class EGLDisplayPowerPreferenceTestMultiDisplay : public EGLDisplayPowerPreferenceTest >+class EGLDisplayPowerPreferenceTestNoFixture : public EGLDisplayPowerPreferenceTest > { > protected: > void terminateWindow() >@@ -76,8 +86,8 @@ class EGLDisplayPowerPreferenceTestMultiDisplay : public EGLDisplayPowerPreferen > > void terminateDisplay(EGLDisplay display) > { >- // EXPECT_EGL_TRUE(eglTerminate(display)); >- // EXPECT_EGL_SUCCESS(); >+ EXPECT_EGL_TRUE(eglTerminate(display)); >+ EXPECT_EGL_SUCCESS(); > } > > void terminateContext(EGLDisplay display, EGLContext context) >@@ -97,6 +107,45 @@ class EGLDisplayPowerPreferenceTestMultiDisplay : public EGLDisplayPowerPreferen > setWindowVisible(mOSWindow, true); > } > >+ void initializeContextForDisplay(EGLDisplay display, EGLContext *context) >+ { >+ // Find a default config. >+ const EGLint configAttributes[] = { >+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, EGL_DONT_CARE, EGL_GREEN_SIZE, >+ EGL_DONT_CARE, EGL_BLUE_SIZE, EGL_DONT_CARE, EGL_ALPHA_SIZE, EGL_DONT_CARE, >+ EGL_DEPTH_SIZE, EGL_DONT_CARE, EGL_STENCIL_SIZE, EGL_DONT_CARE, EGL_NONE}; >+ >+ EGLint configCount; >+ EGLConfig config; >+ EGLint ret = eglChooseConfig(display, configAttributes, &config, 1, &configCount); >+ >+ if (!ret || configCount == 0) >+ { >+ return; >+ } >+ >+ EGLint contextAttributes[] = { >+ EGL_CONTEXT_MAJOR_VERSION_KHR, >+ GetParam().majorVersion, >+ EGL_CONTEXT_MINOR_VERSION_KHR, >+ GetParam().minorVersion, >+ EGL_NONE, >+ }; >+ >+ *context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes); >+ ASSERT_TRUE(*context != EGL_NO_CONTEXT); >+ } >+ >+ static constexpr int kWindowWidth = 16; >+ static constexpr int kWindowHeight = 8; >+ >+ OSWindow *mOSWindow = nullptr; >+}; >+ >+class EGLDisplayPowerPreferenceTestMultiDisplay : public EGLDisplayPowerPreferenceTestNoFixture >+{ >+ >+ protected: > void initializeDisplayWithPowerPreference(EGLDisplay *display, EGLAttrib powerPreference) > { > GLenum platformType = GetParam().getRenderer(); >@@ -127,35 +176,6 @@ class EGLDisplayPowerPreferenceTestMultiDisplay : public EGLDisplayPowerPreferen > ASSERT_EGL_SUCCESS(); > } > >- void initializeContextForDisplay(EGLDisplay display, EGLContext *context) >- { >- // Find a default config. >- const EGLint configAttributes[] = { >- EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, EGL_DONT_CARE, EGL_GREEN_SIZE, >- EGL_DONT_CARE, EGL_BLUE_SIZE, EGL_DONT_CARE, EGL_ALPHA_SIZE, EGL_DONT_CARE, >- EGL_DEPTH_SIZE, EGL_DONT_CARE, EGL_STENCIL_SIZE, EGL_DONT_CARE, EGL_NONE}; >- >- EGLint configCount; >- EGLConfig config; >- EGLint ret = eglChooseConfig(display, configAttributes, &config, 1, &configCount); >- >- if (!ret || configCount == 0) >- { >- return; >- } >- >- EGLint contextAttributes[] = { >- EGL_CONTEXT_MAJOR_VERSION_KHR, >- GetParam().majorVersion, >- EGL_CONTEXT_MINOR_VERSION_KHR, >- GetParam().minorVersion, >- EGL_NONE, >- }; >- >- *context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttributes); >- ASSERT_TRUE(*context != EGL_NO_CONTEXT); >- } >- > void runReinitializeDisplay(EGLAttrib powerPreference) > { > initializeWindow(); >@@ -238,11 +258,6 @@ class EGLDisplayPowerPreferenceTestMultiDisplay : public EGLDisplayPowerPreferen > > terminateWindow(); > } >- >- static constexpr int kWindowWidth = 16; >- static constexpr int kWindowHeight = 8; >- >- OSWindow *mOSWindow = nullptr; > }; > > TEST_P(EGLDisplayPowerPreferenceTest, SelectGPU) >@@ -275,6 +290,72 @@ TEST_P(EGLDisplayPowerPreferenceTestMultiDisplay, MultiDisplayTest) > runMultiDisplay(); > } > >+class EGLDisplayPowerPreferenceTestDeviceId : public EGLDisplayPowerPreferenceTestNoFixture >+{ >+ >+ protected: >+ void initializeDisplayWithDeviceId(EGLDisplay *display, uint64_t deviceId) >+ { >+ GLenum platformType = GetParam().getRenderer(); >+ GLenum deviceType = GetParam().getDeviceType(); >+ >+ EGLAttrib high = ((deviceId >> 32) & 0xFFFFFFFF); >+ EGLAttrib low = (deviceId & 0xFFFFFFFF); >+ >+ std::vector<EGLint> displayAttributes; >+ displayAttributes.push_back(EGL_PLATFORM_ANGLE_TYPE_ANGLE); >+ displayAttributes.push_back(platformType); >+ displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE); >+ displayAttributes.push_back(EGL_DONT_CARE); >+ displayAttributes.push_back(EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE); >+ displayAttributes.push_back(EGL_DONT_CARE); >+ displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE); >+ displayAttributes.push_back(deviceType); >+ displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_ID_HIGH_ANGLE); >+ displayAttributes.push_back(high); >+ displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEVICE_ID_LOW_ANGLE); >+ displayAttributes.push_back(low); >+ displayAttributes.push_back(EGL_NONE); >+ >+ *display = eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, >+ reinterpret_cast<void *>(mOSWindow->getNativeDisplay()), >+ displayAttributes.data()); >+ ASSERT_TRUE(*display != EGL_NO_DISPLAY); >+ >+ EGLint majorVersion, minorVersion; >+ ASSERT_TRUE(eglInitialize(*display, &majorVersion, &minorVersion) == EGL_TRUE); >+ >+ eglBindAPI(EGL_OPENGL_ES_API); >+ ASSERT_EGL_SUCCESS(); >+ } >+}; >+ >+TEST_P(EGLDisplayPowerPreferenceTestDeviceId, DeviceId) >+{ >+ ANGLE_SKIP_TEST_IF(!IsEGLClientExtensionEnabled("EGL_ANGLE_platform_angle_device_id")); >+ >+ initializeWindow(); >+ >+ for (size_t i = 0; i < mSystemInfo.gpus.size(); i++) >+ { >+ // Initialize the display with device id for each GPU >+ EGLDisplay display; >+ EGLContext context; >+ initializeDisplayWithDeviceId(&display, mSystemInfo.gpus[i].systemDeviceId); >+ initializeContextForDisplay(display, &context); >+ eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context); >+ >+ ASSERT_EQ(static_cast<int>(i), findActiveGPU()); >+ >+ // Terminate the displays >+ terminateContext(display, context); >+ eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); >+ terminateDisplay(display); >+ } >+ >+ terminateWindow(); >+} >+ > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLDisplayPowerPreferenceTest); > ANGLE_INSTANTIATE_TEST(EGLDisplayPowerPreferenceTest, > WithLowPowerGPU(ES2_METAL()), >@@ -286,3 +367,10 @@ GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLDisplayPowerPreferenceTestMulti > ANGLE_INSTANTIATE_TEST(EGLDisplayPowerPreferenceTestMultiDisplay, > WithNoFixture(ES2_METAL()), > WithNoFixture(ES3_METAL())); >+ >+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLDisplayPowerPreferenceTestDeviceId); >+ANGLE_INSTANTIATE_TEST(EGLDisplayPowerPreferenceTestDeviceId, >+ WithNoFixture(ES2_D3D11()), >+ WithNoFixture(ES3_D3D11()), >+ WithNoFixture(ES2_METAL()), >+ WithNoFixture(ES3_METAL())); >diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLLockSurface3Test.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLLockSurface3Test.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..59859a03391f9ed60932edc9bb11fe2e040dc7ec >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLLockSurface3Test.cpp >@@ -0,0 +1,607 @@ >+// >+// Copyright 2021 The ANGLE Project Authors. All rights reserved. >+// Use of this source code is governed by a BSD-style license that can be >+// found in the LICENSE file. >+// >+// EGLLockSurface3Test.cpp: >+// EGL extension EGL_KHR_lock_surface >+// >+ >+#include <gtest/gtest.h> >+ >+#include <chrono> >+#include <iostream> >+#include <thread> >+#include "test_utils/ANGLETest.h" >+#include "test_utils/gl_raii.h" >+#include "util/EGLWindow.h" >+#include "util/OSWindow.h" >+ >+using namespace std::chrono_literals; >+ >+using namespace angle; >+ >+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EGLLockSurface3Test); >+ >+class EGLLockSurface3Test : public ANGLETest >+{ >+ public: >+ EGLLockSurface3Test() : mDisplay(EGL_NO_DISPLAY) {} >+ >+ void testSetUp() override >+ { >+ mMajorVersion = GetParam().majorVersion; >+ >+ EGLint dispattrs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, GetParam().getRenderer(), EGL_NONE}; >+ mDisplay = eglGetPlatformDisplayEXT( >+ EGL_PLATFORM_ANGLE_ANGLE, reinterpret_cast<void *>(EGL_DEFAULT_DISPLAY), dispattrs); >+ EXPECT_NE(mDisplay, EGL_NO_DISPLAY); >+ EXPECT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr)); >+ } >+ >+ bool supportsLockSurface3Extension() >+ { >+ return IsEGLDisplayExtensionEnabled(mDisplay, "EGL_KHR_lock_surface3"); >+ } >+ >+ void testTearDown() override >+ { >+ if (mDisplay != EGL_NO_DISPLAY) >+ { >+ eglTerminate(mDisplay); >+ eglReleaseThread(); >+ mDisplay = EGL_NO_DISPLAY; >+ } >+ ASSERT_EGL_SUCCESS() << "Error during test TearDown"; >+ } >+ >+ // This will work for Windows and linux systemsAny other BGRA systems will have to be included. >+ GLColor ChannelOrder(GLColor colorIn) >+ { >+ GLColor color = colorIn; >+ if (IsWindows() || IsLinux()) >+ { // BGRA channel order >+ color.R = colorIn.B; >+ color.B = colorIn.R; >+ } >+ return color; >+ } >+ >+ void fillBitMapRGBA32(GLColor colorIn, uint32_t *bitMapPtr, EGLint stride) >+ { >+ for (uint32_t y = 0; y < kHeight; y++) >+ { >+ uint32_t *pixelPtr = bitMapPtr + (y * (stride / 4)); >+ for (uint32_t x = 0; x < kWidth; x++) >+ { >+ pixelPtr[x] = ChannelOrder(colorIn).asUint(); >+ } >+ } >+ } >+ >+ bool checkBitMapRGBA32(GLColor colorIn, uint32_t *bitMapPtr, EGLint stride) >+ { >+ std::array<uint32_t, (kWidth * kHeight)> checkmap; >+ std::fill_n(checkmap.begin(), (kWidth * kHeight), ChannelOrder(colorIn).asUint()); >+ >+ std::array<uint32_t, (kWidth * kHeight)> bitmap; >+ for (uint32_t i = 0; i < (kWidth * kHeight); i++) >+ { >+ bitmap[i] = bitMapPtr[i]; >+ } >+ >+ if (bitmap != checkmap) >+ { >+ return false; >+ } >+ >+ return true; >+ } >+ >+ bool checkSurfaceRGBA32(GLColor color) >+ { >+ std::array<uint32_t, (kWidth * kHeight)> actual; >+ glReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, actual.data()); >+ EXPECT_GL_NO_ERROR(); >+ >+ std::array<uint32_t, (kWidth * kHeight)> checkmap; >+ std::fill_n(checkmap.begin(), (kWidth * kHeight), color.asUint()); >+ >+ if (actual != checkmap) >+ { >+ return false; >+ } >+ >+ return true; >+ } >+ >+ GLuint createTexture() >+ { >+ GLuint texture = 0; >+ glGenTextures(1, &texture); >+ glBindTexture(GL_TEXTURE_2D, texture); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ nullptr); >+ EXPECT_GL_NO_ERROR(); >+ glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kWidth, kHeight); >+ EXPECT_GL_NO_ERROR(); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ EXPECT_NE(texture, static_cast<GLuint>(0)); >+ return texture; >+ } >+ >+ bool fillTexture(GLuint textureId, GLColor color) >+ { >+ std::array<GLuint, (kWidth * kHeight)> pixels; >+ std::fill_n(pixels.begin(), (kWidth * kHeight), color.asUint()); >+ glBindTexture(GL_TEXTURE_2D, textureId); >+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, >+ static_cast<void *>(pixels.data())); >+ EXPECT_GL_NO_ERROR(); >+ return true; >+ } >+ >+ void renderTexture(GLuint textureId) >+ { >+ const char *kVertexShader = R"( >+ precision highp float; >+ attribute vec4 position; >+ varying vec2 texcoord; >+ >+ void main() >+ { >+ gl_Position = vec4(position.xy, 0.0, 1.0); >+ texcoord = (position.xy * 0.5) + 0.5; >+ } >+ )"; >+ const char *kFragmentShader = R"( >+ precision highp float; >+ uniform sampler2D tex; >+ varying vec2 texcoord; >+ >+ void main() >+ { >+ gl_FragColor = texture2D(tex, texcoord); >+ } >+ )"; >+ >+ ANGLE_GL_PROGRAM(program, kVertexShader, kFragmentShader); >+ glUseProgram(program); >+ glBindTexture(GL_TEXTURE_2D, textureId); >+ glActiveTexture(GL_TEXTURE0); >+ GLint texture2DUniformLocation = glGetUniformLocation(program, "tex"); >+ glUniform1i(texture2DUniformLocation, 0); >+ drawQuad(program, "position", 0.5f); >+ glDeleteProgram(program); >+ EXPECT_GL_NO_ERROR(); >+ } >+ >+ int mMajorVersion = 2; >+ EGLDisplay mDisplay = EGL_NO_DISPLAY; >+ >+ static constexpr EGLint kWidth = 5; >+ static constexpr EGLint kHeight = 5; >+}; >+ >+// Create PBufferSurface, Lock, check all the attributes, unlock. >+TEST_P(EGLLockSurface3Test, AttributeTest) >+{ >+ ANGLE_SKIP_TEST_IF(!supportsLockSurface3Extension()); >+ >+ EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT; >+ EGLint attribs[] = {EGL_RED_SIZE, >+ 8, >+ EGL_GREEN_SIZE, >+ 8, >+ EGL_BLUE_SIZE, >+ 8, >+ EGL_ALPHA_SIZE, >+ 8, >+ EGL_RENDERABLE_TYPE, >+ clientVersion, >+ EGL_SURFACE_TYPE, >+ (EGL_PBUFFER_BIT | EGL_LOCK_SURFACE_BIT_KHR), >+ EGL_NONE}; >+ EGLint count = 0; >+ EGLConfig config = EGL_NO_CONFIG_KHR; >+ EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, attribs, &config, 1, &count)); >+ EXPECT_GT(count, 0); >+ ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR); >+ >+ EGLint pBufferAttribs[] = {EGL_WIDTH, kWidth, EGL_HEIGHT, kHeight, EGL_NONE}; >+ EGLSurface pBufferSurface = eglCreatePbufferSurface(mDisplay, config, pBufferAttribs); >+ EXPECT_NE(pBufferSurface, EGL_NO_SURFACE); >+ >+ EGLint lockAttribs[] = {EGL_LOCK_USAGE_HINT_KHR, EGL_WRITE_SURFACE_BIT_KHR, EGL_NONE}; >+ EXPECT_EGL_TRUE(eglLockSurfaceKHR(mDisplay, pBufferSurface, lockAttribs)); >+ >+ EGLAttribKHR bitMapPtr = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_POINTER_KHR, &bitMapPtr)); >+ EXPECT_NE(bitMapPtr, 0); >+ >+ EGLAttribKHR bitMapPitch = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_PITCH_KHR, &bitMapPitch)); >+ EXPECT_NE(bitMapPitch, 0); >+ >+ EGLAttribKHR bitMapOrigin = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_ORIGIN_KHR, &bitMapOrigin)); >+ EXPECT_TRUE((bitMapOrigin == EGL_LOWER_LEFT_KHR) || (bitMapOrigin == EGL_UPPER_LEFT_KHR)); >+ >+ EGLAttribKHR bitMapPixelRedOffset = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_RED_OFFSET_KHR, >+ &bitMapPixelRedOffset)); >+ EXPECT_TRUE((bitMapPixelRedOffset == 0) || (bitMapPixelRedOffset == 16)); >+ >+ EGLAttribKHR bitMapPixelGreenOffset = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR( >+ mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR, &bitMapPixelGreenOffset)); >+ EXPECT_EQ(bitMapPixelGreenOffset, 8); >+ >+ EGLAttribKHR bitMapPixelBlueOffset = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR, >+ &bitMapPixelBlueOffset)); >+ EXPECT_TRUE((bitMapPixelBlueOffset == 16) || (bitMapPixelBlueOffset == 0)); >+ >+ EGLAttribKHR bitMapPixelAlphaOffset = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR( >+ mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR, &bitMapPixelAlphaOffset)); >+ EXPECT_EQ(bitMapPixelAlphaOffset, 24); >+ >+ EGLAttribKHR bitMapPixelLuminanceOffset = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR(mDisplay, pBufferSurface, >+ EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR, >+ &bitMapPixelLuminanceOffset)); >+ EXPECT_EQ(bitMapPixelLuminanceOffset, 0); >+ >+ EGLAttribKHR bitMapPixelSize = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_SIZE_KHR, >+ &bitMapPixelSize)); >+ EXPECT_EQ(bitMapPixelSize, 32); >+ >+ EGLint bitMapPitchInt = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_PITCH_KHR, &bitMapPitchInt)); >+ EXPECT_NE(bitMapPitchInt, 0); >+ >+ EGLint bitMapOriginInt = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_ORIGIN_KHR, &bitMapOriginInt)); >+ EXPECT_TRUE((bitMapOriginInt == EGL_LOWER_LEFT_KHR) || (bitMapOriginInt == EGL_UPPER_LEFT_KHR)); >+ >+ EGLint bitMapPixelRedOffsetInt = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_RED_OFFSET_KHR, >+ &bitMapPixelRedOffsetInt)); >+ EXPECT_TRUE((bitMapPixelRedOffsetInt == 0) || (bitMapPixelRedOffsetInt == 16)); >+ >+ EGLint bitMapPixelGreenOffsetInt = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR, >+ &bitMapPixelGreenOffsetInt)); >+ EXPECT_EQ(bitMapPixelGreenOffsetInt, 8); >+ >+ EGLint bitMapPixelBlueOffsetInt = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR, >+ &bitMapPixelBlueOffsetInt)); >+ EXPECT_TRUE((bitMapPixelBlueOffsetInt == 16) || (bitMapPixelBlueOffsetInt == 0)); >+ >+ EGLint bitMapPixelAlphaOffsetInt = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR, >+ &bitMapPixelAlphaOffsetInt)); >+ EXPECT_EQ(bitMapPixelAlphaOffsetInt, 24); >+ >+ EGLint bitMapPixelLuminanceOffsetInt = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR, >+ &bitMapPixelLuminanceOffsetInt)); >+ EXPECT_EQ(bitMapPixelLuminanceOffsetInt, 0); >+ >+ EGLint bitMapPixelSizeInt = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface(mDisplay, pBufferSurface, EGL_BITMAP_PIXEL_SIZE_KHR, &bitMapPixelSizeInt)); >+ EXPECT_EQ(bitMapPixelSizeInt, 32); >+ >+ EXPECT_EGL_TRUE(eglUnlockSurfaceKHR(mDisplay, pBufferSurface)); >+} >+ >+// Create PBufferSurface, glClear Green, Draw red quad, Lock, check buffer for red, >+// Write white pixels, Unlock, Test pixels for white >+TEST_P(EGLLockSurface3Test, PbufferSurfaceReadWriteTest) >+{ >+ ANGLE_SKIP_TEST_IF(!supportsLockSurface3Extension()); >+ >+ EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT; >+ EGLint attribs[] = {EGL_RED_SIZE, >+ 8, >+ EGL_GREEN_SIZE, >+ 8, >+ EGL_BLUE_SIZE, >+ 8, >+ EGL_ALPHA_SIZE, >+ 8, >+ EGL_RENDERABLE_TYPE, >+ clientVersion, >+ EGL_SURFACE_TYPE, >+ (EGL_PBUFFER_BIT | EGL_LOCK_SURFACE_BIT_KHR), >+ EGL_NONE}; >+ EGLint count = 0; >+ EGLConfig config = EGL_NO_CONFIG_KHR; >+ EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, attribs, &config, 1, &count)); >+ ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR); >+ EXPECT_GT(count, 0); >+ >+ EGLint pBufferAttribs[] = {EGL_WIDTH, kWidth, EGL_HEIGHT, kHeight, EGL_NONE}; >+ EGLSurface pBufferSurface = EGL_NO_SURFACE; >+ pBufferSurface = eglCreatePbufferSurface(mDisplay, config, pBufferAttribs); >+ EXPECT_NE(pBufferSurface, EGL_NO_SURFACE); >+ >+ EGLint ctxAttribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE}; >+ EGLContext context = eglCreateContext(mDisplay, config, nullptr, ctxAttribs); >+ EXPECT_NE(context, EGL_NO_CONTEXT); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, pBufferSurface, pBufferSurface, context)); >+ ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed."; >+ >+ glClearColor(kFloatGreen.R, kFloatGreen.G, kFloatGreen.B, kFloatGreen.A); >+ glClear(GL_COLOR_BUFFER_BIT); >+ ASSERT_GL_NO_ERROR() << "glClear failed"; >+ >+ const GLColor drawColor = GLColor::red; >+ GLuint texture = createTexture(); >+ EXPECT_TRUE(fillTexture(texture, drawColor)); >+ renderTexture(texture); >+ glFinish(); >+ ASSERT_GL_NO_ERROR() << "glFinish failed"; >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context)); >+ >+ EGLint lockAttribs[] = {EGL_LOCK_USAGE_HINT_KHR, EGL_WRITE_SURFACE_BIT_KHR, >+ EGL_MAP_PRESERVE_PIXELS_KHR, EGL_TRUE, EGL_NONE}; >+ EXPECT_EGL_TRUE(eglLockSurfaceKHR(mDisplay, pBufferSurface, lockAttribs)); >+ >+ EGLAttribKHR bitMap = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_POINTER_KHR, &bitMap)); >+ EGLAttribKHR bitMapPitch = 0; >+ uint32_t *bitMapPtr = (uint32_t *)(bitMap); >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_PITCH_KHR, &bitMapPitch)); >+ >+ EXPECT_TRUE(checkBitMapRGBA32(drawColor, bitMapPtr, bitMapPitch)); >+ >+ const GLColor fillColor = GLColor::white; >+ fillBitMapRGBA32(fillColor, bitMapPtr, bitMapPitch); >+ >+ EXPECT_EGL_TRUE(eglUnlockSurfaceKHR(mDisplay, pBufferSurface)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, pBufferSurface, pBufferSurface, context)); >+ ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed."; >+ >+ EXPECT_TRUE(checkSurfaceRGBA32(fillColor)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context)); >+} >+ >+// Create PBufferSurface, glClear Green, Lock, check buffer for green, Write white pixels, >+// Unlock, Test pixels for white. >+// This expects that a glClear() alone is sufficient to pre-color the Surface >+TEST_P(EGLLockSurface3Test, PbufferSurfaceReadWriteDeferredCleaarTest) >+{ >+ ANGLE_SKIP_TEST_IF(!supportsLockSurface3Extension()); >+ >+ EGLint clientVersion = mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT; >+ EGLint attribs[] = {EGL_RED_SIZE, >+ 8, >+ EGL_GREEN_SIZE, >+ 8, >+ EGL_BLUE_SIZE, >+ 8, >+ EGL_ALPHA_SIZE, >+ 8, >+ EGL_RENDERABLE_TYPE, >+ clientVersion, >+ EGL_SURFACE_TYPE, >+ (EGL_PBUFFER_BIT | EGL_LOCK_SURFACE_BIT_KHR), >+ EGL_NONE}; >+ EGLint count = 0; >+ EGLConfig config = EGL_NO_CONFIG_KHR; >+ EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, attribs, &config, 1, &count)); >+ ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR); >+ EXPECT_GT(count, 0); >+ >+ EGLint pBufferAttribs[] = {EGL_WIDTH, kWidth, EGL_HEIGHT, kHeight, EGL_NONE}; >+ EGLSurface pBufferSurface = EGL_NO_SURFACE; >+ pBufferSurface = eglCreatePbufferSurface(mDisplay, config, pBufferAttribs); >+ EXPECT_NE(pBufferSurface, EGL_NO_SURFACE); >+ >+ EGLint ctxAttribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE}; >+ EGLContext context = eglCreateContext(mDisplay, config, nullptr, ctxAttribs); >+ EXPECT_NE(context, EGL_NO_CONTEXT); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, pBufferSurface, pBufferSurface, context)); >+ ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed."; >+ >+ const GLColor clearColor = GLColor::green; >+ glClearColor(kFloatGreen.R, kFloatGreen.G, kFloatGreen.B, kFloatGreen.A); >+ glClear(GL_COLOR_BUFFER_BIT); >+ ASSERT_GL_NO_ERROR() << "glClear failed"; >+ >+ const GLColor drawColor = clearColor; >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context)); >+ >+ EGLint lockAttribs[] = {EGL_LOCK_USAGE_HINT_KHR, EGL_WRITE_SURFACE_BIT_KHR, >+ EGL_MAP_PRESERVE_PIXELS_KHR, EGL_TRUE, EGL_NONE}; >+ EXPECT_EGL_TRUE(eglLockSurfaceKHR(mDisplay, pBufferSurface, lockAttribs)); >+ >+ EGLAttribKHR bitMap = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_POINTER_KHR, &bitMap)); >+ EGLAttribKHR bitMapPitch = 0; >+ uint32_t *bitMapPtr = (uint32_t *)(bitMap); >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, pBufferSurface, EGL_BITMAP_PITCH_KHR, &bitMapPitch)); >+ >+ EXPECT_TRUE(checkBitMapRGBA32(drawColor, bitMapPtr, bitMapPitch)); >+ >+ const GLColor fillColor = GLColor::white; >+ fillBitMapRGBA32(fillColor, bitMapPtr, bitMapPitch); >+ >+ EXPECT_EGL_TRUE(eglUnlockSurfaceKHR(mDisplay, pBufferSurface)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, pBufferSurface, pBufferSurface, context)); >+ ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed."; >+ >+ EXPECT_TRUE(checkSurfaceRGBA32(fillColor)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context)); >+} >+ >+// Create WindowSurface, Clear Color to GREEN, draw red quad, Lock with PRESERVE_PIXELS, >+// read/check pixels, Unlock. >+TEST_P(EGLLockSurface3Test, WindowSurfaceReadTest) >+{ >+ ANGLE_SKIP_TEST_IF(!supportsLockSurface3Extension()); >+ >+ EGLint configAttribs[] = {EGL_RED_SIZE, >+ 8, >+ EGL_GREEN_SIZE, >+ 8, >+ EGL_BLUE_SIZE, >+ 8, >+ EGL_ALPHA_SIZE, >+ 8, >+ EGL_RENDERABLE_TYPE, >+ (mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT), >+ EGL_SURFACE_TYPE, >+ (EGL_WINDOW_BIT | EGL_LOCK_SURFACE_BIT_KHR), >+ EGL_NONE}; >+ EGLint count = 0; >+ EGLConfig config = EGL_NO_CONFIG_KHR; >+ EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, configAttribs, &config, 1, &count)); >+ ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR); >+ EXPECT_GT(count, 0); >+ >+ OSWindow *osWindow = OSWindow::New(); >+ osWindow->initialize("LockSurfaceTest", kWidth, kHeight); >+ EGLint winAttribs[] = {EGL_NONE}; >+ EGLSurface windowSurface = >+ eglCreateWindowSurface(mDisplay, config, osWindow->getNativeWindow(), winAttribs); >+ EXPECT_NE(windowSurface, EGL_NO_SURFACE); >+ >+ EGLint ctxAttribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE}; >+ EGLContext context = eglCreateContext(mDisplay, config, nullptr, ctxAttribs); >+ EXPECT_NE(context, EGL_NO_CONTEXT); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context)); >+ ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed."; >+ >+ glClearColor(kFloatGreen.R, kFloatGreen.G, kFloatGreen.B, kFloatGreen.A); >+ glClear(GL_COLOR_BUFFER_BIT); >+ ASSERT_GL_NO_ERROR() << "glClear failed"; >+ >+ const GLColor drawColor = GLColor::red; >+ GLuint texture = createTexture(); >+ EXPECT_TRUE(fillTexture(texture, drawColor)); >+ renderTexture(texture); >+ glFinish(); >+ ASSERT_GL_NO_ERROR() << "glFinish failed"; >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context)); >+ >+ EGLint lockAttribs[] = {EGL_LOCK_USAGE_HINT_KHR, EGL_READ_SURFACE_BIT_KHR, >+ EGL_MAP_PRESERVE_PIXELS_KHR, EGL_TRUE, EGL_NONE}; >+ EXPECT_EGL_TRUE(eglLockSurfaceKHR(mDisplay, windowSurface, lockAttribs)); >+ >+ EGLAttribKHR bitMap = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR(mDisplay, windowSurface, EGL_BITMAP_POINTER_KHR, &bitMap)); >+ EGLAttribKHR bitMapPitch = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, windowSurface, EGL_BITMAP_PITCH_KHR, &bitMapPitch)); >+ >+ uint32_t *bitMapPtr = (uint32_t *)(bitMap); >+ EXPECT_TRUE(checkBitMapRGBA32(drawColor, bitMapPtr, bitMapPitch)); >+ >+ EXPECT_TRUE(eglUnlockSurfaceKHR(mDisplay, windowSurface)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context)); >+ ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed."; >+ EXPECT_TRUE(checkSurfaceRGBA32(drawColor)); >+ EXPECT_EGL_TRUE(eglSwapBuffers(mDisplay, windowSurface)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context)); >+ >+ glDeleteTextures(1, &texture); >+ >+ eglDestroySurface(mDisplay, windowSurface); >+ osWindow->destroy(); >+ OSWindow::Delete(&osWindow); >+} >+ >+// Create WindowSurface, Lock surface, Write pixels red, Unlock, check pixels, >+// then swapbuffers to visually check. >+TEST_P(EGLLockSurface3Test, WindowSurfaceWritePreserveTest) >+{ >+ ANGLE_SKIP_TEST_IF(!supportsLockSurface3Extension()); >+ >+ EGLint attribs[] = {EGL_RED_SIZE, >+ 8, >+ EGL_GREEN_SIZE, >+ 8, >+ EGL_BLUE_SIZE, >+ 8, >+ EGL_ALPHA_SIZE, >+ 8, >+ EGL_RENDERABLE_TYPE, >+ (mMajorVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT), >+ EGL_SURFACE_TYPE, >+ (EGL_WINDOW_BIT | EGL_LOCK_SURFACE_BIT_KHR), >+ EGL_NONE}; >+ EGLint count = 0; >+ EGLConfig config = EGL_NO_CONFIG_KHR; >+ EXPECT_EGL_TRUE(eglChooseConfig(mDisplay, attribs, &config, 1, &count)); >+ ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR); >+ EXPECT_GT(count, 0); >+ >+ OSWindow *osWindow = OSWindow::New(); >+ osWindow->initialize("LockSurfaceTest", kWidth, kHeight); >+ EGLint winAttribs[] = {EGL_NONE}; >+ EGLSurface windowSurface = >+ eglCreateWindowSurface(mDisplay, config, osWindow->getNativeWindow(), winAttribs); >+ EXPECT_NE(windowSurface, EGL_NO_SURFACE); >+ >+ EGLint ctxAttribs[] = {EGL_CONTEXT_MAJOR_VERSION, mMajorVersion, EGL_NONE}; >+ EGLContext context = eglCreateContext(mDisplay, config, nullptr, ctxAttribs); >+ EXPECT_NE(context, EGL_NO_CONTEXT); >+ >+ EGLint lockAttribs[] = {EGL_LOCK_USAGE_HINT_KHR, EGL_READ_SURFACE_BIT_KHR, EGL_NONE}; >+ EXPECT_EGL_TRUE(eglLockSurfaceKHR(mDisplay, windowSurface, lockAttribs)); >+ >+ EGLAttribKHR bitMap = 0; >+ EXPECT_EGL_TRUE(eglQuerySurface64KHR(mDisplay, windowSurface, EGL_BITMAP_POINTER_KHR, &bitMap)); >+ EGLAttribKHR bitMapPitch = 0; >+ EXPECT_EGL_TRUE( >+ eglQuerySurface64KHR(mDisplay, windowSurface, EGL_BITMAP_PITCH_KHR, &bitMapPitch)); >+ uint32_t *bitMapPtr = (uint32_t *)(bitMap); >+ >+ const GLColor fillColor = GLColor::red; >+ fillBitMapRGBA32(fillColor, bitMapPtr, bitMapPitch); >+ >+ EXPECT_EGL_TRUE(eglUnlockSurfaceKHR(mDisplay, windowSurface)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, windowSurface, windowSurface, context)); >+ ASSERT_EGL_SUCCESS() << "eglMakeCurrent failed."; >+ EXPECT_TRUE(checkSurfaceRGBA32(fillColor)); >+ EXPECT_EGL_TRUE(eglSwapBuffers(mDisplay, windowSurface)); >+ >+ EXPECT_EGL_TRUE(eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, context)); >+ >+ eglDestroySurface(mDisplay, windowSurface); >+ osWindow->destroy(); >+ OSWindow::Delete(&osWindow); >+} >+ >+ANGLE_INSTANTIATE_TEST(EGLLockSurface3Test, >+ WithNoFixture(ES2_VULKAN()), >+ WithNoFixture(ES3_VULKAN())); >diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp >index a08faecaab42f699546b99c1ba2d3c4d6aee1f03..faba4e338bb6627ae8defbc7e8f981809febdf30 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLPrintEGLinfoTest.cpp >@@ -77,7 +77,7 @@ TEST_P(EGLPrintEGLinfoTest, PrintEGLInfo) > { > std::cout << " EGL Information:" << std::endl; > std::cout << "\tVendor: " << GetEGLString(mDisplay, EGL_VENDOR) << std::endl; >- std::cout << "\tVersion: " << GetEGLString(mDisplay, EGL_VENDOR) << std::endl; >+ std::cout << "\tVersion: " << GetEGLString(mDisplay, EGL_VERSION) << std::endl; > std::cout << "\tClient APIs: " << GetEGLString(mDisplay, EGL_CLIENT_APIS) << std::endl; > > std::cout << "\tEGL Client Extensions:" << std::endl; >diff --git a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLProtectedContentTest.cpp b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLProtectedContentTest.cpp >index ad8e5cb537db40b75988d6bbad64e7b7fbf6f0c1..9c0b904d9fa806f92fdb71ef1b200713b21d5d6b 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLProtectedContentTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/egl_tests/EGLProtectedContentTest.cpp >@@ -828,6 +828,27 @@ TEST_P(EGLProtectedContentTest, ProtectedContextWithProtectedTextureFromAndroidN > textureFromAndroidNativeBufferTest(true, true); > } > >+// Retrieve the EGL_PROTECTED_CONTENT_EXT attribute via eglQueryContext >+TEST_P(EGLProtectedContentTest, QueryContext) >+{ >+ ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(mDisplay, "EGL_EXT_protected_content")); >+ >+ EGLConfig config = EGL_NO_CONFIG_KHR; >+ EXPECT_TRUE(chooseConfig(&config)); >+ ANGLE_SKIP_TEST_IF(config == EGL_NO_CONFIG_KHR); >+ >+ bool isProtectedContext = true; >+ EGLContext context = EGL_NO_CONTEXT; >+ EXPECT_TRUE(createContext(isProtectedContext, config, &context)); >+ ASSERT_EGL_SUCCESS() << "eglCreateContext failed."; >+ >+ EGLint value = 0; >+ EXPECT_EGL_TRUE(eglQueryContext(mDisplay, context, EGL_PROTECTED_CONTENT_EXT, &value)); >+ ASSERT_EGL_SUCCESS() << "eglQueryContext failed."; >+ >+ EXPECT_EQ(value, 1); >+} >+ > ANGLE_INSTANTIATE_TEST(EGLProtectedContentTest, > WithNoFixture(ES2_OPENGLES()), > WithNoFixture(ES3_OPENGLES()), >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp >index 4abb7d81b7382b56cb06c77a1bbe657150c2082e..06afbf8a14a5e804a332a8249564fef46043abde 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BlitFramebufferANGLETest.cpp >@@ -350,6 +350,67 @@ class BlitFramebufferANGLETest : public ANGLETest > return true; > } > >+ void BlitStencilTestHelper(bool mesaYFlip) >+ { >+ glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); >+ >+ if (mesaYFlip) >+ { >+ ASSERT_TRUE(IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ } >+ >+ glClearColor(0.0, 1.0, 0.0, 1.0); >+ glClearStencil(0x0); >+ glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ >+ // Scissor half the screen so we fill the stencil only halfway >+ glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2); >+ glEnable(GL_SCISSOR_TEST); >+ >+ // fill the stencil buffer with 0x1 >+ glStencilFunc(GL_ALWAYS, 0x1, 0xFF); >+ glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); >+ glEnable(GL_STENCIL_TEST); >+ drawQuad(mRedProgram, essl1_shaders::PositionAttrib(), 0.3f); >+ >+ glDisable(GL_SCISSOR_TEST); >+ >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); >+ glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); >+ >+ // These clears are not useful in theory because we're copying over them, but its >+ // helpful in debugging if we see white in any result. >+ glClearColor(1.0, 1.0, 1.0, 1.0); >+ glClearStencil(0x0); >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), >+ getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, >+ GL_NEAREST); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); >+ >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >+ >+ glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1 >+ >+ drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), >+ 0.8f); // blue quad will draw if stencil buffer was copied >+ >+ glDisable(GL_STENCIL_TEST); >+ >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); >+ EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >+ } >+ > GLuint mCheckerProgram; > GLuint mBlueProgram; > GLuint mRedProgram; >@@ -501,6 +562,267 @@ TEST_P(BlitFramebufferANGLETest, BlitColorWithFlip) > EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::yellow); > } > >+// Blit color to default framebuffer from another framebuffer with GL_MESA_framebuffer_flip_y. >+TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipSrc) >+{ >+ // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip. >+ ANGLE_SKIP_TEST_IF( >+ (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) || >+ !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ // Blit to default from y-flipped. >+ glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); >+ >+ const int fboTargetWidth = getWindowHeight() / 2; >+ const int fboTargetHeight = getWindowHeight() / 2; >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fboTargetWidth, >+ fboTargetHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); >+ >+ EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, fboTargetHeight / 4, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, fboTargetHeight / 4, GLColor::blue); >+ EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::yellow); >+} >+ >+// Blit color to y-flipped with GL_MESA_framebuffer_flip_y framebuffer from normal framebuffer. >+TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipDst) >+{ >+ // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip. >+ ANGLE_SKIP_TEST_IF( >+ (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) || >+ !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ // Blit to default from y-flipped. >+ glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mOriginalFBO); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mUserFBO); >+ >+ glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ const int fboTargetWidth = getWindowWidth() / 2; >+ const int fboTargetHeight = getWindowHeight(); >+ >+ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fboTargetWidth, >+ fboTargetHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), getWindowWidth() / 2, 0, >+ getWindowWidth(), getWindowHeight() / 2, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ >+ glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); >+ >+ // Left side have inverted checker pattern. >+ EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, fboTargetHeight / 4, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, fboTargetHeight / 4, GLColor::yellow); >+ EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::blue); >+ >+ // Right side is split to 2 parts where upper part have non y-flipped checker pattern and the >+ // bottom one has white color. >+ EXPECT_PIXEL_COLOR_EQ(5 * getWindowWidth() / 8, 5 * getWindowHeight() / 8, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(5 * getWindowWidth() / 8, 7 * getWindowHeight() / 8, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(7 * getWindowWidth() / 8, 5 * getWindowHeight() / 8, GLColor::yellow); >+ EXPECT_PIXEL_COLOR_EQ(7 * getWindowWidth() / 8, 7 * getWindowHeight() / 8, GLColor::blue); >+ >+ EXPECT_PIXEL_RECT_EQ(4 * getWindowWidth() / 8, 0, getWindowWidth() / 4, getWindowHeight() / 2, >+ GLColor::white); >+} >+ >+// Blit color to/from y-flipped with GL_MESA_framebuffer_flip_y framebuffers where dst framebuffer >+// have different size. >+TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipSrcDst) >+{ >+ // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip. >+ ANGLE_SKIP_TEST_IF( >+ (getClientMajorVersion() < 3 && !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) || >+ !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ // Create a custom framebuffer as the default one cannot be flipped. >+ GLTexture tex0; >+ glBindTexture(GL_TEXTURE_2D, tex0); >+ const int fb0Width = getWindowWidth() / 2; >+ const int fb0Height = getWindowHeight() / 2; >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fb0Width, fb0Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ nullptr); >+ >+ GLFramebuffer fb0; >+ glBindFramebuffer(GL_FRAMEBUFFER, fb0); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex0, 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ // Blit to default from y-flipped. >+ glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, fb0); >+ >+ glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ const int fboTargetWidth = fb0Width / 2; >+ const int fboTargetHeight = fb0Height; >+ >+ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fboTargetWidth, >+ fboTargetHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), fb0Width / 2, 0, fb0Width, >+ fb0Height / 2, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, fb0); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ >+ // Left side have inverted checker pattern. >+ EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, fboTargetHeight / 4, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, fboTargetHeight / 4, GLColor::blue); >+ EXPECT_PIXEL_COLOR_EQ(3 * fboTargetWidth / 4, 3 * fboTargetHeight / 4, GLColor::yellow); >+ >+ // Right side is split to 2 parts where upper part have y-flipped checker pattern and the >+ // bottom one has white color. >+ EXPECT_PIXEL_COLOR_EQ(5 * fb0Width / 8, 5 * fb0Height / 8, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(5 * fb0Width / 8, 7 * fb0Height / 8, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(7 * fb0Width / 8, 5 * fb0Height / 8, GLColor::blue); >+ EXPECT_PIXEL_COLOR_EQ(7 * fb0Width / 8, 7 * fb0Height / 8, GLColor::yellow); >+ >+ EXPECT_PIXEL_RECT_EQ(4 * fb0Width / 8, 0, fb0Width / 4, fb0Height / 2, GLColor::white); >+} >+ >+// Same as BlitColorWithMesaYFlip but uses an integer buffer format. >+TEST_P(BlitFramebufferANGLETest, BlitColorWithMesaYFlipInteger) >+{ >+ // OpenGL ES 3.0 / GL_NV_framebuffer_blit required for flip. >+ ANGLE_SKIP_TEST_IF( >+ (getClientMajorVersion() < 3 || !IsGLExtensionEnabled("GL_NV_framebuffer_blit")) || >+ !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ GLTexture tex0; >+ glBindTexture(GL_TEXTURE_2D, tex0); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, getWindowWidth(), getWindowHeight(), 0, >+ GL_RGBA_INTEGER, GL_BYTE, nullptr); >+ >+ GLFramebuffer fb0; >+ glBindFramebuffer(GL_FRAMEBUFFER, fb0); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex0, 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ drawQuad(mCheckerProgram, essl1_shaders::PositionAttrib(), 0.8f); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ GLTexture tex1; >+ glBindTexture(GL_TEXTURE_2D, tex1); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8I, getWindowWidth(), getWindowHeight(), 0, >+ GL_RGBA_INTEGER, GL_BYTE, nullptr); >+ >+ GLFramebuffer fb1; >+ glBindFramebuffer(GL_FRAMEBUFFER, fb1); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0); >+ >+ // Blit to default from y-flipped. >+ glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, fb0); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, fb1); >+ >+ const int fb1_target_width = getWindowHeight() / 3; >+ const int fb1_target_height = getWindowHeight() / 3; >+ >+ glClearColor(0.0f, 1.0f, 1.0f, 1.0f); >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ glBlitFramebuffer(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, fb1_target_width, >+ fb1_target_height, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, fb1); >+ >+ // The colors outside the target must remain the same. >+ EXPECT_PIXEL_8I(getWindowWidth() - 1, getWindowHeight() - 1, 0, 127, 127, 127); >+ EXPECT_PIXEL_8I(getWindowWidth() - 1, 0, 0, 127, 127, 127); >+ EXPECT_PIXEL_8I(0, getWindowHeight() - 1, 0, 127, 127, 127); >+ EXPECT_PIXEL_8I(fb1_target_width, fb1_target_height, 0, 127, 127, 127); >+ >+ // While inside must change. >+ EXPECT_PIXEL_8I(fb1_target_width / 4, fb1_target_height / 4, 127, 0, 0, 127); >+ EXPECT_PIXEL_8I(fb1_target_width / 4, 3 * fb1_target_height / 4, 0, 127, 0, 127); >+ EXPECT_PIXEL_8I(3 * fb1_target_width / 4, fb1_target_height / 4, 0, 0, 127, 127); >+ EXPECT_PIXEL_8I(3 * fb1_target_width / 4, 3 * fb1_target_height / 4, 127, 127, 0, 127); >+ >+ // Blit from y-flipped to default. >+ glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, fb1); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, fb0); >+ >+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f); >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ // Set y-flip flag so that y-flipped frame buffer blit to the original fbo in reverse. This >+ // should result in flipping y back. >+ glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ glBlitFramebuffer(0, 0, fb1_target_width, fb1_target_height, 0, 0, getWindowWidth(), >+ getWindowHeight(), GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ >+ // And explicitly disable y-flip so that read does not implicitly use this flag. >+ glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER_ANGLE, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ >+ EXPECT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, fb0); >+ >+ EXPECT_PIXEL_8I(getWindowWidth() / 4, getWindowHeight() / 4, 0, 127, 0, 127); >+ EXPECT_PIXEL_8I(getWindowWidth() / 4, 3 * getWindowHeight() / 4, 127, 0, 0, 127); >+ EXPECT_PIXEL_8I(3 * getWindowWidth() / 4, getWindowHeight() / 4, 127, 127, 0, 127); >+ EXPECT_PIXEL_8I(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, 0, 0, 127, 127); >+} >+ > // Draw to system framebuffer, blit whole-buffer color to user-created framebuffer. > TEST_P(BlitFramebufferANGLETest, ReverseColorBlit) > { >@@ -927,58 +1249,22 @@ TEST_P(BlitFramebufferANGLETest, BlitStencil) > // http://anglebug.com/5396 > ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9()); > >- glBindFramebuffer(GL_FRAMEBUFFER, mUserFBO); >- >- glClearColor(0.0, 1.0, 0.0, 1.0); >- glClearStencil(0x0); >- glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >- >- // Scissor half the screen so we fill the stencil only halfway >- glScissor(0, 0, getWindowWidth(), getWindowHeight() / 2); >- glEnable(GL_SCISSOR_TEST); >- >- // fill the stencil buffer with 0x1 >- glStencilFunc(GL_ALWAYS, 0x1, 0xFF); >- glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); >- glEnable(GL_STENCIL_TEST); >- drawQuad(mRedProgram, essl1_shaders::PositionAttrib(), 0.3f); >- >- glDisable(GL_SCISSOR_TEST); >- >- glBindFramebuffer(GL_DRAW_FRAMEBUFFER_ANGLE, mOriginalFBO); >- glBindFramebuffer(GL_READ_FRAMEBUFFER_ANGLE, mUserFBO); >- >- // These clears are not useful in theory because we're copying over them, but its >- // helpful in debugging if we see white in any result. >- glClearColor(1.0, 1.0, 1.0, 1.0); >- glClearStencil(0x0); >- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >- >- // depth blit request should be silently ignored, because the read FBO has no depth attachment >- glBlitFramebufferANGLE(0, 0, getWindowWidth(), getWindowHeight(), 0, 0, getWindowWidth(), >- getWindowHeight(), GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, >- GL_NEAREST); >- >- EXPECT_GL_NO_ERROR(); >- >- glBindFramebuffer(GL_FRAMEBUFFER, mOriginalFBO); >- >- EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red); >- EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >- EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::red); >- EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >+ BlitStencilTestHelper(false /* mesaFlipY */); >+} > >- glStencilFunc(GL_EQUAL, 0x1, 0xFF); // only pass if stencil buffer at pixel reads 0x1 >+// Same as BlitStencil, but with y-flip flag set. >+TEST_P(BlitFramebufferANGLETest, BlitStencilWithMesaYFlip) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_framebuffer_blit") || >+ !IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); > >- drawQuad(mBlueProgram, essl1_shaders::PositionAttrib(), >- 0.8f); // blue quad will draw if stencil buffer was copied >+ // http://anglebug.com/2205 >+ ANGLE_SKIP_TEST_IF(IsIntel() && IsD3D9()); > >- glDisable(GL_STENCIL_TEST); >+ // http://anglebug.com/5396 >+ ANGLE_SKIP_TEST_IF(IsAMD() && IsD3D9()); > >- EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); >- EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >- EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, getWindowHeight() / 4, GLColor::blue); >- EXPECT_PIXEL_COLOR_EQ(3 * getWindowWidth() / 4, 3 * getWindowHeight() / 4, GLColor::green); >+ BlitStencilTestHelper(true /* mesaFlipY */); > } > > // make sure that attempting to blit a partial depth buffer issues an error >@@ -1235,6 +1521,69 @@ class BlitFramebufferTest : public ANGLETest > glBindFramebuffer(GL_FRAMEBUFFER, *fbo); > drawQuad(checkerProgram.get(), essl1_shaders::PositionAttrib(), 0.5f); > } >+ >+ void BlitDepthStencilPixelByPixelTestHelper(bool mesaYFlip) >+ { >+ if (mesaYFlip) >+ ASSERT_TRUE(IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red()); >+ >+ glViewport(0, 0, 128, 1); >+ glEnable(GL_DEPTH_TEST); >+ >+ GLFramebuffer srcFramebuffer; >+ GLRenderbuffer srcRenderbuffer; >+ glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer); >+ if (mesaYFlip) >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glBindRenderbuffer(GL_RENDERBUFFER, srcRenderbuffer); >+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 128, 1); >+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, >+ srcRenderbuffer); >+ glClearDepthf(1.0f); >+ glClear(GL_DEPTH_BUFFER_BIT); >+ >+ drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f, 0.5f); >+ glViewport(0, 0, 256, 2); >+ >+ GLFramebuffer dstFramebuffer; >+ GLRenderbuffer dstRenderbuffer; >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFramebuffer); >+ glBindRenderbuffer(GL_RENDERBUFFER, dstRenderbuffer); >+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 2); >+ glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, >+ dstRenderbuffer); >+ >+ GLTexture dstColor; >+ glBindTexture(GL_TEXTURE_2D, dstColor); >+ glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 2); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 0); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer); >+ glBlitFramebuffer(0, 0, 128, 1, 0, 0, 256, 2, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, >+ GL_NEAREST); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer); >+ glClearColor(0.0f, 1.0f, 0.0f, 1.0f); >+ glClear(GL_COLOR_BUFFER_BIT); >+ glDepthMask(false); >+ glDepthFunc(GL_LESS); >+ drawQuad(drawRed, essl1_shaders::PositionAttrib(), -0.01f, 0.5f); >+ EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::red); >+ >+ ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue()); >+ glEnable(GL_DEPTH_TEST); >+ glDepthMask(false); >+ glDepthFunc(GL_GREATER); >+ if (mesaYFlip) >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.01f, 0.5f); >+ if (mesaYFlip) >+ EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::green); >+ else >+ EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::blue); >+ } > }; > > class BlitFramebufferTestES31 : public BlitFramebufferTest >@@ -2552,55 +2901,15 @@ TEST_P(BlitFramebufferTest, OOBWrite) > // Test blitting a depthStencil buffer with multiple depth values to a larger size. > TEST_P(BlitFramebufferTest, BlitDepthStencilPixelByPixel) > { >- ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red()); >- >- glViewport(0, 0, 128, 1); >- glEnable(GL_DEPTH_TEST); >- >- GLFramebuffer srcFramebuffer; >- GLRenderbuffer srcRenderbuffer; >- glBindFramebuffer(GL_FRAMEBUFFER, srcFramebuffer); >- glBindRenderbuffer(GL_RENDERBUFFER, srcRenderbuffer); >- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 128, 1); >- glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, >- srcRenderbuffer); >- glClearDepthf(1.0f); >- glClear(GL_DEPTH_BUFFER_BIT); >- >- drawQuad(drawRed, essl1_shaders::PositionAttrib(), 0.0f, 0.5f); >- glViewport(0, 0, 256, 2); >- >- GLFramebuffer dstFramebuffer; >- GLRenderbuffer dstRenderbuffer; >- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFramebuffer); >- glBindRenderbuffer(GL_RENDERBUFFER, dstRenderbuffer); >- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 256, 2); >- glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, >- dstRenderbuffer); >- >- GLTexture dstColor; >- glBindTexture(GL_TEXTURE_2D, dstColor); >- glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 256, 2); >- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstColor, 0); >- >- glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFramebuffer); >- glBlitFramebuffer(0, 0, 128, 1, 0, 0, 256, 2, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, >- GL_NEAREST); >+ BlitDepthStencilPixelByPixelTestHelper(false /* mesaYFlip */); >+} > >- glBindFramebuffer(GL_FRAMEBUFFER, dstFramebuffer); >- glClearColor(0.0f, 1.0f, 0.0f, 1.0f); >- glClear(GL_COLOR_BUFFER_BIT); >- glDepthMask(false); >- glDepthFunc(GL_LESS); >- drawQuad(drawRed, essl1_shaders::PositionAttrib(), -0.01f, 0.5f); >- EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::red); >+// Same as BlitDepthStencilPixelByPixel, but with y-flip flag set. >+TEST_P(BlitFramebufferTest, BlitDepthStencilPixelByPixelMesaYFlip) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); > >- ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue()); >- glEnable(GL_DEPTH_TEST); >- glDepthMask(false); >- glDepthFunc(GL_GREATER); >- drawQuad(drawBlue, essl1_shaders::PositionAttrib(), 0.01f, 0.5f); >- EXPECT_PIXEL_RECT_EQ(64, 0, 128, 1, GLColor::blue); >+ BlitDepthStencilPixelByPixelTestHelper(true /* mesaYFlip */); > } > > // Test that a draw call to a small FBO followed by a resolve of a large FBO works. >@@ -2718,6 +3027,227 @@ TEST_P(BlitFramebufferTestES31, BlitMultisampledRGBX8ToRGB8) > EXPECT_PIXEL_COLOR_EQ(3 * kWidth / 4, 3 * kHeight / 4, GLColor::yellow); > } > >+// Test resolving a multisampled texture with blit. Draw flipped, resolve with read fbo flipped. >+TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveReadWithBlitAndFlippedDraw) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ constexpr int kSize = 16; >+ glViewport(0, 0, kSize, kSize); >+ >+ GLFramebuffer msaaFBO; >+ glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO.get()); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture.get()); >+ glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false); >+ ASSERT_GL_NO_ERROR(); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, >+ texture.get(), 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(), >+ essl31_shaders::fs::RedGreenGradient()); >+ drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create another FBO to resolve the multisample buffer into. >+ GLTexture resolveTexture; >+ GLFramebuffer resolveFBO; >+ glBindTexture(GL_TEXTURE_2D, resolveTexture); >+ constexpr int kResolveFBOWidth = kSize - 3; >+ constexpr int kResolveFBOHeight = kSize - 2; >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA, >+ GL_UNSIGNED_BYTE, nullptr); >+ glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO); >+ glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO); >+ glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth, >+ kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ ASSERT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO); >+ constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2; >+ EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 215, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 215, 0, 255, 1.0); >+} >+ >+// Test resolving a multisampled texture with blit. Draw non-flipped, resolve with read fbo flipped. >+TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveReadWithBlitAndNonFlippedDraw) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ constexpr int kSize = 16; >+ glViewport(0, 0, kSize, kSize); >+ >+ GLFramebuffer msaaFBO; >+ glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO.get()); >+ >+ // Draw non-flipped - explicitly set y-flip to 0. >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture.get()); >+ glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false); >+ ASSERT_GL_NO_ERROR(); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, >+ texture.get(), 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(), >+ essl31_shaders::fs::RedGreenGradient()); >+ drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create another FBO to resolve the multisample buffer into. >+ GLTexture resolveTexture; >+ GLFramebuffer resolveFBO; >+ glBindTexture(GL_TEXTURE_2D, resolveTexture); >+ constexpr int kResolveFBOWidth = kSize - 3; >+ constexpr int kResolveFBOHeight = kSize - 2; >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA, >+ GL_UNSIGNED_BYTE, nullptr); >+ glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO); >+ // Resolve with read fbo flipped and draw fbo non-flipped >+ glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO); >+ glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth, >+ kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ ASSERT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO); >+ constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2; >+ EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, 255 - kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 40, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 40, 0, 255, 1.0); >+} >+ >+// Test resolving a multisampled texture with blit. Draw non-flipped, resolve with draw fbo flipped >+TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveDrawWithBlitAndNonFlippedDraw) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ constexpr int kSize = 16; >+ glViewport(0, 0, kSize, kSize); >+ >+ GLFramebuffer msaaFBO; >+ glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO.get()); >+ >+ // Draw non-flipped - explicitly set y-flip to 0. >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture.get()); >+ glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false); >+ ASSERT_GL_NO_ERROR(); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, >+ texture.get(), 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(), >+ essl31_shaders::fs::RedGreenGradient()); >+ drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create another FBO to resolve the multisample buffer into. >+ GLTexture resolveTexture; >+ GLFramebuffer resolveFBO; >+ glBindTexture(GL_TEXTURE_2D, resolveTexture); >+ constexpr int kResolveFBOWidth = kSize - 3; >+ constexpr int kResolveFBOHeight = kSize - 2; >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA, >+ GL_UNSIGNED_BYTE, nullptr); >+ glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO); >+ // Resolve with draw fbo flipped and read fbo non-flipped. >+ glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth, >+ kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ ASSERT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO); >+ constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2; >+ EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 215, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 215, 0, 255, 1.0); >+} >+ >+// Test resolving a multisampled texture with blit. Draw non-flipped, resolve with both read and >+// draw fbos flipped >+TEST_P(BlitFramebufferTestES31, MultisampleFlippedResolveWithBlitAndNonFlippedDraw) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ constexpr int kSize = 16; >+ glViewport(0, 0, kSize, kSize); >+ >+ GLFramebuffer msaaFBO; >+ glBindFramebuffer(GL_FRAMEBUFFER, msaaFBO.get()); >+ >+ // Draw non-flipped - explicitly set y-flip to 0. >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture.get()); >+ glTexStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, kSize, kSize, false); >+ ASSERT_GL_NO_ERROR(); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, >+ texture.get(), 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(), >+ essl31_shaders::fs::RedGreenGradient()); >+ drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create another FBO to resolve the multisample buffer into. >+ GLTexture resolveTexture; >+ GLFramebuffer resolveFBO; >+ constexpr int kResolveFBOWidth = kSize - 3; >+ constexpr int kResolveFBOHeight = kSize - 2; >+ glBindTexture(GL_TEXTURE_2D, resolveTexture); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kResolveFBOWidth, kResolveFBOHeight, 0, GL_RGBA, >+ GL_UNSIGNED_BYTE, nullptr); >+ glBindFramebuffer(GL_FRAMEBUFFER, resolveFBO); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, resolveTexture, 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, msaaFBO); >+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, resolveFBO); >+ // Resolve with draw and read fbo flipped. >+ glFramebufferParameteriMESA(GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glFramebufferParameteriMESA(GL_DRAW_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glBlitFramebuffer(0, 0, kResolveFBOWidth, kResolveFBOHeight, 0, 0, kResolveFBOWidth, >+ kResolveFBOHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST); >+ ASSERT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_READ_FRAMEBUFFER, resolveFBO); >+ constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2; >+ EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, 0, 199, 255 - kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(0, kResolveFBOHeight - 1, kHalfPixelGradient, 40, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kResolveFBOWidth - 1, kResolveFBOHeight - 1, 199, 40, 0, 255, 1.0); >+} >+ > // Use this to select which configurations (e.g. which renderer, which GLES major version) these > // tests should be run against. > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BlitFramebufferANGLETest); >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp >index efb46ffd63833ad83c8891252e75c8b2c0d57c85..d9942c626df77406dfdd0904edbe3125cefc264a 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/BufferDataTest.cpp >@@ -1513,6 +1513,93 @@ TEST_P(BufferStorageTestES3, VertexBufferMapped) > EXPECT_GL_NO_ERROR(); > } > >+void TestPageSharingBuffers(std::function<void(void)> swapCallback, >+ size_t bufferSize, >+ const std::array<Vector3, 6> &quadVertices, >+ GLint positionLocation) >+{ >+ size_t dataSize = sizeof(GLfloat) * quadVertices.size() * 3; >+ >+ if (bufferSize == 0) >+ { >+ bufferSize = dataSize; >+ } >+ >+ constexpr size_t bufferCount = 10; >+ >+ std::vector<GLBuffer> buffers(bufferCount); >+ std::vector<void *> mapPointers(bufferCount); >+ >+ // Init and map >+ for (uint32_t i = 0; i < bufferCount; i++) >+ { >+ glBindBuffer(GL_ARRAY_BUFFER, buffers[i].get()); >+ >+ glBufferStorageEXT(GL_ARRAY_BUFFER, bufferSize, nullptr, >+ GL_DYNAMIC_STORAGE_BIT_EXT | GL_MAP_WRITE_BIT | >+ GL_MAP_PERSISTENT_BIT_EXT | GL_MAP_COHERENT_BIT_EXT); >+ >+ glEnableVertexAttribArray(positionLocation); >+ >+ mapPointers[i] = glMapBufferRange( >+ GL_ARRAY_BUFFER, 0, bufferSize, >+ GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT_EXT | GL_MAP_COHERENT_BIT_EXT); >+ ASSERT_NE(nullptr, mapPointers[i]); >+ } >+ >+ // Write, draw and unmap >+ for (uint32_t i = 0; i < bufferCount; i++) >+ { >+ memcpy(mapPointers[i], reinterpret_cast<const void *>(quadVertices.data()), dataSize); >+ >+ // Write something to last float >+ if (bufferSize > dataSize + sizeof(GLfloat)) >+ { >+ size_t lastPosition = bufferSize / sizeof(GLfloat) - 1; >+ reinterpret_cast<float *>(mapPointers[i])[lastPosition] = 1.0f; >+ } >+ >+ glBindBuffer(GL_ARRAY_BUFFER, buffers[i].get()); >+ glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glDrawArrays(GL_TRIANGLES, 0, quadVertices.size()); >+ EXPECT_PIXEL_COLOR_EQ(8, 8, GLColor::red); >+ swapCallback(); >+ glUnmapBuffer(GL_ARRAY_BUFFER); >+ } >+} >+ >+// Create multiple persistently mapped coherent buffers of different sizes that will likely share a >+// page. Map all buffers together and unmap each buffer after writing to it and using it for a draw. >+// This tests the behaviour of the coherent buffer tracker in frame capture when buffers that share >+// a page are written to after the other one is removed. >+TEST_P(BufferStorageTestES3, PageSharingBuffers) >+{ >+ ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 || >+ !IsGLExtensionEnabled("GL_EXT_buffer_storage")); >+ >+ ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red()); >+ ASSERT_NE(program, 0u); >+ >+ glUseProgram(program); >+ >+ auto quadVertices = GetQuadVertices(); >+ >+ std::function<void(void)> swapCallback = [this]() { swapBuffers(); }; >+ >+ GLint positionLocation = glGetAttribLocation(program, essl3_shaders::PositionAttrib()); >+ ASSERT_NE(-1, positionLocation); >+ >+ TestPageSharingBuffers(swapCallback, 0, quadVertices, positionLocation); >+ TestPageSharingBuffers(swapCallback, 1000, quadVertices, positionLocation); >+ TestPageSharingBuffers(swapCallback, 4096, quadVertices, positionLocation); >+ TestPageSharingBuffers(swapCallback, 6144, quadVertices, positionLocation); >+ TestPageSharingBuffers(swapCallback, 40960, quadVertices, positionLocation); >+ >+ glDeleteProgram(program); >+ >+ EXPECT_GL_NO_ERROR(); >+} >+ > class BufferStorageTestES3Threaded : public ANGLETest > { > protected: >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CompressedTextureFormatsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CompressedTextureFormatsTest.cpp >index 0680d491e4f86864350b5d85da064aaf0bfaa37b..beec56a6e2589774a17d65dbbd1d95a75d18d7bf 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CompressedTextureFormatsTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CompressedTextureFormatsTest.cpp >@@ -377,7 +377,7 @@ std::string PrintToStringParamName( > } > } > std::stringstream nameStr; >- nameStr << name << "__" << std::get<0>(info.param); >+ nameStr << std::get<0>(info.param) << "__" << name; > return nameStr.str(); > } > >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp >index 10c6313a63fa4e3ce217c86cc05b4313b24a3a65..951f6421381ead3e10ab4894b0238cb789dec642 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTexImageTest.cpp >@@ -90,6 +90,33 @@ class CopyTexImageTest : public ANGLETest > EXPECT_PIXEL_NEAR((xs + xe) / 2, (ys + ye) / 2, data[0], data[1], data[2], data[3], 1.0); > } > >+ void verifyCheckeredResults(GLuint texture, >+ const GLubyte data0[4], >+ const GLubyte data1[4], >+ const GLubyte data2[4], >+ const GLubyte data3[4], >+ GLint fboWidth, >+ GLint fboHeight) >+ { >+ glViewport(0, 0, fboWidth, fboHeight); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, 0); >+ >+ // Draw a quad with the target texture >+ glUseProgram(mTextureProgram); >+ glBindTexture(GL_TEXTURE_2D, texture); >+ glUniform1i(mTextureUniformLocation, 0); >+ >+ drawQuad(mTextureProgram, essl1_shaders::PositionAttrib(), 0.5f); >+ >+ // Expect that the rendered quad has the same color as the source texture >+ EXPECT_PIXEL_EQ(fboWidth / 4, fboHeight / 4, data0[0], data0[1], data0[2], data0[3]); >+ EXPECT_PIXEL_EQ(fboWidth / 4, 3 * fboHeight / 4, data1[0], data1[1], data1[2], data1[3]); >+ EXPECT_PIXEL_EQ(3 * fboWidth / 4, fboHeight / 4, data2[0], data2[1], data2[2], data2[3]); >+ EXPECT_PIXEL_EQ(3 * fboWidth / 4, 3 * fboHeight / 4, data3[0], data3[1], data3[2], >+ data3[3]); >+ } >+ > void runCopyTexImageTest(GLenum format, GLubyte expected[3][4]) > { > GLTexture tex; >@@ -116,6 +143,47 @@ class CopyTexImageTest : public ANGLETest > } > } > >+ // x, y, width, height specify the portion of fbo to be copied into tex. >+ // flip_y specifies if the glCopyTextImage must be done from y-flipped fbo. >+ void runCopyTexImageTestCheckered(GLenum format, >+ const uint32_t x[3], >+ const uint32_t y[3], >+ const uint32_t width[3], >+ const uint32_t height[3], >+ const GLubyte expectedData0[4], >+ const GLubyte expectedData1[4], >+ const GLubyte expectedData2[4], >+ const GLubyte expectedData3[4], >+ bool mesaFlipY) >+ { >+ GLTexture tex; >+ glBindTexture(GL_TEXTURE_2D, tex); >+ >+ // Disable mipmapping >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ >+ // Perform the copy multiple times. >+ for (size_t i = 0; i < kFboCount; ++i) >+ { >+ glViewport(0, 0, kFboSizes[i], kFboSizes[i]); >+ glBindFramebuffer(GL_FRAMEBUFFER, mFbos[i]); >+ >+ ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(), >+ essl1_shaders::fs::Checkered()); >+ drawQuad(checkerProgram.get(), essl1_shaders::PositionAttrib(), 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ >+ if (mesaFlipY) >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x[i], y[i], width[i], height[i], 0); >+ ASSERT_GL_NO_ERROR(); >+ >+ verifyCheckeredResults(tex, expectedData0, expectedData1, expectedData2, expectedData3, >+ kFboSizes[i], kFboSizes[i]); >+ } >+ } >+ > void runCopyTexSubImageTest(GLenum format, GLubyte expected[3][4]) > { > GLTexture tex; >@@ -566,6 +634,107 @@ TEST_P(CopyTexImageTest, CopyTexSubImageFrom3DTexureOES) > } > } > >+// Tests image copy from y-flipped fbo works. >+TEST_P(CopyTexImageTest, CopyTexImageMesaYFlip) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ std::array<uint32_t, 3> copyOrigin{0}; >+ std::array<uint32_t, 3> copySize; >+ for (size_t i = 0; i < kFboCount; i++) >+ copySize[i] = kFboSizes[i]; >+ >+ initializeResources(GL_RGBA, GL_UNSIGNED_BYTE); >+ runCopyTexImageTestCheckered(GL_RGBA, copyOrigin.data(), copyOrigin.data(), copySize.data(), >+ copySize.data(), GLColor::green.data(), GLColor::red.data(), >+ GLColor::yellow.data(), GLColor::blue.data(), >+ true /* mesaFlipY */); >+} >+ >+// Tests image partial copy from y-flipped fbo works. >+TEST_P(CopyTexImageTest, CopyTexImageMesaYFlipPartial) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ std::array<uint32_t, kFboCount> copyX; >+ std::array<uint32_t, kFboCount> copyY{0}; >+ std::array<uint32_t, kFboCount> copyWidth; >+ std::array<uint32_t, kFboCount> copyHeight; >+ >+ for (size_t i = 0; i < kFboCount; i++) >+ { >+ copyX[i] = kFboSizes[i] / 2; >+ copyHeight[i] = kFboSizes[i]; >+ } >+ copyWidth = copyX; >+ >+ initializeResources(GL_RGBA, GL_UNSIGNED_BYTE); >+ runCopyTexImageTestCheckered(GL_RGBA, copyX.data(), copyY.data(), copyWidth.data(), >+ copyHeight.data(), GLColor::yellow.data(), GLColor::blue.data(), >+ GLColor::yellow.data(), GLColor::blue.data(), >+ true /* mesaFlipY */); >+} >+ >+// Tests subimage copy from y-flipped fbo works. >+TEST_P(CopyTexImageTest, CopyTexSubImageMesaYFlip) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ GLuint format = GL_RGBA; >+ initializeResources(format, GL_UNSIGNED_BYTE); >+ >+ glViewport(0, 0, kFboSizes[0], kFboSizes[0]); >+ glBindFramebuffer(GL_FRAMEBUFFER, mFbos[0]); >+ >+ ANGLE_GL_PROGRAM(checkerProgram, essl1_shaders::vs::Passthrough(), >+ essl1_shaders::fs::Checkered()); >+ drawQuad(checkerProgram.get(), essl1_shaders::PositionAttrib(), 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ >+ GLTexture tex; >+ glBindTexture(GL_TEXTURE_2D, tex); >+ >+ // Disable mipmapping >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ >+ // Create the texture with copy of the first fbo. >+ glBindFramebuffer(GL_FRAMEBUFFER, mFbos[0]); >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ glCopyTexImage2D(GL_TEXTURE_2D, 0, format, 0, 0, kFboSizes[0], kFboSizes[0], 0); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Make sure out-of-bound writes to the texture return invalid value. >+ glBindFramebuffer(GL_FRAMEBUFFER, mFbos[1]); >+ drawQuad(checkerProgram.get(), essl1_shaders::PositionAttrib(), 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ // xoffset < 0 and yoffset < 0 >+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, -1, -1, 0, 0, kFboSizes[0], kFboSizes[0]); >+ ASSERT_GL_ERROR(GL_INVALID_VALUE); >+ >+ // xoffset + width > w and yoffset + height > h >+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 0, 0, kFboSizes[0], kFboSizes[0]); >+ ASSERT_GL_ERROR(GL_INVALID_VALUE); >+ >+ // xoffset + width > w and yoffset + height > h, out of bounds >+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, -1, -1, 1 + kFboSizes[0], 1 + kFboSizes[0]); >+ ASSERT_GL_ERROR(GL_INVALID_VALUE); >+ >+ // Copy the second fbo over a portion of the image. >+ GLint offset = kFboSizes[0] / 2; >+ GLint extent = kFboSizes[0] - offset; >+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, offset, offset, kFboSizes[1] / 2, kFboSizes[1] / 2, >+ extent, extent); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Only part of the image is changed. >+ verifyCheckeredResults(tex, GLColor::green.data(), GLColor::red.data(), GLColor::yellow.data(), >+ GLColor::blue.data(), kFboSizes[0], kFboSizes[0]); >+} >+ > // specialization of CopyTexImageTest is added so that some tests can be explicitly run with an ES3 > // context > class CopyTexImageTestES3 : public CopyTexImageTest >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp >index ab4fac8f24437f3fc0d3356866a74426d4b5f249..8534c16359d1bc8a6826af16c5046b823519edfe 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CopyTextureTest.cpp >@@ -115,7 +115,7 @@ class CopyTextureTest : public ANGLETest > }; > > using CopyTextureVariationsTestParams = >- std::tuple<angle::PlatformParameters, GLenum, GLenum, bool, bool, bool>; >+ std::tuple<angle::PlatformParameters, GLenum, GLenum, bool, bool, bool, GLint>; > > std::string CopyTextureVariationsTestPrint( > const ::testing::TestParamInfo<CopyTextureVariationsTestParams> ¶msInfo) >@@ -184,6 +184,10 @@ std::string CopyTextureVariationsTestPrint( > { > out << "UnmultiplyAlpha"; > } >+ if (std::get<6>(params)) >+ { >+ out << "MesaYFlip"; >+ } > > return out.str(); > } >@@ -422,13 +426,18 @@ class CopyTextureVariationsTest : public ANGLETestWithParam<CopyTextureVariation > GLenum destFormat, > bool flipY, > bool premultiplyAlpha, >- bool unmultiplyAlpha) >+ bool unmultiplyAlpha, >+ GLint mesaYFlipParam) > { > if (!checkExtensions(sourceFormat, destFormat)) > { > return; > } > >+ const bool hasMesaFbFlipYExt = IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"); >+ if (mesaYFlipParam && !hasMesaFbFlipYExt) >+ ASSERT_TRUE(hasMesaFbFlipYExt); >+ > if (sourceFormat == GL_LUMINANCE || sourceFormat == GL_LUMINANCE_ALPHA || > sourceFormat == GL_ALPHA || destFormat == GL_LUMINANCE || > destFormat == GL_LUMINANCE_ALPHA || destFormat == GL_ALPHA) >@@ -457,6 +466,11 @@ class CopyTextureVariationsTest : public ANGLETestWithParam<CopyTextureVariation > initializeSourceTexture(sourceTarget, sourceFormat, &srcColors[i * componentCount], > componentCount); > >+ if (hasMesaFbFlipYExt) >+ { >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, >+ mesaYFlipParam); >+ } > glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat, > GL_UNSIGNED_BYTE, flipY, premultiplyAlpha, unmultiplyAlpha); > >@@ -467,17 +481,37 @@ class CopyTextureVariationsTest : public ANGLETestWithParam<CopyTextureVariation > > if (flipY) > { >- EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0); >+ if (mesaYFlipParam) >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0); >+ } >+ else >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0); >+ } > } > else > { >- EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0); >+ if (mesaYFlipParam) >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0); >+ } >+ else >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0); >+ } > } > > EXPECT_GL_NO_ERROR(); >@@ -489,13 +523,18 @@ class CopyTextureVariationsTest : public ANGLETestWithParam<CopyTextureVariation > GLenum destFormat, > bool flipY, > bool premultiplyAlpha, >- bool unmultiplyAlpha) >+ bool unmultiplyAlpha, >+ GLint mesaYFlipParam) > { > if (!checkExtensions(sourceFormat, destFormat)) > { > return; > } > >+ const bool hasMesaFbFlipYExt = IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"); >+ if (mesaYFlipParam && !hasMesaFbFlipYExt) >+ ASSERT_TRUE(hasMesaFbFlipYExt); >+ > if (sourceFormat == GL_LUMINANCE || sourceFormat == GL_LUMINANCE_ALPHA || > sourceFormat == GL_ALPHA || destFormat == GL_LUMINANCE || > destFormat == GL_LUMINANCE_ALPHA || destFormat == GL_ALPHA) >@@ -528,6 +567,11 @@ class CopyTextureVariationsTest : public ANGLETestWithParam<CopyTextureVariation > glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 2, 2, 0, destFormat, GL_UNSIGNED_BYTE, > nullptr); > >+ if (hasMesaFbFlipYExt) >+ { >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, >+ mesaYFlipParam); >+ } > glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 2, > 2, flipY, premultiplyAlpha, unmultiplyAlpha); > >@@ -542,17 +586,37 @@ class CopyTextureVariationsTest : public ANGLETestWithParam<CopyTextureVariation > > if (flipY) > { >- EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0); >+ if (mesaYFlipParam) >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0); >+ } >+ else >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0); >+ } > } > else > { >- EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0); >- EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0); >+ if (mesaYFlipParam) >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0); >+ } >+ else >+ { >+ EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0); >+ EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0); >+ } > } > > EXPECT_GL_NO_ERROR(); >@@ -904,6 +968,7 @@ constexpr GLenum kCopyTextureVariationsSrcFormats[] = { > GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT}; > constexpr GLenum kCopyTextureVariationsDstFormats[] = {GL_RGB, GL_RGBA, GL_BGRA_EXT, > GL_SRGB_ALPHA_EXT}; >+constexpr GLint kMesaYFlips[] = {0, 1}; > } // anonymous namespace > > TEST_P(CopyTextureVariationsTest, CopyTexture) >@@ -917,32 +982,57 @@ TEST_P(CopyTextureVariationsTest, CopyTexture) > ANGLE_SKIP_TEST_IF(IsWindows7() && IsNVIDIA() && IsOpenGLES()); > } > >+ if (std::get<6>(GetParam())) >+ { >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ } >+ > testCopyTexture(GL_TEXTURE_2D, std::get<1>(GetParam()), std::get<2>(GetParam()), >- std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam())); >+ std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()), >+ std::get<6>(GetParam())); > } > > TEST_P(CopyTextureVariationsTest, CopySubTexture) > { > // http://anglebug.com/5723 > ANGLE_SKIP_TEST_IF(IsOzone()); >+ >+ if (std::get<6>(GetParam())) >+ { >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ } >+ > testCopySubTexture(GL_TEXTURE_2D, std::get<1>(GetParam()), std::get<2>(GetParam()), >- std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam())); >+ std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()), >+ std::get<6>(GetParam())); > } > > TEST_P(CopyTextureVariationsTest, CopyTextureRectangle) > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_rectangle")); > >+ if (std::get<6>(GetParam())) >+ { >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ } >+ > testCopyTexture(GL_TEXTURE_RECTANGLE_ANGLE, std::get<1>(GetParam()), std::get<2>(GetParam()), >- std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam())); >+ std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()), >+ std::get<6>(GetParam())); > } > > TEST_P(CopyTextureVariationsTest, CopySubTextureRectangle) > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_rectangle")); > >+ if (std::get<6>(GetParam())) >+ { >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ } >+ > testCopySubTexture(GL_TEXTURE_RECTANGLE_ANGLE, std::get<1>(GetParam()), std::get<2>(GetParam()), >- std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam())); >+ std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()), >+ std::get<6>(GetParam())); > } > > // Test that copying to cube maps works >@@ -2534,13 +2624,14 @@ TEST_P(CopyTextureTestES3, InvalidateBlitThenBlend1000Layers) > #endif > > ANGLE_INSTANTIATE_TEST_ES2(CopyTextureTest); >-ANGLE_INSTANTIATE_TEST_COMBINE_5(CopyTextureVariationsTest, >+ANGLE_INSTANTIATE_TEST_COMBINE_6(CopyTextureVariationsTest, > CopyTextureVariationsTestPrint, > testing::ValuesIn(kCopyTextureVariationsSrcFormats), > testing::ValuesIn(kCopyTextureVariationsDstFormats), > testing::Bool(), // flipY > testing::Bool(), // premultiplyAlpha > testing::Bool(), // unmultiplyAlpha >+ testing::ValuesIn(kMesaYFlips), > ES2_D3D9(), > ES2_D3D11(), > ES2_OPENGL(), >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp >index e315a7ce589c75c3fcb2b87f17e9e77753e7ef4d..d1f7998fc0858e9ea014331f9fbf3e58f562e052 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/CubeMapTextureTest.cpp >@@ -46,7 +46,7 @@ class CubeMapTextureTest : public ANGLETest > > void testTearDown() override { glDeleteProgram(mProgram); } > >- void runSampleCoordinateTransformTest(const char *shader); >+ void runSampleCoordinateTransformTest(const char *shader, const bool useES3); > > GLuint mProgram; > GLint mColorLocation; >@@ -115,7 +115,7 @@ TEST_P(CubeMapTextureTest, RenderToFacesConsecutively) > EXPECT_GL_NO_ERROR(); > } > >-void CubeMapTextureTest::runSampleCoordinateTransformTest(const char *shader) >+void CubeMapTextureTest::runSampleCoordinateTransformTest(const char *shader, const bool useES3) > { > // Fails to compile the shader. anglebug.com/3776 > ANGLE_SKIP_TEST_IF(IsOpenGL() && IsIntel() && IsWindows()); >@@ -182,14 +182,16 @@ void CubeMapTextureTest::runSampleCoordinateTransformTest(const char *shader) > glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex, 0); > EXPECT_GL_NO_ERROR(); > >- ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), shader); >+ ANGLE_GL_PROGRAM(program, useES3 ? essl3_shaders::vs::Simple() : essl1_shaders::vs::Simple(), >+ shader); > glUseProgram(program); > > GLint texCubeLocation = glGetUniformLocation(program, "texCube"); > ASSERT_NE(-1, texCubeLocation); > glUniform1i(texCubeLocation, 0); > >- drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f); >+ drawQuad(program, useES3 ? essl3_shaders::PositionAttrib() : essl1_shaders::PositionAttrib(), >+ 0.5f); > EXPECT_GL_NO_ERROR(); > > for (GLenum face = 0; face < kCubeFaceCount; face++) >@@ -267,17 +269,13 @@ void main() > gl_FragColor = textureCube(texCube, coord); > })"; > >- runSampleCoordinateTransformTest(kFS); >+ runSampleCoordinateTransformTest(kFS, false); > } > > // On Android Vulkan, unequal x and y derivatives cause this test to fail. > TEST_P(CubeMapTextureTest, SampleCoordinateTransformGrad) > { >- ANGLE_SKIP_TEST_IF(IsAndroid() && IsVulkan()); // anglebug.com/3814 >- ANGLE_SKIP_TEST_IF(IsD3D11()); // anglebug.com/3856 > ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_texture_lod")); >- // http://anglebug.com/4092 >- ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D9()); > > constexpr char kFS[] = R"(#extension GL_EXT_shader_texture_lod : require > precision mediump float; >@@ -314,7 +312,51 @@ void main() > vec3(10.0, 10.0, 0.0), vec3(0.0, 10.0, 10.0)); > })"; > >- runSampleCoordinateTransformTest(kFS); >+ runSampleCoordinateTransformTest(kFS, false); >+} >+ >+// Same as the previous but uses the ES 3.0 explicit gradient function. >+TEST_P(CubeMapTextureTest, SampleCoordinateTransformGrad_ES3) >+{ >+ ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3); >+ >+ constexpr char kFS[] = R"(#version 300 es >+precision mediump float; >+ >+uniform samplerCube texCube; >+out vec4 my_FragColor; >+ >+const mat4 coordInSection = mat4( >+ vec4(-0.5, -0.5, 0, 0), >+ vec4( 0.5, -0.5, 0, 0), >+ vec4(-0.5, 0.5, 0, 0), >+ vec4( 0.5, 0.5, 0, 0) >+); >+ >+void main() >+{ >+ vec3 coord; >+ if (gl_FragCoord.x < 2.0) >+ { >+ coord.x = gl_FragCoord.x < 1.0 ? 1.0 : -1.0; >+ coord.zy = coordInSection[int(gl_FragCoord.y)].xy; >+ } >+ else if (gl_FragCoord.x < 4.0) >+ { >+ coord.y = gl_FragCoord.x < 3.0 ? 1.0 : -1.0; >+ coord.xz = coordInSection[int(gl_FragCoord.y)].xy; >+ } >+ else >+ { >+ coord.z = gl_FragCoord.x < 5.0 ? 1.0 : -1.0; >+ coord.xy = coordInSection[int(gl_FragCoord.y)].xy; >+ } >+ >+ my_FragColor = textureGrad(texCube, coord, >+ vec3(10.0, 10.0, 0.0), vec3(0.0, 10.0, 10.0)); >+})"; >+ >+ runSampleCoordinateTransformTest(kFS, true); > } > > // Use this to select which configurations (e.g. which renderer, which GLES major version) these >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp >index 5642d9a01d74bbee89cc71f6e2b4230a14d0a6eb..ee5ac4e61333a347c94dadf4630d2cd726275d6f 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DXT1CompressedTextureTest.cpp >@@ -453,7 +453,56 @@ TEST_P(DXT1CompressedTextureTestES3, CopyTexSubImage3DDisallowed) > ASSERT_GL_ERROR(GL_INVALID_OPERATION); > } > >+class DXT1CompressedTextureTestWebGL2 : public DXT1CompressedTextureTest >+{ >+ protected: >+ DXT1CompressedTextureTestWebGL2() >+ { >+ setWebGLCompatibilityEnabled(true); >+ setRobustResourceInit(true); >+ } >+}; >+ >+// Regression test for https://crbug.com/1289428 >+TEST_P(DXT1CompressedTextureTestWebGL2, InitializeTextureContents) >+{ >+ ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_texture_compression_dxt1")); >+ >+ glUseProgram(mTextureProgram); >+ glUniform1i(mTextureUniformLocation, 0); >+ >+ glClearColor(0, 0, 1, 1); >+ >+ const std::array<uint8_t, 8> kGreen = {0xE0, 0x07, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00}; >+ >+ GLTexture tex; >+ glBindTexture(GL_TEXTURE_2D, tex); >+ 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); >+ >+ glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4); >+ EXPECT_GL_NO_ERROR(); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ drawQuad(mTextureProgram, "position", 0.5f, 1.0f, true); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::black); >+ >+ glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, >+ kGreen.data()); >+ EXPECT_GL_NO_ERROR(); >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ drawQuad(mTextureProgram, "position", 0.5f, 1.0f, true); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green); >+} >+ > ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(DXT1CompressedTextureTest); > > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(DXT1CompressedTextureTestES3); > ANGLE_INSTANTIATE_TEST_ES3(DXT1CompressedTextureTestES3); >+ >+ANGLE_INSTANTIATE_TEST_ES3(DXT1CompressedTextureTestWebGL2); >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp >index efd8f8d82b011eb478bc46c682e7cbbf5208b521..da077ff397a30c3a79679487856e4c8cb3cc182b 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilFormatsTest.cpp >@@ -468,7 +468,8 @@ void main() > ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_depth_texture") && > !IsGLExtensionEnabled("GL_ANGLE_depth_texture")); > >- bool depthTextureCubeSupport = IsGLExtensionEnabled("GL_OES_depth_texture_cube_map"); >+ bool depthTextureCubeSupport = IsGLExtensionEnabled("GL_OES_depth_texture_cube_map"); >+ bool textureSrgbDecodeSupport = IsGLExtensionEnabled("GL_EXT_texture_sRGB_decode"); > > // http://anglebug.com/3454 > ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsD3D9()); >@@ -550,6 +551,10 @@ void main() > glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); > glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMode); > glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMode); >+ if (textureSrgbDecodeSupport) >+ { >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); >+ } > > // test level > 0 > glTexImage2D(GL_TEXTURE_2D, 1, type.format, 1, 1, 0, type.format, type.type, nullptr); >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp >index b741b67a1683ff6d140d12c4d520c84efcf969dc..8da339532a03ee93bff5a44c6bfdbfdc980f42e5 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/DepthStencilTest.cpp >@@ -259,6 +259,52 @@ TEST_P(DepthStencilTest, StencilOnlyEmulatedWithPacked) > ensureDepthUnaffected(); > } > >+// Tests that drawing into stencil buffer along multiple render passes works. >+TEST_P(DepthStencilTest, StencilOnlyDrawThenCopyThenDraw) >+{ >+ ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor()); >+ glUseProgram(drawColor); >+ GLint colorUniformLocation = >+ glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform()); >+ ASSERT_NE(colorUniformLocation, -1); >+ >+ bindColorStencilFBO(); >+ >+ // Draw red once >+ glEnable(GL_STENCIL_TEST); >+ glStencilFunc(GL_ALWAYS, 0x55, 0xFF); >+ glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); >+ glStencilMask(0xFF); >+ >+ glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f); >+ drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create a texture and copy color into it, this breaks the render pass. >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D, texture); >+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, getWindowWidth(), getWindowHeight(), 0); >+ >+ // Draw green, expecting correct stencil. >+ glStencilFunc(GL_EQUAL, 0x55, 0xFF); >+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); >+ >+ glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f); >+ drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Verify that the texture is now green >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); >+ >+ // For completeness, also verify that the copy texture is red >+ GLFramebuffer fbo; >+ glBindFramebuffer(GL_FRAMEBUFFER, fbo); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); >+ >+ ASSERT_GL_NO_ERROR(); >+} >+ > // Tests that clearing depth/stencil followed by draw works when the depth/stencil attachment is a > // texture. > TEST_P(DepthStencilTestES3, ClearThenDraw) >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FragDepthTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FragDepthTest.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..d9be8d5c46feefc1dd6f1e27aed04dc744c58872 >--- /dev/null >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FragDepthTest.cpp >@@ -0,0 +1,123 @@ >+// >+// Copyright 2022 The ANGLE Project Authors. All rights reserved. >+// Use of this source code is governed by a BSD-style license that can be >+// found in the LICENSE file. >+// >+// FragDepthTest: >+// Tests the correctness of gl_FragDepth usage. >+// >+ >+#include "test_utils/ANGLETest.h" >+#include "test_utils/gl_raii.h" >+ >+using namespace angle; >+ >+class FragDepthTest : public ANGLETest >+{ >+ protected: >+ struct FragDepthTestResources >+ { >+ GLuint program; >+ GLint depthLocation; >+ GLTexture colorTexture; >+ GLTexture depthTexture; >+ GLFramebuffer framebuffer; >+ }; >+ >+ FragDepthTestResources setupResources() >+ { >+ >+ FragDepthTestResources resources; >+ // Writes a fixed depth value and green. >+ constexpr char kFS[] = >+ R"(#version 300 es >+ precision highp float; >+ layout(location = 0) out vec4 fragColor; >+ uniform float u_depth; >+ void main(){ >+ gl_FragDepth = u_depth; >+ fragColor = vec4(0.0, 1.0, 0.0, 1.0); >+ })"; >+ >+ resources.program = CompileProgram(essl3_shaders::vs::Simple(), kFS); >+ resources.depthLocation = glGetUniformLocation(resources.program, "u_depth"); >+ >+ glBindTexture(GL_TEXTURE_2D, resources.colorTexture); >+ glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); >+ >+ glBindTexture(GL_TEXTURE_2D, resources.depthTexture); >+ glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT32F, 1, 1); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, resources.framebuffer); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, >+ resources.colorTexture, 0); >+ >+ return resources; >+ } >+ >+ void cleanupResources(FragDepthTestResources &resources) { glDeleteProgram(resources.program); } >+ >+ void checkDepthWritten(float expectedDepth, float fsDepth, bool bindDepthBuffer) >+ { >+ FragDepthTestResources resources = setupResources(); >+ ASSERT_NE(0u, resources.program); >+ ASSERT_NE(-1, resources.depthLocation); >+ ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER)); >+ ASSERT_GL_NO_ERROR(); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, resources.framebuffer); >+ if (bindDepthBuffer) >+ { >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, >+ resources.depthTexture, 0); >+ EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ // Clear to the expected depth so it will be compared to the FS depth with >+ // DepthFunc(GL_EQUAL) >+ glClearDepthf(expectedDepth); >+ glDepthFunc(GL_EQUAL); >+ glEnable(GL_DEPTH_TEST); >+ } >+ else >+ { >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); >+ EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ glDisable(GL_DEPTH_TEST); >+ } >+ glUseProgram(resources.program); >+ >+ // Clear to red, the FS will write green on success >+ glClearColor(1.0f, 0.0f, 0.0f, 0.0f); >+ // Clear to the expected depth so it will be compared to the FS depth with >+ // DepthFunc(GL_EQUAL) >+ >+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); >+ glUniform1f(resources.depthLocation, fsDepth); >+ >+ drawQuad(resources.program, "a_position", 0.0f); >+ EXPECT_GL_NO_ERROR(); >+ >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); >+ cleanupResources(resources); >+ } >+}; >+ >+// Test that writing to gl_FragDepth works >+TEST_P(FragDepthTest, DepthBufferBound) >+{ >+ checkDepthWritten(0.5f, 0.5f, true); >+} >+ >+// Test that writing to gl_FragDepth with no depth buffer works. >+TEST_P(FragDepthTest, DepthBufferUnbound) >+{ >+ // Depth test is disabled, so the expected depth should not matter. >+ checkDepthWritten(0.f, 0.5f, false); >+} >+ >+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FragDepthTest); >+ANGLE_INSTANTIATE_TEST_ES3(FragDepthTest); >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferFetchTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferFetchTest.cpp >index 3eb3f6df4b5c4c9ea055bcc32d2cc5a27b4dd7d9..a9ddf260d323e4e44431e8d686ee574be8556a88 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferFetchTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferFetchTest.cpp >@@ -1612,6 +1612,59 @@ void main (void) > glBindFramebuffer(GL_FRAMEBUFFER, 0); > } > >+// Verify we can use inout with the default framebuffer >+// http://anglebug.com/6893 >+TEST_P(FramebufferFetchES31, DefaultFramebufferTest) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_shader_framebuffer_fetch")); >+ >+ constexpr char kVS[] = R"(#version 300 es >+in highp vec4 a_position; >+ >+void main (void) >+{ >+ gl_Position = a_position; >+})"; >+ >+ constexpr char kFS[] = R"(#version 300 es >+#extension GL_EXT_shader_framebuffer_fetch : require >+layout(location = 0) inout highp vec4 o_color; >+ >+uniform highp vec4 u_color; >+void main (void) >+{ >+ o_color += u_color; >+})"; >+ >+ GLProgram program; >+ program.makeRaster(kVS, kFS); >+ glUseProgram(program); >+ >+ ASSERT_GL_NO_ERROR(); >+ >+ // Ensure that we're rendering to the default framebuffer >+ glBindFramebuffer(GL_FRAMEBUFFER, 0); >+ >+ // Start with a clear buffer >+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f); >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ GLint positionLocation = glGetAttribLocation(program, "a_position"); >+ GLint colorLocation = glGetUniformLocation(program, "u_color"); >+ >+ // Draw once with red >+ glUniform4fv(colorLocation, 1, GLColor::red.toNormalizedVector().data()); >+ render(positionLocation, GL_FALSE); >+ EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::red); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Draw again with blue, adding it to the existing red, ending up with magenta >+ glUniform4fv(colorLocation, 1, GLColor::blue.toNormalizedVector().data()); >+ render(positionLocation, GL_FALSE); >+ EXPECT_PIXEL_COLOR_EQ(kViewportWidth / 2, kViewportHeight / 2, GLColor::magenta); >+ ASSERT_GL_NO_ERROR(); >+} >+ > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FramebufferFetchES31); > ANGLE_INSTANTIATE_TEST_ES31(FramebufferFetchES31); > } // namespace angle >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp >index 5689e42e9587fb00f0da5e22ee87452963df0b0b..1d82fd6c25f4b0db1999b089615a91f1f155f13a 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/FramebufferTest.cpp >@@ -1863,6 +1863,43 @@ TEST_P(FramebufferTest_ES31, IncompleteMultisampleFixedSampleLocationsTex) > ASSERT_GL_NO_ERROR(); > } > >+// Tests that draw to Y-flipped FBO results in correct pixels. >+TEST_P(FramebufferTest_ES31, BasicDrawToYFlippedFBO) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ constexpr int kSize = 16; >+ glViewport(0, 0, kSize, kSize); >+ >+ GLFramebuffer fbo; >+ glBindFramebuffer(GL_FRAMEBUFFER, fbo.get()); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D, texture.get()); >+ glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize); >+ ASSERT_GL_NO_ERROR(); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.get(), 0); >+ ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ ANGLE_GL_PROGRAM(gradientProgram, essl31_shaders::vs::Passthrough(), >+ essl31_shaders::fs::RedGreenGradient()); >+ drawQuad(gradientProgram, essl31_shaders::PositionAttrib(), 0.5f, 1.0f, true); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Remove the flag so that glReadPixels do not implicitly use that. >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ >+ constexpr uint8_t kHalfPixelGradient = 256 / kSize / 2; >+ EXPECT_PIXEL_NEAR(0, 0, kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kSize - 1, 0, 255 - kHalfPixelGradient, 255 - kHalfPixelGradient, 0, 255, >+ 1.0); >+ EXPECT_PIXEL_NEAR(0, kSize - 1, kHalfPixelGradient, kHalfPixelGradient, 0, 255, 1.0); >+ EXPECT_PIXEL_NEAR(kSize - 1, kSize - 1, 255 - kHalfPixelGradient, kHalfPixelGradient, 0, 255, >+ 1.0); >+} >+ > // Test resolving a multisampled texture with blit > TEST_P(FramebufferTest_ES31, MultisampleResolveWithBlit) > { >@@ -2745,6 +2782,49 @@ void main() > ASSERT_GL_NO_ERROR(); > } > >+// Validates both MESA and standard functions can be used on OpenGL ES >=3.1 >+TEST_P(FramebufferTest_ES31, ValidateFramebufferFlipYMesaExtension) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ GLFramebuffer mFramebuffer; >+ glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer.get()); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ ASSERT_GL_NO_ERROR(); >+ >+ GLint flip_y = -1; >+ >+ glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y); >+ ASSERT_GL_NO_ERROR(); >+ EXPECT_EQ(flip_y, 1); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ ASSERT_GL_NO_ERROR(); >+ >+ flip_y = -1; >+ glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y); >+ ASSERT_GL_NO_ERROR(); >+ EXPECT_EQ(flip_y, 0); >+ >+ // Also using non-MESA functions should work. >+ glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ ASSERT_GL_NO_ERROR(); >+ >+ flip_y = -1; >+ glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y); >+ ASSERT_GL_NO_ERROR(); >+ EXPECT_EQ(flip_y, 1); >+ >+ glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ ASSERT_GL_NO_ERROR(); >+ >+ flip_y = -1; >+ glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y); >+ ASSERT_GL_NO_ERROR(); >+ EXPECT_EQ(flip_y, 0); >+} >+ > class AddMockTextureNoRenderTargetTest : public ANGLETest > { > public: >@@ -3688,6 +3768,50 @@ TEST_P(FramebufferTest_ES3, AttachmentsWithUnequalDimensions) > } > } > >+// Validates only MESA functions can be used on OpenGL ES <3.1 >+TEST_P(FramebufferTest_ES3, ValidateFramebufferFlipYMesaExtension) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ GLFramebuffer mFramebuffer; >+ glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer.get()); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 1); >+ ASSERT_GL_NO_ERROR(); >+ >+ GLint flip_y = -1; >+ >+ glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y); >+ ASSERT_GL_NO_ERROR(); >+ EXPECT_EQ(flip_y, 1); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ ASSERT_GL_NO_ERROR(); >+ >+ flip_y = -1; >+ glGetFramebufferParameterivMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y); >+ ASSERT_GL_NO_ERROR(); >+ EXPECT_EQ(flip_y, 0); >+ >+ // Using non-MESA function should fail. >+ glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, 0); >+ ASSERT_GL_ERROR(GL_INVALID_OPERATION); >+ >+ glGetFramebufferParameteriv(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA, &flip_y); >+ ASSERT_GL_ERROR(GL_INVALID_OPERATION); >+} >+ >+TEST_P(FramebufferTest_ES3, FramebufferFlipYMesaExtensionIncorrectPname) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y")); >+ >+ GLFramebuffer mFramebuffer; >+ glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer.get()); >+ >+ glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_DEFAULT_WIDTH, 1); >+ ASSERT_GL_ERROR(GL_INVALID_ENUM); >+} >+ > class FramebufferTest : public ANGLETest > {}; > >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp >index cfe5bb2df798f689ba211b72dd61e123e050792f..8c5ef361d36c25def4513167a31f179784b518be 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/GLSLTest.cpp >@@ -12460,6 +12460,157 @@ void main() > EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::white); > } > >+// Test using builtins that can only be redefined with gl_PerVertex >+TEST_P(GLSLTest_ES31, PerVertexRedefinition) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader")); >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clip_cull_distance")); >+ >+ constexpr char kVS[] = R"(#version 310 es >+void main() >+{ >+ gl_Position = vec4(1.0, 0.0, 0.0, 1.0); >+})"; >+ >+ constexpr char kGS[] = R"(#version 310 es >+#extension GL_EXT_geometry_shader : require >+#extension GL_EXT_clip_cull_distance : require >+ >+layout(lines_adjacency, invocations = 3) in; >+layout(points, max_vertices = 16) out; >+ >+out gl_PerVertex { >+ vec4 gl_Position; >+ float gl_ClipDistance[4]; >+ float gl_CullDistance[4]; >+}; >+ >+void main() >+{ >+ for (int n = 0; n < 16; ++n) >+ { >+ gl_Position = vec4(n, 0.0, 0.0, 1.0); >+ EmitVertex(); >+ } >+ >+ EndPrimitive(); >+})"; >+ >+ constexpr char kFS[] = R"(#version 310 es >+precision highp float; >+ >+out vec4 result; >+ >+void main() >+{ >+ result = vec4(1.0); >+})"; >+ >+ ANGLE_GL_PROGRAM_WITH_GS(program, kVS, kGS, kFS); >+ EXPECT_GL_NO_ERROR(); >+} >+ >+// Negative test using builtins that can only be used when redefining gl_PerVertex >+TEST_P(GLSLTest_ES31, PerVertexNegativeTest) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader")); >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clip_cull_distance")); >+ >+ constexpr char kVS[] = R"(#version 310 es >+void main() >+{ >+ gl_Position = vec4(1.0, 0.0, 0.0, 1.0); >+})"; >+ >+ constexpr char kGS[] = R"(#version 310 es >+#extension GL_EXT_geometry_shader : require >+#extension GL_EXT_clip_cull_distance : require >+ >+layout(lines_adjacency, invocations = 3) in; >+layout(points, max_vertices = 16) out; >+ >+vec4 gl_Position; >+float gl_ClipDistance[4]; >+float gl_CullDistance[4]; >+ >+void main() >+{ >+ for (int n = 0; n < 16; ++n) >+ { >+ gl_Position = vec4(n, 0.0, 0.0, 1.0); >+ EmitVertex(); >+ } >+ >+ EndPrimitive(); >+})"; >+ >+ constexpr char kFS[] = R"(#version 310 es >+precision highp float; >+ >+out vec4 result; >+ >+void main() >+{ >+ result = vec4(1.0); >+})"; >+ >+ GLuint program = CompileProgramWithGS(kVS, kGS, kFS); >+ EXPECT_EQ(0u, program); >+ glDeleteProgram(program); >+} >+ >+// Negative test using builtins that can only be used when redefining gl_PerVertex >+// but have the builtins in a differently named struct >+TEST_P(GLSLTest_ES31, PerVertexRenamedNegativeTest) >+{ >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader")); >+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_clip_cull_distance")); >+ >+ constexpr char kVS[] = R"(#version 310 es >+void main() >+{ >+ gl_Position = vec4(1.0, 0.0, 0.0, 1.0); >+})"; >+ >+ constexpr char kGS[] = R"(#version 310 es >+#extension GL_EXT_geometry_shader : require >+#extension GL_EXT_clip_cull_distance : require >+ >+layout(lines_adjacency, invocations = 3) in; >+layout(points, max_vertices = 16) out; >+ >+out Block { >+ vec4 gl_Position; >+ float gl_ClipDistance[4]; >+ float gl_CullDistance[4]; >+}; >+ >+void main() >+{ >+ for (int n = 0; n < 16; ++n) >+ { >+ gl_Position = vec4(n, 0.0, 0.0, 1.0); >+ EmitVertex(); >+ } >+ >+ EndPrimitive(); >+})"; >+ >+ constexpr char kFS[] = R"(#version 310 es >+precision highp float; >+ >+out vec4 result; >+ >+void main() >+{ >+ result = vec4(1.0); >+})"; >+ >+ GLuint program = CompileProgramWithGS(kVS, kGS, kFS); >+ EXPECT_EQ(0u, program); >+ glDeleteProgram(program); >+} >+ > // Test varying packing in presence of multiple I/O blocks > TEST_P(GLSLTest_ES31, MultipleIOBlocks) > { >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp >index 6ecf799c192bccee4cf9e8e20b31a24adac45eca..7b81206f362a20d238e06df06841c9be2f86f4fc 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ImageTest.cpp >@@ -565,6 +565,7 @@ class ImageTest : public ANGLETest > }; > > constexpr static uint32_t kDefaultAHBUsage = kAHBUsageGPUSampledImage | kAHBUsageGPUFramebuffer; >+ constexpr static uint32_t kDefaultAHBYUVUsage = kAHBUsageGPUSampledImage; > > AHardwareBuffer *createAndroidHardwareBuffer(size_t width, > size_t height, >@@ -599,8 +600,9 @@ class ImageTest : public ANGLETest > > if (!data.empty()) > { >- writeAHBData(aHardwareBuffer, width, height, depth, >- androidFormat == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, data); >+ const bool isYUV = androidFormat == AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 || >+ androidFormat == AHARDWAREBUFFER_FORMAT_YV12; >+ writeAHBData(aHardwareBuffer, width, height, depth, isYUV, data); > } > > return aHardwareBuffer; >@@ -2559,6 +2561,80 @@ TEST_P(ImageTestES3, SourceYUVAHBTargetExternalYUVSample) > #endif > } > >+TEST_P(ImageTestES3, SourceYUVAHBTargetExternalYUVSampleLinearFiltering) >+{ >+#ifndef ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT >+ std::cout << "Test skipped: !ANGLE_AHARDWARE_BUFFER_LOCK_PLANES_SUPPORT." << std::endl; >+ return; >+#else >+ EGLWindow *window = getEGLWindow(); >+ >+ ANGLE_SKIP_TEST_IF(!hasOESExt() || !hasBaseExt() || !has2DTextureExt()); >+ ANGLE_SKIP_TEST_IF(!hasAndroidImageNativeBufferExt() || !hasAndroidHardwareBufferSupport()); >+ >+ // [ Red, Red] >+ // [ Red, Red] >+ // [Black, Black] >+ // [Black, Black] >+ >+ // clang-format off >+ GLubyte dataY[] = { >+ 76, 76, >+ 76, 76, >+ 16, 16, >+ 16, 16, >+ }; >+ GLubyte dataCb[] = { >+ 84, >+ 128, >+ }; >+ GLubyte dataCr[] = { >+ 255, >+ 128, >+ }; >+ // clang-format on >+ >+ // Create the Image >+ AHardwareBuffer *ahbSource; >+ EGLImageKHR ahbImage; >+ createEGLImageAndroidHardwareBufferSource( >+ 2, 4, 1, AHARDWAREBUFFER_FORMAT_YV12, kDefaultAHBYUVUsage, kDefaultAttribs, >+ {{dataY, 1}, {dataCb, 1}, {dataCr, 1}}, &ahbSource, &ahbImage); >+ >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create a texture target to bind the egl image >+ GLTexture ahbTexture; >+ createEGLImageTargetTextureExternal(ahbImage, ahbTexture); >+ >+ // Configure linear filtering >+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, ahbTexture); >+ glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); >+ glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ >+ // Draw fullscreen sampling from ahbTexture. >+ glUseProgram(mTextureExternalProgram); >+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, ahbTexture); >+ glUniform1i(mTextureExternalUniformLocation, 0); >+ drawQuad(mTextureExternalProgram, "position", 0.5f); >+ >+ // Framebuffer needs to be bigger than the AHB so there is an area in between that will result >+ // in half-red. >+ const int windowHeight = getWindowHeight(); >+ ASSERT_GE(windowHeight, 8); >+ >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black); >+ EXPECT_PIXEL_COLOR_EQ(0, windowHeight - 1, GLColor::red); >+ >+ // Approximately half-red: >+ EXPECT_PIXEL_COLOR_NEAR(0, windowHeight / 2, GLColor(127, 0, 0, 255), 15.0); >+ >+ // Clean up >+ eglDestroyImageKHR(window->getDisplay(), ahbImage); >+ destroyAndroidHardwareBuffer(ahbSource); >+#endif >+} >+ > // Test rendering to a YUV AHB using EXT_yuv_target > TEST_P(ImageTestES3, RenderToYUVAHB) > { >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp >index 57b5487d1c32cf90fe8a3400b14452c40411b543..ddfdf99d6ee1f2d4b6a970b6f9e2b7514dcb2fa8 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MipmapTest.cpp >@@ -1572,6 +1572,106 @@ TEST_P(MipmapTestES3, MipmapsForTexture3D) > EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); > } > >+// Create a 2D array, then immediately redefine it to have fewer layers. Regression test for a bug >+// in the Vulkan backend where the old higher-layer-count data upload was not removed. >+TEST_P(MipmapTestES3, TextureArrayRedefineThenGenerateMipmap) >+{ >+ int px = getWindowWidth() / 2; >+ int py = getWindowHeight() / 2; >+ >+ glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture); >+ >+ // Fill the whole texture with red, then redefine it and fill with green >+ std::vector<GLColor> pixelsRed(2 * 2 * 4, GLColor::red); >+ std::vector<GLColor> pixelsGreen(2 * 2 * 2, GLColor::green); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsRed.data()); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsGreen.data()); >+ >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ EXPECT_GL_NO_ERROR(); >+ >+ // Generate mipmaps >+ glGenerateMipmap(GL_TEXTURE_2D_ARRAY); >+ EXPECT_GL_NO_ERROR(); >+ >+ glUseProgram(mArrayProgram); >+ EXPECT_GL_NO_ERROR(); >+ >+ // Draw the first slice >+ glUniform1i(mTextureArraySliceUniformLocation, 0); >+ drawQuad(mArrayProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+ >+ // Draw the second slice >+ glUniform1i(mTextureArraySliceUniformLocation, 1); >+ drawQuad(mArrayProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+} >+ >+// Create a 2D array, use it, then redefine it to have fewer layers. Regression test for a bug in >+// the Vulkan backend where the old higher-layer-count data upload was not removed. >+TEST_P(MipmapTestES3, TextureArrayUseThenRedefineThenGenerateMipmap) >+{ >+ int px = getWindowWidth() / 2; >+ int py = getWindowHeight() / 2; >+ >+ glBindTexture(GL_TEXTURE_2D_ARRAY, mTexture); >+ >+ // Fill the whole texture with red. >+ std::vector<GLColor> pixelsRed(2 * 2 * 4, GLColor::red); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsRed.data()); >+ >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ EXPECT_GL_NO_ERROR(); >+ >+ // Generate mipmap >+ glGenerateMipmap(GL_TEXTURE_2D_ARRAY); >+ EXPECT_GL_NO_ERROR(); >+ >+ glUseProgram(mArrayProgram); >+ EXPECT_GL_NO_ERROR(); >+ >+ // Draw the first slice >+ glUniform1i(mTextureArraySliceUniformLocation, 0); >+ drawQuad(mArrayProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); >+ >+ // Draw the fourth slice >+ glUniform1i(mTextureArraySliceUniformLocation, 3); >+ drawQuad(mArrayProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); >+ >+ // Redefine the image and fill with green >+ std::vector<GLColor> pixelsGreen(2 * 2 * 2, GLColor::green); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsGreen.data()); >+ >+ // Generate mipmap >+ glGenerateMipmap(GL_TEXTURE_2D_ARRAY); >+ EXPECT_GL_NO_ERROR(); >+ >+ // Draw the first slice >+ glUniform1i(mTextureArraySliceUniformLocation, 0); >+ drawQuad(mArrayProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+ >+ // Draw the second slice >+ glUniform1i(mTextureArraySliceUniformLocation, 1); >+ drawQuad(mArrayProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+} >+ > // Create a 2D texture with levels 0-2, call GenerateMipmap with base level 1 so that level 0 stays > // the same, and then sample levels 0 and 2. > // GLES 3.0.4 section 3.8.10: >@@ -2016,6 +2116,23 @@ TEST_P(MipmapTestES3, ResizeBaseMipTo1x1ThenDelete) > EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); > } > >+// Test the calling generateMipmap with redefining texture and modifying baselevel. >+TEST_P(MipmapTestES3, GenerateMipmapWithRedefineLevelAndTexture) >+{ >+ std::vector<GLColor> pixels(1000000, GLColor::black); >+ >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D, texture); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); >+ glGenerateMipmap(GL_TEXTURE_2D); >+ glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 2); >+ glGenerateMipmap(GL_TEXTURE_2D); >+ >+ clearAndDrawQuad(m2DProgram, getWindowWidth(), getWindowHeight()); >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::black); >+} >+ > // Use this to select which configurations (e.g. which renderer, which GLES major version) these > // tests should be run against. > ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(MipmapTest); >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp >index d07f15cfb548e85cbfca206c2f1f2008a3ee6d58..f9ac5d3577b75122f09cec156a36562385db0e9d 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultisampledRenderToTextureTest.cpp >@@ -584,6 +584,8 @@ void MultisampledRenderToTextureTest::createAndAttachColorAttachment( > { > glBindTexture(GL_TEXTURE_2D, *textureOut); > glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, size, size, 0, format, type, nullptr); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); > glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, renderbufferTarget, GL_TEXTURE_2D, > *textureOut, 0, samples); > } >@@ -609,6 +611,8 @@ void MultisampledRenderToTextureTest::createAndAttachDepthStencilAttachment( > glBindTexture(GL_TEXTURE_2D, *textureOut); > glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, size, size, 0, GL_DEPTH_STENCIL, > GL_UNSIGNED_INT_24_8_OES, nullptr); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); > glFramebufferTexture2DMultisampleEXT(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, > GL_TEXTURE_2D, *textureOut, 0, mTestSampleCount); > } >@@ -833,9 +837,6 @@ TEST_P(MultisampledRenderToTextureTest, 2DColorDepthMultisampleDrawTest) > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // http://anglebug.com/5380 >- ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >- > constexpr GLsizei kSize = 6; > // create complete framebuffer with depth buffer > GLTexture texture; >@@ -1393,9 +1394,6 @@ TEST_P(MultisampledRenderToTextureES3Test, > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // http://anglebug.com/5380 >- ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >- > constexpr GLsizei kSize = 64; > > setupCopyTexProgram(); >@@ -1690,6 +1688,82 @@ TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawCopyDrawAttachInvalid > drawCopyDrawAttachInvalidatedThenDrawCommon(true); > } > >+// Draw with a stencil-only attachment once without needing to unresolve it, and once needing to. >+// Regression test for a bug in the Vulkan backend where the state of stencil unresolve attachment's >+// existence was masked out by mistake in the framebuffer cache key, so the same framebuffer object >+// was used for both render passes, even though they could have different subpass counts due to >+// stencil unresolve. >+TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawStencilThenUnresolveStencil) >+{ >+ ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); >+ constexpr GLsizei kSize = 64; >+ >+ setupCopyTexProgram(); >+ >+ ANGLE_GL_PROGRAM(drawColor, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor()); >+ glUseProgram(drawColor); >+ GLint colorUniformLocation = >+ glGetUniformLocation(drawColor, angle::essl1_shaders::ColorUniform()); >+ ASSERT_NE(colorUniformLocation, -1); >+ >+ GLFramebuffer fboMS; >+ glBindFramebuffer(GL_FRAMEBUFFER, fboMS); >+ >+ // Create multisampled framebuffer to draw into >+ GLTexture textureMS; >+ createAndAttachColorAttachment(false, kSize, GL_COLOR_ATTACHMENT0, nullptr, mTestSampleCount, >+ &textureMS, nullptr); >+ EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ GLRenderbuffer dsRenderbufferMS; >+ glBindRenderbuffer(GL_RENDERBUFFER, dsRenderbufferMS); >+ glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, mTestSampleCount, GL_STENCIL_INDEX8, kSize, >+ kSize); >+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, >+ dsRenderbufferMS); >+ EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER); >+ >+ // Draw red once with stencil cleared, not needing unresolve >+ glClearColor(0.1, 0.2, 0.3, 0.4); >+ glClearStencil(0); >+ glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); >+ >+ glEnable(GL_STENCIL_TEST); >+ glStencilFunc(GL_ALWAYS, 0x55, 0xFF); >+ glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); >+ glStencilMask(0xFF); >+ >+ glUniform4f(colorUniformLocation, 1.0f, 0.0f, 0.0f, 1.0f); >+ drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create a texture and copy color into it, this breaks the render pass >+ GLTexture texture; >+ glBindTexture(GL_TEXTURE_2D, texture); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, kSize, kSize, 0); >+ >+ // Clear the color, so that only stencil needs unresolving. >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Draw green, expecting correct stencil. This unresolves stencil. >+ glStencilFunc(GL_EQUAL, 0x55, 0xFF); >+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); >+ >+ glUniform4f(colorUniformLocation, 0.0f, 1.0f, 0.0f, 1.0f); >+ drawQuad(drawColor, essl1_shaders::PositionAttrib(), 1.0f); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Verify that the texture is now green >+ verifyResults(textureMS, GLColor::green, kSize, 0, 0, kSize, kSize); >+ >+ // For completeness, also verify that the copy texture is red >+ verifyResults(texture, GLColor::red, kSize, 0, 0, kSize, kSize); >+ >+ ASSERT_GL_NO_ERROR(); >+} >+ > void MultisampledRenderToTextureES3Test::drawCopyDrawAttachDepthStencilClearThenDrawCommon( > bool useRenderbuffer) > { >@@ -2022,9 +2096,6 @@ void MultisampledRenderToTextureES3Test::depthStencilClearThenDrawCommon(bool us > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2")); > } > >- // http://anglebug.com/5083 >- ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan()); >- > constexpr GLsizei kSize = 64; > > setupCopyTexProgram(); >@@ -2098,15 +2169,9 @@ TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDepthStencilClearDrawCopy > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // http://anglebug.com/5083 >- ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan()); >- > // http://anglebug.com/5096 > ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan()); > >- // http://anglebug.com/5380 >- ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >- > constexpr GLsizei kSize = 64; > > setupCopyTexProgram(); >@@ -2193,15 +2258,9 @@ TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDepthStencilDrawCopyClear > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // http://anglebug.com/5083 >- ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan()); >- > // http://anglebug.com/5096 > ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan()); > >- // http://anglebug.com/5380 >- ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >- > constexpr GLsizei kSize = 64; > > setupCopyTexProgram(); >@@ -2305,17 +2364,6 @@ TEST_P(MultisampledRenderToTextureES3Test, RenderbufferClearThenBlitDepthStencil > // http://anglebug.com/3107 > ANGLE_SKIP_TEST_IF(IsD3D()); > >- // The following trybot configurations don't support VK_KHR_depth_stencil_resolve. ANGLE is not >- // conformant without this extension, but it's allowed as users commonly invalidate >- // depth/stencil. >- // >- // - SwifthShader >- // - Android >- // - AMD >- // - Nvidia on Windows7 >- ANGLE_SKIP_TEST_IF(IsVulkan() && >- (isSwiftshader() || IsAndroid() || IsAMD() || (IsWindows7() && IsNVIDIA()))); >- > constexpr GLsizei kSize = 64; > > setupCopyTexProgram(); >@@ -2424,11 +2472,6 @@ TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawThenBlitDepthStencil) > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // Skip on configurations that don't support VK_KHR_depth_stencil_resolve. See comment >- // in RenderbufferClearThenBlitDepthStencil. >- ANGLE_SKIP_TEST_IF(IsVulkan() && >- (isSwiftshader() || IsAndroid() || IsAMD() || (IsWindows7() && IsNVIDIA()))); >- > // http://anglebug.com/5096 > ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan()); > >@@ -2538,11 +2581,6 @@ TEST_P(MultisampledRenderToTextureES3Test, RenderbufferDrawThenBlitDepthStencilO > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // Skip on configurations that don't support VK_KHR_depth_stencil_resolve. See comment >- // in RenderbufferClearThenBlitDepthStencil. >- ANGLE_SKIP_TEST_IF(IsVulkan() && >- (isSwiftshader() || IsAndroid() || IsAMD() || (IsWindows7() && IsNVIDIA()))); >- > // http://anglebug.com/5096 > ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan()); > >@@ -2698,9 +2736,6 @@ TEST_P(MultisampledRenderToTextureTest, DepthReadWriteToggleWithStartedRenderPas > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // http://anglebug.com/5380 >- ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >- > constexpr GLsizei kSize = 64; > > setupCopyTexProgram(); >@@ -3673,15 +3708,9 @@ void MultisampledRenderToTextureES3Test::renderbufferUnresolveColorAndDepthStenc > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture2")); > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_draw_buffers")); > >- // http://anglebug.com/5083 >- ANGLE_SKIP_TEST_IF(IsWindows() && IsAMD() && IsVulkan()); >- > // http://anglebug.com/5096 > ANGLE_SKIP_TEST_IF(IsLinux() && IsIntel() && IsVulkan()); > >- // http://anglebug.com/5380 >- ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >- > constexpr GLsizei kSize = 64; > > setupCopyTexProgram(); >@@ -3871,9 +3900,6 @@ TEST_P(MultisampledRenderToTextureES3Test, ClearThenMaskedClearFramebufferTest) > { > ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_multisampled_render_to_texture")); > >- // TODO(anglebug:5655): This test is failing on Linux AMD Vulkan since it was added. >- ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >- > // TODO(geofflang) http://anglebug.com/2894 > ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGL() && IsPixel2()); > >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultithreadingTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultithreadingTest.cpp >index 40b0176a4f9db56ca0809941bf2897e28ec69870..806f1ea2b7208119cc94f8327b049dfb0653cf4f 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultithreadingTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/MultithreadingTest.cpp >@@ -727,7 +727,7 @@ void MultithreadingTestES3::mainThreadDraw(bool useDraw) > TEST_P(MultithreadingTestES3, MultithreadFenceDraw) > { > // http://anglebug.com/5418 >- ANGLE_SKIP_TEST_IF(IsLinux() && IsVulkan() && (IsIntel() || IsSwiftshaderDevice())); >+ ANGLE_SKIP_TEST_IF(IsLinux() && IsVulkan() && (IsIntel() || isSwiftshader())); > > // Have the secondary thread use glDrawArrays() > mainThreadDraw(true); >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp >index 99d0e9f2c4531adb7cc3743d0c429fd3e3ff4772..8e3c036daa6c5275a2a178199a9f1799ff248ee0 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProgramPipelineTest.cpp >@@ -765,6 +765,215 @@ void main() > EXPECT_GL_ERROR(GL_INVALID_OPERATION); > } > >+// Test that uniform updates are propagated with minimal state changes. >+TEST_P(ProgramPipelineTest31, UniformUpdate) >+{ >+ ANGLE_SKIP_TEST_IF(!IsVulkan()); >+ >+ // Create two separable program objects from a >+ // single source string respectively (vertSrc and fragSrc) >+ const GLchar *vertString = essl31_shaders::vs::Simple(); >+ const GLchar *fragString = R"(#version 310 es >+precision highp float; >+uniform float redColorIn; >+uniform float greenColorIn; >+out vec4 my_FragColor; >+void main() >+{ >+ my_FragColor = vec4(redColorIn, greenColorIn, 0.0, 1.0); >+})"; >+ >+ bindProgramPipeline(vertString, fragString); >+ >+ GLint redLoc = glGetUniformLocation(mFragProg, "redColorIn"); >+ ASSERT_NE(-1, redLoc); >+ GLint greenLoc = glGetUniformLocation(mFragProg, "greenColorIn"); >+ ASSERT_NE(-1, greenLoc); >+ >+ glActiveShaderProgram(mPipeline, mFragProg); >+ >+ std::array<Vector3, 6> verts = GetQuadVertices(); >+ >+ GLBuffer vbo; >+ glBindBuffer(GL_ARRAY_BUFFER, vbo); >+ glBufferData(GL_ARRAY_BUFFER, verts.size() * sizeof(verts[0]), verts.data(), GL_STATIC_DRAW); >+ >+ GLint posLoc = glGetAttribLocation(mVertProg, "a_position"); >+ glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glEnableVertexAttribArray(posLoc); >+ >+ glClearColor(0.0, 0.0, 0.0, 0.0); >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ // Set the output color to red, draw to left half of window. >+ glUniform1f(redLoc, 1.0); >+ glUniform1f(greenLoc, 0.0); >+ glViewport(0, 0, getWindowWidth() / 2, getWindowHeight()); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Set the output color to green, draw to right half of window. >+ glUniform1f(redLoc, 0.0); >+ glUniform1f(greenLoc, 1.0); >+ >+ glViewport(getWindowWidth() / 2, 0, getWindowWidth() / 2, getWindowHeight()); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ ASSERT_GL_NO_ERROR(); >+ >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2 + 1, 0, GLColor::green); >+} >+ >+// Test that uniform updates propagate to two pipelines. >+TEST_P(ProgramPipelineTest31, UniformUpdateTwoPipelines) >+{ >+ ANGLE_SKIP_TEST_IF(!IsVulkan()); >+ >+ // Create two separable program objects from a >+ // single source string respectively (vertSrc and fragSrc) >+ const GLchar *vertString = essl31_shaders::vs::Simple(); >+ const GLchar *fragString = R"(#version 310 es >+precision highp float; >+uniform float redColorIn; >+uniform float greenColorIn; >+out vec4 my_FragColor; >+void main() >+{ >+ my_FragColor = vec4(redColorIn, greenColorIn, 0.0, 1.0); >+})"; >+ >+ mVertProg = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &vertString); >+ ASSERT_NE(mVertProg, 0u); >+ mFragProg = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &fragString); >+ ASSERT_NE(mFragProg, 0u); >+ >+ GLint redLoc = glGetUniformLocation(mFragProg, "redColorIn"); >+ ASSERT_NE(-1, redLoc); >+ GLint greenLoc = glGetUniformLocation(mFragProg, "greenColorIn"); >+ ASSERT_NE(-1, greenLoc); >+ >+ GLProgramPipeline ppo1; >+ glUseProgramStages(ppo1, GL_VERTEX_SHADER_BIT, mVertProg); >+ glUseProgramStages(ppo1, GL_FRAGMENT_SHADER_BIT, mFragProg); >+ glBindProgramPipeline(ppo1); >+ glActiveShaderProgram(ppo1, mFragProg); >+ ASSERT_GL_NO_ERROR(); >+ >+ GLProgramPipeline ppo2; >+ glUseProgramStages(ppo2, GL_VERTEX_SHADER_BIT, mVertProg); >+ glUseProgramStages(ppo2, GL_FRAGMENT_SHADER_BIT, mFragProg); >+ glBindProgramPipeline(ppo2); >+ glActiveShaderProgram(ppo2, mFragProg); >+ ASSERT_GL_NO_ERROR(); >+ >+ std::array<Vector3, 6> verts = GetQuadVertices(); >+ >+ GLBuffer vbo; >+ glBindBuffer(GL_ARRAY_BUFFER, vbo); >+ glBufferData(GL_ARRAY_BUFFER, verts.size() * sizeof(verts[0]), verts.data(), GL_STATIC_DRAW); >+ >+ GLint posLoc = glGetAttribLocation(mVertProg, "a_position"); >+ glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr); >+ glEnableVertexAttribArray(posLoc); >+ >+ glClearColor(0.0, 0.0, 0.0, 0.0); >+ glClear(GL_COLOR_BUFFER_BIT); >+ >+ const GLsizei w = getWindowWidth() / 2; >+ const GLsizei h = getWindowHeight() / 2; >+ >+ // Set the output color to red, draw to UL quad of window with first PPO. >+ glUniform1f(redLoc, 1.0); >+ glUniform1f(greenLoc, 0.0); >+ glBindProgramPipeline(ppo1); >+ glViewport(0, 0, w, h); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Draw red to UR half of window with second PPO. >+ glBindProgramPipeline(ppo2); >+ glViewport(w, 0, w, h); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Draw green to LL corner of window with first PPO. >+ glUniform1f(redLoc, 0.0); >+ glUniform1f(greenLoc, 1.0); >+ glBindProgramPipeline(ppo1); >+ glViewport(0, h, w, h); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ ASSERT_GL_NO_ERROR(); >+ >+ // Draw green to LR half of window with second PPO. >+ glBindProgramPipeline(ppo2); >+ glViewport(w, h, w, h); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ ASSERT_GL_NO_ERROR(); >+ >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(w + 1, 0, GLColor::red); >+ EXPECT_PIXEL_COLOR_EQ(0, h + 1, GLColor::green); >+ EXPECT_PIXEL_COLOR_EQ(w + 1, h + 1, GLColor::green); >+} >+ >+// Tests that setting sampler bindings on a program before the pipeline works as expected. >+TEST_P(ProgramPipelineTest31, BindSamplerBeforeCreatingPipeline) >+{ >+ ANGLE_SKIP_TEST_IF(!IsVulkan()); >+ >+ // Create two textures - red and green. >+ GLTexture redTex; >+ glBindTexture(GL_TEXTURE_2D, redTex); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ >+ GLTexture greenTex; >+ glBindTexture(GL_TEXTURE_2D, greenTex); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); >+ >+ // Bind red to texture unit 0 and green to unit 1. >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, redTex); >+ >+ glActiveTexture(GL_TEXTURE1); >+ glBindTexture(GL_TEXTURE_2D, greenTex); >+ >+ // Create the separable programs. >+ const char *vsSource = essl1_shaders::vs::Texture2D(); >+ mVertProg = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &vsSource); >+ ASSERT_NE(0u, mVertProg); >+ >+ const char *fsSource = essl1_shaders::fs::Texture2D(); >+ mFragProg = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &fsSource); >+ ASSERT_NE(0u, mFragProg); >+ >+ // Set the program to sample from the green texture. >+ GLint texLoc = glGetUniformLocation(mFragProg, essl1_shaders::Texture2DUniform()); >+ ASSERT_NE(-1, texLoc); >+ >+ glUseProgram(mFragProg); >+ glUniform1i(texLoc, 1); >+ >+ ASSERT_GL_NO_ERROR(); >+ >+ // Create and draw with the pipeline. >+ GLProgramPipeline ppo; >+ glUseProgramStages(ppo, GL_VERTEX_SHADER_BIT, mVertProg); >+ glUseProgramStages(ppo, GL_FRAGMENT_SHADER_BIT, mFragProg); >+ glBindProgramPipeline(ppo); >+ >+ ASSERT_GL_NO_ERROR(); >+ >+ drawQuadWithPPO(essl1_shaders::PositionAttrib(), 0.5f, 1.0f); >+ ASSERT_GL_NO_ERROR(); >+ >+ // We should have sampled from the second texture bound to unit 1. >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); >+} >+ > // Test that a shader IO block varying with separable program links > // successfully. > TEST_P(ProgramPipelineTest31, VaryingIOBlockSeparableProgram) >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp >index 02b03925c592d6d267e4a18d3d594db4c6ceea96..4993888dcb2550ea5e419ef6362f0abc581aca79 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/ProvokingVertexTest.cpp >@@ -202,6 +202,55 @@ TEST_P(ProvokingVertexTest, FlatLine) > EXPECT_EQ(vertexData[1], pixelValue[0]); > } > >+// Test drawing a simple line with flat shading, and different valued vertices. >+TEST_P(ProvokingVertexTest, FlatLineWithFirstIndex) >+{ >+ // http://anglebug.com/4092 >+ ANGLE_SKIP_TEST_IF((IsWindows() || IsLinux()) && IsVulkan()); >+ GLfloat halfPixel = 1.0f / static_cast<GLfloat>(getWindowWidth()); >+ >+ GLint vertexData[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2}; >+ GLfloat positionData[] = {0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ 0, >+ -1.0f + halfPixel, >+ -1.0f, >+ -1.0f + halfPixel, >+ 1.0f}; >+ >+ glVertexAttribIPointer(mIntAttribLocation, 1, GL_INT, 0, vertexData); >+ >+ GLint positionLocation = glGetAttribLocation(mProgram, "position"); >+ glEnableVertexAttribArray(positionLocation); >+ glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, positionData); >+ >+ glUseProgram(mProgram); >+ glDrawArrays(GL_LINES, 10, 2); >+ >+ GLint pixelValue[4] = {0}; >+ glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, &pixelValue); >+ >+ ASSERT_GL_NO_ERROR(); >+ EXPECT_EQ(vertexData[11], pixelValue[0]); >+} >+ > // Test drawing a simple triangle strip with flat shading, and different valued vertices. > TEST_P(ProvokingVertexTest, FlatTriStrip) > { >@@ -344,6 +393,6 @@ TEST_P(ProvokingVertexTest, ANGLEProvokingVertex) > } > > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProvokingVertexTest); >-ANGLE_INSTANTIATE_TEST(ProvokingVertexTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); >+ANGLE_INSTANTIATE_TEST(ProvokingVertexTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_METAL()); > > } // anonymous namespace >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp >index 65437ee05d31799b59c5532b436363bc615568c4..0dfbef37e8dc74d3155761d41b593320288ddb61 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/RobustBufferAccessBehaviorTest.cpp >@@ -10,6 +10,7 @@ > #include "test_utils/ANGLETest.h" > #include "test_utils/gl_raii.h" > #include "util/EGLWindow.h" >+#include "util/OSWindow.h" > > #include <array> > >@@ -21,30 +22,66 @@ namespace > class RobustBufferAccessBehaviorTest : public ANGLETest > { > protected: >- RobustBufferAccessBehaviorTest() : mProgram(0), mTestAttrib(-1) >+ RobustBufferAccessBehaviorTest() > { > setWindowWidth(128); > setWindowHeight(128); >- setConfigRedBits(8); >- setConfigGreenBits(8); >- setConfigBlueBits(8); >- setConfigAlphaBits(8); >- >- // Test flakiness was noticed when reusing displays. >- forceNewDisplay(); > } > >- void testTearDown() override { glDeleteProgram(mProgram); } >+ void testTearDown() override >+ { >+ glDeleteProgram(mProgram); >+ EGLWindow::Delete(&mEGLWindow); >+ OSWindow::Delete(&mOSWindow); >+ } > > bool initExtension() > { >- EGLWindow *window = getEGLWindow(); >- EGLDisplay display = window->getDisplay(); >+ mOSWindow = OSWindow::New(); >+ if (!mOSWindow->initialize("RobustBufferAccessBehaviorTest", getWindowWidth(), >+ getWindowHeight())) >+ { >+ return false; >+ } >+ >+ Library *driverLib = ANGLETestEnvironment::GetDriverLibrary(GLESDriverType::AngleEGL); >+ >+ mEGLWindow = EGLWindow::New(GetParam().majorVersion, GetParam().minorVersion); >+ if (!mEGLWindow->initializeDisplay(mOSWindow, driverLib, GLESDriverType::AngleEGL, >+ GetParam().eglParameters)) >+ { >+ return false; >+ } >+ >+ EGLDisplay display = mEGLWindow->getDisplay(); > if (!IsEGLDisplayExtensionEnabled(display, "EGL_EXT_create_context_robustness")) > { > return false; > } >- setRobustAccess(true); >+ >+ ConfigParameters configParams; >+ configParams.redBits = 8; >+ configParams.greenBits = 8; >+ configParams.blueBits = 8; >+ configParams.alphaBits = 8; >+ configParams.robustAccess = true; >+ >+ if (mEGLWindow->initializeSurface(mOSWindow, driverLib, configParams) != >+ GLWindowResult::NoError) >+ { >+ return false; >+ } >+ >+ if (!mEGLWindow->initializeContext()) >+ { >+ return false; >+ } >+ >+ if (!mEGLWindow->makeCurrent()) >+ { >+ return false; >+ } >+ > if (!IsGLExtensionEnabled("GL_KHR_robust_buffer_access_behavior")) > { > return false; >@@ -138,8 +175,10 @@ class RobustBufferAccessBehaviorTest : public ANGLETest > } > } > >- GLuint mProgram; >- GLint mTestAttrib; >+ OSWindow *mOSWindow = nullptr; >+ EGLWindow *mEGLWindow = nullptr; >+ GLuint mProgram = 0; >+ GLint mTestAttrib = 0; > }; > > // Test that static draw with out-of-bounds reads will not read outside of the data store of the >@@ -147,9 +186,6 @@ class RobustBufferAccessBehaviorTest : public ANGLETest > // GL_KHR_robust_buffer_access_behavior is supported. > TEST_P(RobustBufferAccessBehaviorTest, DrawElementsIndexOutOfRangeWithStaticDraw) > { >- // Failing on NV after changing shard count of angle_end2end_tests. http://anglebug.com/2799 >- ANGLE_SKIP_TEST_IF(IsNVIDIA() && IsWindows() && IsOpenGL()); >- > ANGLE_SKIP_TEST_IF(!initExtension()); > > runIndexOutOfRangeTests(GL_STATIC_DRAW); >@@ -160,7 +196,6 @@ TEST_P(RobustBufferAccessBehaviorTest, DrawElementsIndexOutOfRangeWithStaticDraw > // GL_KHR_robust_buffer_access_behavior is supported. > TEST_P(RobustBufferAccessBehaviorTest, DrawElementsIndexOutOfRangeWithDynamicDraw) > { >- ANGLE_SKIP_TEST_IF(IsNVIDIA() && IsWindows() && IsOpenGL()); > ANGLE_SKIP_TEST_IF(!initExtension()); > > runIndexOutOfRangeTests(GL_DYNAMIC_DRAW); >@@ -300,10 +335,6 @@ TEST_P(RobustBufferAccessBehaviorTest, VeryLargeVertexCountWithDynamicVertexData > // Test that robust access works even if there's no data uploaded to the vertex buffer at all. > TEST_P(RobustBufferAccessBehaviorTest, NoBufferData) > { >- // http://crbug.com/889303: Possible driver bug on NVIDIA Shield TV. >- // http://anglebug.com/2861: Fails abnormally on Android >- ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES()); >- > ANGLE_SKIP_TEST_IF(!initExtension()); > ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red()); > glUseProgram(program); >@@ -430,12 +461,6 @@ TEST_P(RobustBufferAccessBehaviorTest, EmptyBuffer) > { > ANGLE_SKIP_TEST_IF(!initExtension()); > >- // AMD GL does not support robustness. http://anglebug.com/3099 >- ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL()); >- >- // http://anglebug.com/2861: Fails abnormally on Android >- ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGLES()); >- > ANGLE_GL_PROGRAM(program, kWebGLVS, kWebGLFS); > glUseProgram(program); > >@@ -561,6 +586,103 @@ TEST_P(RobustBufferAccessBehaviorTest, DynamicBuffer) > } > } > >-ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31(RobustBufferAccessBehaviorTest); >+// Tests out of bounds read by divisor emulation due to a user-provided offset. >+// Adapted from https://crbug.com/1285885. >+TEST_P(RobustBufferAccessBehaviorTest, IndexOutOfBounds) >+{ >+ ANGLE_SKIP_TEST_IF(!initExtension()); >+ >+ constexpr char kVS[] = R"(precision highp float; >+attribute vec4 a_position; >+void main(void) { >+ gl_Position = a_position; >+})"; >+ >+ constexpr char kFS[] = R"(precision highp float; >+uniform sampler2D oTexture; >+uniform float oColor[3]; >+void main(void) { >+ gl_FragData[0] = texture2DProj(oTexture, vec3(0.1,0.1,0.1)); >+})"; >+ >+ GLfloat singleFloat = 1.0f; >+ >+ GLBuffer buf; >+ glBindBuffer(GL_ARRAY_BUFFER, buf); >+ glBufferData(GL_ARRAY_BUFFER, 4, &singleFloat, GL_STATIC_DRAW); >+ >+ ANGLE_GL_PROGRAM(program, kVS, kFS); >+ glBindAttribLocation(program, 0, "a_position"); >+ glLinkProgram(program); >+ ASSERT_TRUE(CheckLinkStatusAndReturnProgram(program, true)); >+ >+ glEnableVertexAttribArray(0); >+ >+ // Trying to exceed renderer->getMaxVertexAttribDivisor() >+ GLuint constexpr kDivisor = 4096; >+ glVertexAttribDivisor(0, kDivisor); >+ >+ size_t outOfBoundsOffset = 0x50000000; >+ glVertexAttribPointer(0, 1, GL_FLOAT, false, 8, reinterpret_cast<void *>(outOfBoundsOffset)); >+ >+ glUseProgram(program); >+ >+ glDrawArrays(GL_TRIANGLES, 0, 32); >+ >+ // No assertions, just checking for crashes. >+} >+ >+// Similar to the test above but index is first within bounds then goes out of bounds. >+TEST_P(RobustBufferAccessBehaviorTest, IndexGoingOutOfBounds) >+{ >+ ANGLE_SKIP_TEST_IF(!initExtension()); >+ >+ constexpr char kVS[] = R"(precision highp float; >+attribute vec4 a_position; >+void main(void) { >+ gl_Position = a_position; >+})"; >+ >+ constexpr char kFS[] = R"(precision highp float; >+uniform sampler2D oTexture; >+uniform float oColor[3]; >+void main(void) { >+ gl_FragData[0] = texture2DProj(oTexture, vec3(0.1,0.1,0.1)); >+})"; >+ >+ GLBuffer buf; >+ glBindBuffer(GL_ARRAY_BUFFER, buf); >+ std::array<GLfloat, 2> buffer = {{0.2f, 0.2f}}; >+ glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * buffer.size(), buffer.data(), GL_STATIC_DRAW); >+ >+ ANGLE_GL_PROGRAM(program, kVS, kFS); >+ glBindAttribLocation(program, 0, "a_position"); >+ glLinkProgram(program); >+ ASSERT_TRUE(CheckLinkStatusAndReturnProgram(program, true)); >+ >+ glEnableVertexAttribArray(0); >+ >+ // Trying to exceed renderer->getMaxVertexAttribDivisor() >+ GLuint constexpr kDivisor = 4096; >+ glVertexAttribDivisor(0, kDivisor); >+ >+ // 6 bytes remaining in the buffer from offset so only a single vertex can be read >+ glVertexAttribPointer(0, 1, GL_FLOAT, false, 8, reinterpret_cast<void *>(2)); >+ >+ glUseProgram(program); >+ >+ // Each vertex is read `kDivisor` times so the last read goes out of bounds >+ GLsizei instanceCount = kDivisor + 1; >+ glDrawArraysInstanced(GL_TRIANGLES, 0, 32, instanceCount); >+ >+ // No assertions, just checking for crashes. >+} >+ >+ANGLE_INSTANTIATE_TEST(RobustBufferAccessBehaviorTest, >+ WithNoFixture(ES3_VULKAN()), >+ WithNoFixture(ES3_OPENGL()), >+ WithNoFixture(ES3_OPENGLES()), >+ WithNoFixture(ES3_D3D11()), >+ WithNoFixture(ES3_METAL())); > > } // namespace >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp >index 067fbaabecb30634fb5084d6d8ac2900a9b11add..8732e016406541516d8ddd16cff4aebf9a54d761 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/StateChangeTest.cpp >@@ -7510,6 +7510,98 @@ TEST_P(VertexAttribArrayStateChangeTest, Basic) > glBindBuffer(GL_ARRAY_BUFFER, 0); > } > >+TEST_P(SimpleStateChangeTestES3, DepthOnlyToColorAttachmentPreservesBlendState) >+{ >+ >+ constexpr char kVS[] = R"(precision highp float; >+attribute vec4 position; >+attribute vec4 color; >+varying vec4 colorOut; >+ >+void main() >+{ >+ gl_Position = position; >+ colorOut = color; >+})"; >+ >+ constexpr char kFS[] = R"(precision highp float; >+varying vec4 colorOut; >+ >+void main() >+{ >+ gl_FragColor = colorOut; >+})"; >+ >+ ANGLE_GL_PROGRAM(program, kVS, kFS); >+ >+ GLint posAttribLocation = glGetAttribLocation(program, "position"); >+ ASSERT_NE(-1, posAttribLocation); >+ GLint colorAttribLocation = glGetAttribLocation(program, "color"); >+ ASSERT_NE(-1, colorAttribLocation); >+ >+ GLBuffer vertexBuffer; >+ GLTexture texture; >+ GLFramebuffer framebuffer; >+ GLRenderbuffer depthRenderbuffer; >+ GLFramebuffer depthFramebuffer; >+ >+ glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); >+ >+ const float posAttribData[] = { >+ -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, >+ }; >+ glBufferData(GL_ARRAY_BUFFER, sizeof(posAttribData), posAttribData, GL_STATIC_DRAW); >+ >+ glBindBuffer(GL_ARRAY_BUFFER, 0); >+ >+ constexpr int kWidth = 1; >+ constexpr int kHeight = 1; >+ >+ glBindTexture(GL_TEXTURE_2D, texture); >+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); >+ glBindTexture(GL_TEXTURE_2D, 0); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); >+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); >+ glBindFramebuffer(GL_FRAMEBUFFER, 0); >+ >+ glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); >+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, kWidth, kHeight); >+ glBindRenderbuffer(GL_RENDERBUFFER, 0); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, depthFramebuffer); >+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, >+ depthRenderbuffer); >+ glBindFramebuffer(GL_FRAMEBUFFER, 0); >+ >+ glDisable(GL_DEPTH_TEST); >+ glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); >+ glVertexAttribPointer(posAttribLocation, 2, GL_FLOAT, GL_FALSE, 0, 0); >+ glEnableVertexAttribArray(posAttribLocation); >+ glDisableVertexAttribArray(colorAttribLocation); >+ glVertexAttrib4f(colorAttribLocation, 1.0f, 0.0f, 0.0f, 1.0f); >+ >+ glUseProgram(program); >+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); >+ glEnable(GL_BLEND); >+ glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE); >+ glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); >+ glClearColor(0.0f, 1.0f, 0.0f, 1.0f); >+ glClear(GL_COLOR_BUFFER_BIT); >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, depthFramebuffer); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ >+ glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); >+ glDrawArrays(GL_TRIANGLES, 0, 6); >+ EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow); >+ >+ glBindBuffer(GL_ARRAY_BUFFER, 0); >+ glBindFramebuffer(GL_FRAMEBUFFER, 0); >+ glUseProgram(0); >+} >+ > } // anonymous namespace > > ANGLE_INSTANTIATE_TEST_ES2(StateChangeTest); >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp >index 80c346a10961dfe71a91fd857c9c2f88d84e8979..9ab716587eed3880e83a662b9ffac1fd0c2fd05b 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TextureTest.cpp >@@ -468,6 +468,12 @@ class Texture2DTestES3 : public Texture2DTest > } > }; > >+class Texture2DTestES3RobustInit : public Texture2DTestES3 >+{ >+ protected: >+ Texture2DTestES3RobustInit() : Texture2DTestES3() { setRobustResourceInit(true); } >+}; >+ > class Texture2DBaseMaxTestES3 : public ANGLETest > { > protected: >@@ -1038,31 +1044,37 @@ class SamplerArrayAsFunctionParameterTest : public SamplerArrayTest > class Texture2DArrayTestES3 : public TexCoordDrawTest > { > protected: >- Texture2DArrayTestES3() : TexCoordDrawTest(), m2DArrayTexture(0), mTextureArrayLocation(-1) {} >+ Texture2DArrayTestES3() >+ : TexCoordDrawTest(), >+ m2DArrayTexture(0), >+ mTextureArrayLocation(-1), >+ mTextureArraySliceUniformLocation(-1) >+ {} > > const char *getVertexShaderSource() override > { >- return "#version 300 es\n" >- "out vec2 texcoord;\n" >- "in vec4 position;\n" >- "void main()\n" >- "{\n" >- " gl_Position = vec4(position.xy, 0.0, 1.0);\n" >- " texcoord = (position.xy * 0.5) + 0.5;\n" >- "}\n"; >+ return R"(#version 300 es >+out vec2 texcoord; >+in vec4 position; >+void main() >+{ >+ gl_Position = vec4(position.xy, 0.0, 1.0); >+ texcoord = (position.xy * 0.5) + 0.5; >+})"; > } > > const char *getFragmentShaderSource() override > { >- return "#version 300 es\n" >- "precision highp float;\n" >- "uniform highp sampler2DArray tex2DArray;\n" >- "in vec2 texcoord;\n" >- "out vec4 fragColor;\n" >- "void main()\n" >- "{\n" >- " fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.y, 0.0));\n" >- "}\n"; >+ return R"(#version 300 es >+precision highp float; >+uniform highp sampler2DArray tex2DArray; >+uniform int slice; >+in vec2 texcoord; >+out vec4 fragColor; >+void main() >+{ >+ fragColor = texture(tex2DArray, vec3(texcoord, float(slice))); >+})"; > } > > void testSetUp() override >@@ -1074,6 +1086,9 @@ class Texture2DArrayTestES3 : public TexCoordDrawTest > mTextureArrayLocation = glGetUniformLocation(mProgram, "tex2DArray"); > ASSERT_NE(-1, mTextureArrayLocation); > >+ mTextureArraySliceUniformLocation = glGetUniformLocation(mProgram, "slice"); >+ ASSERT_NE(-1, mTextureArraySliceUniformLocation); >+ > glGenTextures(1, &m2DArrayTexture); > ASSERT_GL_NO_ERROR(); > } >@@ -1086,6 +1101,7 @@ class Texture2DArrayTestES3 : public TexCoordDrawTest > > GLuint m2DArrayTexture; > GLint mTextureArrayLocation; >+ GLint mTextureArraySliceUniformLocation; > }; > > class TextureSizeTextureArrayTest : public TexCoordDrawTest >@@ -1728,28 +1744,28 @@ class Texture2DArrayIntegerTestES3 : public Texture2DArrayTestES3 > > const char *getVertexShaderSource() override > { >- return "#version 300 es\n" >- "out vec2 texcoord;\n" >- "in vec4 position;\n" >- "void main()\n" >- "{\n" >- " gl_Position = vec4(position.xy, 0.0, 1.0);\n" >- " texcoord = (position.xy * 0.5) + 0.5;\n" >- "}\n"; >+ return R"(#version 300 es >+out vec2 texcoord; >+in vec4 position; >+void main() >+{ >+ gl_Position = vec4(position.xy, 0.0, 1.0); >+ texcoord = (position.xy * 0.5) + 0.5; >+})"; > } > > const char *getFragmentShaderSource() override > { >- return "#version 300 es\n" >- "precision highp float;\n" >- "uniform highp usampler2DArray tex2DArray;\n" >- "in vec2 texcoord;\n" >- "out vec4 fragColor;\n" >- "void main()\n" >- "{\n" >- " fragColor = vec4(texture(tex2DArray, vec3(texcoord.x, texcoord.y, " >- "0.0)))/255.0;\n" >- "}\n"; >+ return R"(#version 300 es >+precision highp float; >+uniform highp usampler2DArray tex2DArray; >+uniform int slice; >+in vec2 texcoord; >+out vec4 fragColor; >+void main() >+{ >+ fragColor = vec4(texture(tex2DArray, vec3(texcoord, slice)))/255.0; >+})"; > } > }; > >@@ -5161,6 +5177,94 @@ TEST_P(Texture2DArrayTestES3, DrawWithLevelsOutsideRangeWithInconsistentDimensio > EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::cyan); > } > >+// Create a 2D array, then immediately redefine it to have fewer layers. Regression test for a bug >+// in the Vulkan backend where the old higher-layer-count data upload was not removed. >+TEST_P(Texture2DArrayTestES3, TextureArrayRedefineThenUse) >+{ >+ int px = getWindowWidth() / 2; >+ int py = getWindowHeight() / 2; >+ >+ glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture); >+ >+ // Fill the whole texture with red, then redefine it and fill with green >+ std::vector<GLColor> pixelsRed(2 * 2 * 4, GLColor::red); >+ std::vector<GLColor> pixelsGreen(2 * 2 * 2, GLColor::green); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsRed.data()); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsGreen.data()); >+ >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ EXPECT_GL_NO_ERROR(); >+ >+ glUseProgram(mProgram); >+ EXPECT_GL_NO_ERROR(); >+ >+ // Draw the first slice >+ glUniform1i(mTextureArraySliceUniformLocation, 0); >+ drawQuad(mProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+ >+ // Draw the second slice >+ glUniform1i(mTextureArraySliceUniformLocation, 1); >+ drawQuad(mProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+} >+ >+// Create a 2D array, use it, then redefine it to have fewer layers. Regression test for a bug in >+// the Vulkan backend where the old higher-layer-count data upload was not removed. >+TEST_P(Texture2DArrayTestES3, TextureArrayUseThenRedefineThenUse) >+{ >+ int px = getWindowWidth() / 2; >+ int py = getWindowHeight() / 2; >+ >+ glBindTexture(GL_TEXTURE_2D_ARRAY, m2DArrayTexture); >+ >+ // Fill the whole texture with red. >+ std::vector<GLColor> pixelsRed(2 * 2 * 4, GLColor::red); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsRed.data()); >+ >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); >+ glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ EXPECT_GL_NO_ERROR(); >+ >+ glUseProgram(mProgram); >+ EXPECT_GL_NO_ERROR(); >+ >+ // Draw the first slice >+ glUniform1i(mTextureArraySliceUniformLocation, 0); >+ drawQuad(mProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); >+ >+ // Draw the fourth slice >+ glUniform1i(mTextureArraySliceUniformLocation, 3); >+ drawQuad(mProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::red); >+ >+ // Redefine the image and fill with green >+ std::vector<GLColor> pixelsGreen(2 * 2 * 2, GLColor::green); >+ glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, >+ pixelsGreen.data()); >+ >+ // Draw the first slice >+ glUniform1i(mTextureArraySliceUniformLocation, 0); >+ drawQuad(mProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+ >+ // Draw the second slice >+ glUniform1i(mTextureArraySliceUniformLocation, 1); >+ drawQuad(mProgram, "position", 0.5f); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_PIXEL_COLOR_EQ(px, py, GLColor::green); >+} >+ > // Test that texture completeness is updated if texture max level changes. > // GLES 3.0.4 section 3.8.13 Texture completeness > TEST_P(Texture2DTestES3, TextureCompletenessChangesWithMaxLevel) >@@ -5942,6 +6046,36 @@ TEST_P(Texture2DTestES3, TextureCOMPRESSEDSRGB8ETC2ImplicitAlpha1) > EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); > } > >+// ETC2 punchthrough alpha formats must be initialized to opaque black when emulated >+// http://anglebug.com/6936 >+TEST_P(Texture2DTestES3RobustInit, TextureCOMPRESSEDRGB8A1ETC2) >+{ >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTexture2D); >+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 1, 1, 0, >+ 8, nullptr); >+ EXPECT_GL_NO_ERROR(); >+ >+ drawQuad(mProgram, "position", 0.5f); >+ >+ EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); >+} >+ >+// ETC2 punchthrough alpha formats must be initialized to opaque black when emulated >+// http://anglebug.com/6936 >+TEST_P(Texture2DTestES3RobustInit, TextureCOMPRESSEDSRGB8A1ETC2) >+{ >+ glActiveTexture(GL_TEXTURE0); >+ glBindTexture(GL_TEXTURE_2D, mTexture2D); >+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 1, 1, 0, >+ 8, nullptr); >+ EXPECT_GL_NO_ERROR(); >+ >+ drawQuad(mProgram, "position", 0.5f); >+ >+ EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); >+} >+ > // Test that compressed textures ignore the pixel unpack state. > // (https://crbug.org/1267496) > TEST_P(Texture2DTestES3, PixelUnpackStateTexImage) >@@ -8754,6 +8888,79 @@ TEST_P(TextureCubeTestES3, SpecifyAndSampleFromBaseLevel1) > EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::white); > } > >+// Test GL_PIXEL_UNPACK_BUFFER with GL_TEXTURE_CUBE_MAP. >+TEST_P(TextureCubeTestES3, CubeMapPixelUnpackBuffer) >+{ >+ // Check http://anglebug.com/2155. >+ ANGLE_SKIP_TEST_IF(IsOSX() && IsNVIDIA()); >+ >+ constexpr char kVS[] = >+ R"(#version 300 es >+ precision mediump float; >+ in vec3 pos; >+ void main() { >+ gl_Position = vec4(pos, 1.0); >+ })"; >+ >+ constexpr char kFS[] = >+ R"(#version 300 es >+ precision mediump float; >+ out vec4 color; >+ uniform samplerCube uTex; >+ void main(){ >+ color = texture(uTex, vec3(1.0)); >+ })"; >+ >+ ANGLE_GL_PROGRAM(program, kVS, kFS); >+ glUseProgram(program); >+ >+ glUniform1i(glGetUniformLocation(program, "uTex"), 0); >+ glActiveTexture(GL_TEXTURE0); >+ >+ GLTexture cubeTex; >+ glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTex); >+ >+ const int kFaceWidth = 4; >+ const int kFaceHeight = 4; >+ >+ uint16_t kHalfFloatOne = 0x3C00; >+ uint16_t kHalfFloatZero = 0; >+ >+ glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_RGBA16F, kFaceWidth, kFaceHeight); >+ struct RGBA16F >+ { >+ uint16_t R, G, B, A; >+ }; >+ RGBA16F redColor = {kHalfFloatOne, kHalfFloatZero, kHalfFloatZero, kHalfFloatOne}; >+ >+ std::vector<RGBA16F> pixels(kFaceWidth * kFaceHeight, redColor); >+ GLBuffer buffer; >+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer.get()); >+ glBufferData(GL_PIXEL_UNPACK_BUFFER, pixels.size() * sizeof(RGBA16F), pixels.data(), >+ GL_DYNAMIC_DRAW); >+ EXPECT_GL_NO_ERROR(); >+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1); >+ >+ for (GLenum faceIndex = 0; faceIndex < 6; faceIndex++) >+ { >+ glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, 0, 0, 0, kFaceWidth, >+ kFaceHeight, GL_RGBA, GL_HALF_FLOAT, 0); >+ EXPECT_GL_NO_ERROR(); >+ } >+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); >+ >+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); >+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); >+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_REPEAT); >+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_REPEAT); >+ glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_REPEAT); >+ >+ drawQuad(program, "pos", 0.5f, 1.0f, true); >+ ASSERT_GL_NO_ERROR(); >+ >+ EXPECT_PIXEL_COLOR_EQ(0, 0, angle::GLColor::red); >+} >+ > // Verify that using negative texture base level and max level generates GL_INVALID_VALUE. > TEST_P(Texture2DTestES3, NegativeTextureBaseLevelAndMaxLevel) > { >@@ -10266,6 +10473,9 @@ ANGLE_INSTANTIATE_TEST_ES2(SamplerArrayAsFunctionParameterTest); > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES3); > ANGLE_INSTANTIATE_TEST_ES3_AND(Texture2DTestES3, WithAllocateNonZeroMemory(ES3_VULKAN())); > >+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES3RobustInit); >+ANGLE_INSTANTIATE_TEST_ES3(Texture2DTestES3RobustInit); >+ > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DTestES31PPO); > ANGLE_INSTANTIATE_TEST_ES31(Texture2DTestES31PPO); > >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp >index c93cd02406390471f24005b61c7cf3e4703700a9..5fa8639a05730ffa191678906c2c8f1b39da2880 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/TransformFeedbackTest.cpp >@@ -3902,6 +3902,82 @@ void main() > EXPECT_GL_NO_ERROR(); > } > >+TEST_P(TransformFeedbackTest, TransformFeedbackPausedDrawThenResume) >+{ >+ constexpr char kVS[] = R"(#version 300 es >+layout(location = 0) in float a; >+out float b; >+ >+void main (void) >+{ >+ b = a * 2.0; >+} >+)"; >+ >+ constexpr char kFS[] = R"(#version 300 es >+void main (void) >+{ >+} >+)"; >+ >+ const std::vector<std::string> tfVaryings = {"b"}; >+ ANGLE_GL_PROGRAM_TRANSFORM_FEEDBACK(program, kVS, kFS, tfVaryings, GL_INTERLEAVED_ATTRIBS); >+ glUseProgram(program); >+ >+ GLBuffer xfbBuf; >+ GLTransformFeedback tf; >+ GLQuery query; >+ >+ glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tf); >+ glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, xfbBuf); >+ >+ constexpr size_t maxResults = 10; >+ std::vector<float> clearData(10, 100.0); >+ glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, maxResults * 4, clearData.data(), GL_DYNAMIC_READ); >+ glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, xfbBuf); >+ >+ GLBuffer srcBuffer; >+ glBindBuffer(GL_ARRAY_BUFFER, srcBuffer); >+ constexpr float srcData[] = { >+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, >+ }; >+ glBufferData(GL_ARRAY_BUFFER, sizeof(srcData), srcData, GL_STATIC_DRAW); >+ glEnableVertexAttribArray(0); >+ glVertexAttribPointer(0, 1, GL_FLOAT, false, 4, nullptr); >+ >+ // this is just so inside angle less state is updated so we can compare >+ // the next 2 draw calls easier. >+ glDrawArrays(GL_TRIANGLES, 0, 1); >+ >+ glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query); >+ glBeginTransformFeedback(GL_TRIANGLES); >+ glDrawArrays(GL_TRIANGLES, 0, 7); // 2 triangles >+ glDrawArrays(GL_TRIANGLES, 7, 4); // 1 triangle >+ glEndTransformFeedback(); >+ glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN); >+ GLuint primitivesWritten = 0u; >+ glGetQueryObjectuiv(query, GL_QUERY_RESULT_EXT, &primitivesWritten); >+ EXPECT_GL_NO_ERROR(); >+ EXPECT_EQ(primitivesWritten, 3u); >+ >+ void *resultBuffer = >+ glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, maxResults * 4, GL_MAP_READ_BIT); >+ const float *actual = reinterpret_cast<const float *>(resultBuffer); >+ constexpr float expected[] = { >+ 22, 24, 26, 28, 30, 32, // from first draw, 2 triangles >+ 36, 38, 40, // from second draw, 1 triangle >+ 100, // initial value >+ }; >+ >+ for (size_t i = 0; i < ArraySize(expected); ++i) >+ { >+ EXPECT_EQ(actual[i], expected[i]) << "i:" << i; >+ } >+ >+ glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER); >+ EXPECT_GL_NO_ERROR(); >+} >+ > GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TransformFeedbackTest); > ANGLE_INSTANTIATE_TEST_ES3(TransformFeedbackTest); > >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp >index 4f130c53a0bb2aaf38d2135665e75f3bd406428b..f0418f6c1ea24c0a42d177a0b3ff5e7877dbb0e4 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanPerformanceCounterTest.cpp >@@ -821,6 +821,9 @@ TEST_P(VulkanPerformanceCounterTest, InvalidateDraw) > // - Scenario: invalidate, draw, disable > TEST_P(VulkanPerformanceCounterTest, InvalidateDrawDisable) > { >+ // http://anglebug.com/6857 >+ ANGLE_SKIP_TEST_IF(IsLinux() && IsAMD() && IsVulkan()); >+ > const rx::vk::PerfCounters &counters = hackANGLE(); > rx::vk::PerfCounters expected; > >diff --git a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp >index a43c69baf3295a3fce6a3574cd2d2533cbf75529..294cd1881daddc434c9b284b25dcb8f40d6c9871 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/gl_tests/VulkanUniformUpdatesTest.cpp >@@ -77,14 +77,6 @@ class VulkanUniformUpdatesTest : public ANGLETest > kMaxSetsMultiplierForTesting); > } > >- static constexpr size_t kTextureStagingBufferSizeForTesting = 128; >- >- void limitTextureStagingBufferSize(GLuint texture) >- { >- rx::TextureVk *textureVk = hackTexture(texture); >- textureVk->overrideStagingBufferSizeForTesting(kTextureStagingBufferSizeForTesting); >- } >- > private: > EGLContext mLastContext; > uint32_t mMaxSetsPerPool; >@@ -416,7 +408,6 @@ TEST_P(VulkanUniformUpdatesTest, TextureStagingBufferRecycling) > > GLTexture tex; > glBindTexture(GL_TEXTURE_2D, tex); >- limitTextureStagingBufferSize(tex); > glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, getWindowWidth(), getWindowHeight(), 0, GL_RGBA, > GL_UNSIGNED_BYTE, nullptr); > glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); >diff --git a/Source/ThirdParty/ANGLE/src/tests/perf_tests/ANGLEPerfTest.cpp b/Source/ThirdParty/ANGLE/src/tests/perf_tests/ANGLEPerfTest.cpp >index bd4ce7846c11dbdc329b74214b823c0dde0f3580..8ae575421078f0f197607daeb7c4ca601926cf23 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/perf_tests/ANGLEPerfTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/perf_tests/ANGLEPerfTest.cpp >@@ -799,6 +799,11 @@ void ANGLERenderTest::SetUp() > > initializeBenchmark(); > >+ if (mSkipTest) >+ { >+ return; >+ } >+ > if (mTestParams.iterationsPerStep == 0) > { > mSkipTest = true; >diff --git a/Source/ThirdParty/ANGLE/src/tests/perf_tests/LinkProgramPerfTest.cpp b/Source/ThirdParty/ANGLE/src/tests/perf_tests/LinkProgramPerfTest.cpp >index 90503eca4824c32be54ada33d1e845b9ed3ea2a7..cb2eae0602fb65c0013066f033879eb4c967cf1d 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/perf_tests/LinkProgramPerfTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/perf_tests/LinkProgramPerfTest.cpp >@@ -108,7 +108,15 @@ LinkProgramBenchmark::LinkProgramBenchmark() : ANGLERenderTest("LinkProgram", Ge > > void LinkProgramBenchmark::initializeBenchmark() > { >- if (GetParam().threadOption == ThreadOption::SingleThread) >+ if (GetParam().threadOption != ThreadOption::SingleThread && >+ !IsGLExtensionEnabled("GL_KHR_parallel_shader_compile")) >+ { >+ mSkipTest = true; >+ return; >+ } >+ >+ if (IsGLExtensionEnabled("GL_KHR_parallel_shader_compile") && >+ GetParam().threadOption == ThreadOption::SingleThread) > { > glMaxShaderCompilerThreadsKHR(0); > } >diff --git a/Source/ThirdParty/ANGLE/src/tests/perf_tests/TracePerfTest.cpp b/Source/ThirdParty/ANGLE/src/tests/perf_tests/TracePerfTest.cpp >index 3110d43cfcd8fbe5469f504152e4db66c18e987d..6d10a9dc749baa2e6ceb4fd320f254c3fd143e65 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/perf_tests/TracePerfTest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/perf_tests/TracePerfTest.cpp >@@ -11,6 +11,7 @@ > #include "common/PackedEnums.h" > #include "common/string_utils.h" > #include "common/system_utils.h" >+#include "restricted_traces/restricted_traces_export.h" > #include "tests/perf_tests/ANGLEPerfTest.h" > #include "tests/perf_tests/ANGLEPerfTestArgs.h" > #include "tests/perf_tests/DrawCallPerfParams.h" >@@ -19,8 +20,6 @@ > #include "util/png_utils.h" > #include "util/test_utils.h" > >-#include "restricted_traces/restricted_traces_autogen.h" >- > #include <rapidjson/document.h> > #include <rapidjson/istreamwrapper.h> > >@@ -1157,6 +1156,15 @@ TracePerfTest::TracePerfTest(const TracePerfParams ¶ms) > addExtensionPrerequisite("GL_KHR_texture_compression_astc_ldr"); > } > >+ if (traceNameIs("pubg_mobile_launch")) >+ { >+ // http://anglebug.com/6850 - Crashing in Nvidia GLES driver. >+ if (IsLinux() && IsNVIDIA() && mParams.driver != GLESDriverType::AngleEGL) >+ { >+ mSkipTest = true; >+ } >+ } >+ > ASSERT(mParams.surfaceType == SurfaceType::Window || gEnableAllTraceTests); > ASSERT(mParams.eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE || > gEnableAllTraceTests); >@@ -1936,15 +1944,17 @@ void RegisterTraceTests() > } > > // Load JSON data. >- std::stringstream tracesJsonStream; >- tracesJsonStream << rootTracePath << GetPathSeparator() << "restricted_traces.json"; >- std::string tracesJsonPath = tracesJsonStream.str(); >- > std::vector<std::string> traces; >- if (!LoadTraceNamesFromJSON(tracesJsonPath, &traces)) > { >- ERR() << "Unable to load traces from JSON file: " << tracesJsonPath; >- return; >+ std::stringstream tracesJsonStream; >+ tracesJsonStream << rootTracePath << GetPathSeparator() << "restricted_traces.json"; >+ std::string tracesJsonPath = tracesJsonStream.str(); >+ >+ if (!LoadTraceNamesFromJSON(tracesJsonPath, &traces)) >+ { >+ ERR() << "Unable to load traces from JSON file: " << tracesJsonPath; >+ return; >+ } > } > > std::vector<TraceInfo> traceInfos; >@@ -1958,9 +1968,8 @@ void RegisterTraceTests() > TraceInfo traceInfo = {}; > if (!LoadTraceInfoFromJSON(trace, traceJsonPath, &traceInfo)) > { >- static_assert(sizeof(TraceInfo) == sizeof(trace_angle::TraceInfo), "Size mismatch"); >- trace_angle::TraceInfo autogenFormatInfo = trace_angle::GetTraceInfo(trace.c_str()); >- memcpy(&traceInfo, &autogenFormatInfo, sizeof(TraceInfo)); >+ ERR() << "Unable to load traced data from JSON file: " << traceJsonPath; >+ return; > } > > traceInfos.push_back(traceInfo); >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/.gitignore b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/.gitignore >index 147767ed5c5f35c317de6c0de69a79925d830774..355164c126511e7d9f9896171414647f098dd30e 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/.gitignore >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/.gitignore >@@ -1,113 +1 @@ >-aliexpress/ >-among_us/ >-angry_birds_2_1500/ >-arena_of_valor/ >-asphalt_8/ >-asphalt_9/ >-avakin_life/ >-aztec_ruins/ >-badland/ >-beach_buggy_racing/ >-blockman_go/ >-brawl_stars/ >-bricks_breaker_quest/ >-bubble_shooter/ >-bus_simulator_indonesia/ >-call_break_offline_card_game/ >-candy_crush_500/ >-candy_crush_soda_saga/ >-car_parking_multiplayer/ >-clash_of_clans/ >-clash_royale/ >-cod_mobile/ >-coin_master/ >-command_and_conquer_rivals/ >-cookie_run_kingdom/ >-disney_tsum_tsum/ >-dota_underlords/ >-dr_driving/ >-dragon_ball_legends/ >-dragon_raja/ >-efootball_pes_2021/ >-egypt_1500/ >-eight_ball_pool/ >-extreme_car_driving_simulator/ >-fallout_shelter_online/ >-farm_heroes_saga/ >-fate_grand_order/ >-fifa_mobile/ >-final_fantasy/ >-free_fire/ >-gardenscapes/ >-genshin_impact/ >-google_maps/ >-happy_color/ >-hay_day/ >-hearthstone/ >-higgs_domino_island/ >-hill_climb_racing/ >-homescapes/ >-idle_heroes/ >-junes_journey/ >-kartrider_rush/ >-klondike_adventures/ >-league_of_legends_wild_rift/ >-lego_legacy/ >-lineage_m/ >-ludo_king/ >-magic_tiles_3/ >-manhattan_10/ >-manhattan_31/ >-mario_kart_tour/ >-marvel_contest_of_champions/ >-messenger_lite/ >-minecraft/ >-mini_world/ >-mobile_legends/ >-my_talking_tom2/ >-my_talking_tom_friends/ >-nba2k20_800/ >-nier_reincarnation/ >-one_punch_man/ >-plants_vs_zombies_2/ >-pokemon_go/ >-pokemon_unite/ >-professional_baseball_spirits/ >-pubg_mobile_battle_royale/ >-pubg_mobile_lite/ >-pubg_mobile_skydive/ >-ragnarok_m_eternal_love/ >-raid_shadow_legends/ >-real_commando_secret_mission/ >-real_cricket_20/ >-real_gangster_crime/ >-rise_of_kingdoms/ >-romancing_saga/ >-rope_hero_vice_town/ >-saint_seiya_awakening/ >-sakura_school_simulator/ >-scrabble_go/ >-shadow_fight_2/ >-slingshot_test1/ >-slingshot_test2/ >-sniper_3d/ >-sonic_the_hedgehog/ >-standoff_2/ >-subway_princess_runner/ >-subway_surfers/ >-summoners_war/ >-talking_tom_hero_dash/ >-temple_run_2/ >-temple_run_300/ >-toon_blast/ >-township/ >-trex_200/ >-whatsapp/ >-words_with_friends_2/ >-wordscapes/ >-world_cricket_championship_2/ >-world_of_kings/ >-world_of_tanks_blitz/ >-world_war_doh/ >-worms_zone_io/ >-zillow/ >\ No newline at end of file >+*/ >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/BUILD.gn b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/BUILD.gn >index 6f4fad2e6903af21c5fd94aaf45b9f6d5a721268..210d66958a9abe54b5f325124068f062b14c159f 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/BUILD.gn >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/BUILD.gn >@@ -8,7 +8,6 @@ import("../../../gni/angle.gni") > > angle_shared_library("angle_restricted_trace_loader") { > sources = [ >- "restricted_traces_autogen.h", > "restricted_traces_export.h", > "trace_egl_loader_autogen.cpp", > "trace_egl_loader_autogen.h", >@@ -28,45 +27,25 @@ angle_trace_fixture("angle_restricted_trace_fixture") { > public_configs = [ "$angle_root:no_gl_prototypes" ] > } > >-# Imports "angle_restricted_traces" >-import("restricted_traces_autogen.gni") >-_traces = [] >-_trace_headers = [] >- >-foreach(_trace_data, angle_restricted_traces) { >- _trace = _trace_data[0] >- _trace_ctx = _trace_data[1] >- _target = "angle_restricted_trace_${_trace}" >- >- angle_trace(_target) { >- sources = _trace_data[2] >- data = _trace_data[3] >- trace_prefix = _trace_data[4] >- fixture = ":angle_restricted_trace_fixture" >- } >- >- _traces += [ ":${_target}" ] >- _trace_headers += [ ":${_target}_headers" ] >+angle_trace_library("angle_restricted_trace") { >+ json_path = "restricted_traces.json" >+ trace_fixture = ":angle_restricted_trace_fixture" > } > > angle_shared_library("angle_restricted_traces") { > testonly = true > >- sources = [ >- "restricted_traces_autogen.cpp", >- "restricted_traces_autogen.h", >- "restricted_traces_export.h", >- ] >+ sources = [ "restricted_traces_export.h" ] > > data = [ "restricted_traces.json" ] > >- data_deps = _traces >+ data_deps = [ ":angle_restricted_trace" ] > defines = [ "ANGLE_TRACE_IMPLEMENTATION" ] > > deps = [ >- "$angle_root:angle_common", >- "$angle_root/util:angle_util", >- ] + _trace_headers >+ "$angle_root:angle_common", >+ "$angle_root/util:angle_util", >+ ] > > public_deps = [ ":angle_restricted_trace_loader" ] > } >@@ -80,7 +59,10 @@ group("goldctl") { > if (is_win) { > data += [ "//tools/skia_goldctl/win/goldctl.exe" ] > } else if (is_mac) { >- data += [ "//tools/skia_goldctl/mac/goldctl" ] >+ data += [ >+ "//tools/skia_goldctl/mac_amd64/goldctl", >+ "//tools/skia_goldctl/mac_arm64/goldctl", >+ ] > } else { > data += [ "//tools/skia_goldctl/linux/goldctl" ] > } >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/README.md b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/README.md >index 81e6d095484556db04e4997e12fa0e6988f97e9d..1b86a80233d908ed3141292ac8c5e1a7f73b92f5 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/README.md >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/README.md >@@ -223,7 +223,7 @@ adb pull /sdcard/Android/data/$PACKAGE_NAME/angle_capture/. $LABEL/ > The list of traces is tracked in [restricted_traces.json](restricted_traces.json). Manually add your > new trace to this list. Use version "1" for the trace version. > >-You can also use a tool called `jq` to update the list. This ensures we get them in >+On Linux, you can also use a tool called `jq` to update the list. This ensures we get them in > alphabetical order with no duplicates. It can also be done by hand if you are unable to install it, > for some reason. > ``` >@@ -243,12 +243,15 @@ code generation run the following from the angle root folder: > ``` > python ./scripts/run_code_generation.py > ``` >-After this you should be able to `git diff` and see your new trace added to the harness files: >-``` >-TODO: Redo this. http://anglebug.com/5133 >-``` >-Note the absence of the traces themselves listed above. They are automatically .gitignored since >-they won't be checked in directly to the repo. >+After this you should be able to `git diff` and see changes in the following files: >+ >+ * `DEPS` >+ * `scripts/code_generation_hashes/restricted_traces.json` >+ * `src/tests/restricted_traces/restricted_traces.json` (this is the file you originally modified) >+ >+Note the absence of the traces themselves listed above. They are automatically >+ignored by [`.gitignore`](.gitignore) since they won't be checked in directly >+to the repo. > > ## Upload your trace to CIPD > >@@ -426,4 +429,87 @@ trace upgrade! > > # Diagnosing and fixing tracer errors > >-TODO: http://anglebug.com/5133 >+## Debugging a crash or GLES error >+ >+Ensure you're building ANGLE in Debug. Then look in the retrace script output >+to find the exact command line and environment variables the script uses to >+produce the failure. For example: >+ >+``` >+INFO:root:ANGLE_CAPTURE_LABEL=trex_200 ANGLE_CAPTURE_OUT_DIR=C:\src\angle\retrace-wip\trex_200 ANGLE_CAPTURE_FRAME_START=2 ANGLE_CAPTURE_FRAME_END=4 ANGLE_CAPTURE_VALIDATION=1 ANGLE_FEATURE_OVERRIDES_ENABLED=allocateNonZeroMemory:forceInitShaderVariables ANGLE_CAPTURE_TRIM_ENABLED=1 out/Debug\angle_perftests.exe --gtest_filter=TracePerfTest.Run/vulkan_swiftshader_trex_200 --max-steps-performed 3 --retrace-mode --enable-all-trace-tests >+``` >+ >+Once you can reproduce the issue you can use a debugger or other standard >+debugging processes to find the root cause and a fix. >+ >+## Debugging a serialization difference >+ >+If you encouter a serialization mismatch in the retrace, you can find the >+complete serialization output by looking in the retrace script output. ANGLE >+saves the complete serialization file contents on any mismatch. You can >+inspect and diff these files in a text editor to help diagnose what objects >+are faulty. >+ >+If the mismatch is with a Buffer or Texture object content, you can manually >+edit the `frame_capture_utils.cpp` file to force some or all of the objects >+to serialize their entire contents. This can help show what kind of pixel or >+data differences might be causing the issue. For example, change this line: >+ >+``` >+json->addBlob("data", dataPtr->data(), dataPtr->size()); >+``` >+ >+to >+ >+``` >+json->addBlobWithMax("data", dataPtr->data(), dataPtr->size(), 1000000); >+``` >+ >+Note: in the future, we might make this option exposed via an envioronment >+variable, or even allow serialization of entire data blocks in text-encoded >+form that could be decoded to separate files. >+ >+If you still can't determine what code might be causing the state difference, >+we can insert finer-grained serialization checkpoints to "bisect" where the >+coding mismatch is happening. It is not possible to force checkpoints after >+every GLES call, because serialization and validation is so prohibitively >+expensive. ANGLE instead has feature in the tracer that allows us to >+precisely control where the tracer inserts and validates the checkpoints, by >+using a boolean expression language. >+ >+The retrace script command `--validation-expr` allows us to specify a C-like >+expression that determines when to add serialization checkpoints. For >+example, we can specify this validation expression: >+ >+``` >+((frame == 2) && (call < 1189) && (call > 1100) && ((call % 5) == 0)) >+``` >+ >+Using this expression will insert a serialization checkpoint in the second >+frame, on every 5th captured call, and when the captured call count is >+between 1101 and 1188. Here the `call` keyword denotes the call counter, >+which resets to 1 every frame, and increments by 1 with every captured GLES >+API call. The `frame` keyword denotes the frame counter, which starts at 1 >+and increments by 1 every captured frame. The expression syntax supports all >+common C boolean operators. >+ >+By finding a starting and ending frame range, and narrowing this range through >+experimentation, you can pinpoint the exact call that triggers the >+serialization mismatch, and then diagnose and fix the root cause. In some >+cases you can use RenderDoc or other frame debugging tools to inspect >+resource states before/after the bad call once you have found it. >+ >+See also: [`http://crrev.com/c/3136094`](http://crrev.com/c/3136094) >+ >+## Debugging a pixel test failure without a serialization mismatch >+ >+Sometimes you manage to complete validation and upload, just to find a golden >+image pixel difference that manifests in some trace configurations. These >+problems can be harder to root cause. For instance, some configurations may >+render undefined pixels that are in practice well-defined on most GLES >+implementations. >+ >+The pixel differences can also be a product of mismatched state even if the >+trace validation says all states are matched. Because ANGLE's GLES state >+serialization is incomplete, it can help to check the state serialization >+logic and add missing features as necessary. >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/gen_restricted_traces.py b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/gen_restricted_traces.py >index f0c166377227635bfc4589a3331f518a6f60bd8a..bd9587eb13ba89d036315ab1b4b45376ce4bbc38 100755 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/gen_restricted_traces.py >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/gen_restricted_traces.py >@@ -15,134 +15,6 @@ import json > import os > import sys > >-GNI_TEMPLATE = """\ >-# GENERATED FILE - DO NOT EDIT. >-# Generated by {script_name} using data from {data_source_name} >-# >-# Copyright 2020 The ANGLE Project Authors. All rights reserved. >-# Use of this source code is governed by a BSD-style license that can be >-# found in the LICENSE file. >-# >-# A list of all restricted trace tests, paired with their context. >-# Can be consumed by tests/BUILD.gn. >- >-angle_restricted_traces = [ >-{test_list} >-] >-""" >- >-HEADER_TEMPLATE = """\ >-// GENERATED FILE - DO NOT EDIT. >-// Generated by {script_name} using data from {data_source_name} >-// >-// Copyright 2020 The ANGLE Project Authors. All rights reserved. >-// Use of this source code is governed by a BSD-style license that can be >-// found in the LICENSE file. >-// >-// {filename}: Types and enumerations for trace tests. >- >-#ifndef ANGLE_RESTRICTED_TRACES_AUTOGEN_H_ >-#define ANGLE_RESTRICTED_TRACES_AUTOGEN_H_ >- >-#include <cstdint> >-#include <vector> >-#include <KHR/khrplatform.h> >-#include <EGL/egl.h> >- >-#include "restricted_traces_export.h" >- >-namespace trace_angle >-{{ >-using GenericProc = void (*)(); >-using LoadProc = GenericProc(KHRONOS_APIENTRY *)(const char *); >-ANGLE_TRACE_LOADER_EXPORT void LoadEGL(LoadProc loadProc); >-ANGLE_TRACE_LOADER_EXPORT void LoadGLES(LoadProc loadProc); >- >-static constexpr size_t kTraceInfoMaxNameLen = 128; >- >-static constexpr uint32_t kDefaultReplayContextClientMajorVersion = 3; >-static constexpr uint32_t kDefaultReplayContextClientMinorVersion = 1; >-static constexpr uint32_t kDefaultReplayDrawSurfaceColorSpace = EGL_COLORSPACE_LINEAR; >- >-struct TraceInfo >-{{ >- char name[kTraceInfoMaxNameLen]; >- uint32_t contextClientMajorVersion; >- uint32_t contextClientMinorVersion; >- uint32_t frameEnd; >- uint32_t frameStart; >- uint32_t drawSurfaceWidth; >- uint32_t drawSurfaceHeight; >- uint32_t drawSurfaceColorSpace; >- uint32_t displayPlatformType; >- uint32_t displayDeviceType; >- int configRedBits; >- int configBlueBits; >- int configGreenBits; >- int configAlphaBits; >- int configDepthBits; >- int configStencilBits; >- bool isBinaryDataCompressed; >- bool areClientArraysEnabled; >- bool isBindGeneratesResourcesEnabled; >- bool isWebGLCompatibilityEnabled; >- bool isRobustResourceInitEnabled; >-}}; >- >-ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(const char *traceName); >-}} // namespace trace_angle >- >-#endif // ANGLE_RESTRICTED_TRACES_AUTOGEN_H_ >-""" >- >-SOURCE_TEMPLATE = """\ >-// GENERATED FILE - DO NOT EDIT. >-// Generated by {script_name} using data from {data_source_name} >-// >-// Copyright 2020 The ANGLE Project Authors. All rights reserved. >-// Use of this source code is governed by a BSD-style license that can be >-// found in the LICENSE file. >-// >-// {filename}: Types and enumerations for trace tests. >- >-#include "{filename}.h" >- >-#include "common/PackedEnums.h" >-#include "common/system_utils.h" >- >-{trace_includes} >- >-namespace trace_angle >-{{ >-namespace >-{{ >-constexpr size_t kNumTraces = {num_traces}; >-struct TracePair >-{{ >- const char name[kTraceInfoMaxNameLen]; >- TraceInfo info; >-}}; >-constexpr TracePair kTraceInfos[kNumTraces] = {{ >-{trace_infos} >-}}; >-}} >- >-const TraceInfo &GetTraceInfo(const char *traceName) >-{{ >- // Could be improved using std::lower_bound. >- for (const TracePair &tracePair : kTraceInfos) >- {{ >- if (strncmp(tracePair.name, traceName, kTraceInfoMaxNameLen) == 0) >- {{ >- return tracePair.info; >- }} >- }} >- UNREACHABLE(); >- return kTraceInfos[0].info; >-}} >-}} // namespace trace_angle >-""" >- > CIPD_TRACE_PREFIX = 'angle/traces' > EXPERIMENTAL_CIPD_PREFIX = 'experimental/google.com/%s/angle/traces' > DEPS_PATH = '../../../DEPS' >@@ -172,176 +44,6 @@ def reject_duplicate_keys(pairs): > return found_keys > > >-def load_json_metadata(trace): >- json_file_name = '%s/%s.json' % (trace, trace) >- with open(json_file_name) as f: >- return json.loads(f.read()) >- >- >-# TODO(http://anglebug.com/5878): Revert back to non-autogen'ed file names for the angledata.gz. >-def get_angledata_filename(trace): >- angledata_files = glob.glob('%s/%s*angledata.gz' % (trace, trace)) >- assert len(angledata_files) == 1, "Trace '%s' has %d angledata.gz files" % ( >- trace, len(angledata_files)) >- return angledata_files[0].replace('\\', '/') >- >- >-# TODO(jmadill): Remove the GNI generation. http://anglebug.com/5133 >-def gen_gni(traces, gni_file, format_args): >- test_list = [] >- for trace in traces: >- context = get_context(trace) >- angledata_file = get_angledata_filename(trace) >- txt_file = '%s/%s_capture_context%s_files.txt' % (trace, trace, context) >- if os.path.exists(txt_file): >- with open(txt_file) as f: >- files = f.readlines() >- f.close() >- source_files = ['"%s/%s"' % (trace, file.strip()) for file in files] >- else: >- json_data = load_json_metadata(trace) >- files = json_data["TraceFiles"] >- >- source_files = ['"%s/%s"' % (trace, file.strip()) for file in files] >- data_files = ['"%s"' % angledata_file] >- json_file_name = '%s/%s.json' % (trace, trace) >- if os.path.exists(json_file_name): >- data_files.append('"%s"' % json_file_name) >- >- for prefix_expr in ['%s/%s_capture_context%s', '%s/%s_context%s']: >- prefix = prefix_expr % (trace, trace, context) >- prefix_cpp = '%s.cpp' % prefix >- if os.path.exists(prefix_cpp): >- break >- >- assert os.path.exists(prefix_cpp), '%s does not exist' % prefix_cpp >- >- test_list += [ >- '["%s", %s, [%s], [%s], "%s"]' % >- (trace, context, ','.join(source_files), ','.join(data_files), prefix) >- ] >- >- format_args['test_list'] = ',\n'.join(test_list) >- gni_data = GNI_TEMPLATE.format(**format_args) >- with open(gni_file, "w") as out_file: >- out_file.write(gni_data) >- return True >- >- >-def contains_string(trace, string): >- """Determines if the trace contains a string""" >- for file in os.listdir(trace): >- if fnmatch.fnmatch(file, '*.h'): >- with open(os.path.join(trace, file)) as f: >- if string in f.read(): >- return True >- return False >- >- >-def contains_context_version(trace): >- """Determines if the trace contains the major/minor context version""" >- return contains_string(trace, 'kReplayContextClientMajorVersion') >- >- >-def contains_colorspace(trace): >- """Determines if the trace contains an EGL surface color space""" >- return contains_string(trace, 'kReplayDrawSurfaceColorSpace') >- >- >-# TODO(jmadill): Remove after retrace. http://anglebug.com/5133 >-def json_metadata_exists(trace): >- return os.path.isfile('%s/%s.json' % (trace, trace)) >- >- >-def get_trace_info(trace): >- # Skip getting trace info if we're using JSON metadata. >- # TODO: Remove generated code. http://anglebug.com/5133 >- if json_metadata_exists(trace): >- return '' >- >- # Some traces don't contain major/minor version, so use defaults >- info = [f'"{trace}"'] >- if contains_context_version(trace): >- info += [ >- f'{trace}::kReplayContextClientMajorVersion', >- f'{trace}::kReplayContextClientMinorVersion' >- ] >- else: >- info += [ >- 'kDefaultReplayContextClientMajorVersion', 'kDefaultReplayContextClientMinorVersion' >- ] >- >- info += [ >- f'{trace}::kReplayFrameStart', f'{trace}::kReplayFrameEnd', >- f'{trace}::kReplayDrawSurfaceWidth', f'{trace}::kReplayDrawSurfaceHeight' >- ] >- >- if contains_colorspace(trace): >- info += [f'{trace}::kReplayDrawSurfaceColorSpace'] >- else: >- info += ['kDefaultReplayDrawSurfaceColorSpace'] >- >- # Add placeholder fields to fix an MSVC warning. >- info += ['0'] * 8 >- info += ['false'] * 5 >- >- return ", ".join(info) >- >- >-def get_context(trace): >- """Returns the trace context number.""" >- # TODO(jmadill): Remove the txt scan once migrated. http://anglebug.com/5133 >- # Load up the only header present for each trace >- for file in os.listdir(trace): >- if fnmatch.fnmatch(file, '*.txt'): >- # Strip the extension to isolate the context by scanning >- # for numbers leading up to the last one, i.e.: >- # app_capture_context123_files.txt >- # ^^ >- # start---||---end >- start = len(file) - 11 >- end = start + 1 >- while file[start - 1].isdigit(): >- start -= 1 >- context = file[start:end] >- assert context.isnumeric(), 'Trace context number is not numeric: %s' % context >- return context >- >- expr = re.compile(r'.*_context(\d+).cpp') >- for file in os.listdir(trace): >- m = expr.match(file) >- if m: >- context = m.group(1) >- assert context.isnumeric(), 'Trace context number is not numeric: %s' % context >- return context >- assert False, 'Failed to find context number for %s' % trace >- >- >-def get_header_name(trace): >- return '%s/%s_capture_context%s.h' % (trace, trace, get_context(trace)) >- >- >-def gen_header(header_file, format_args): >- header_data = HEADER_TEMPLATE.format(**format_args) >- with open(header_file, "w") as out_file: >- out_file.write(header_data) >- return True >- >- >-def gen_source(source_file, format_args): >- source_data = SOURCE_TEMPLATE.format(**format_args) >- with open(source_file, "w") as out_file: >- out_file.write(source_data) >- return True >- >- >-def gen_git_ignore(traces): >- ignores = ['%s/' % trace for trace in traces] >- with open('.gitignore', 'w') as out_file: >- out_file.write('\n'.join(sorted(ignores))) >- return True >- >- > def read_json(json_file): > with open(json_file) as map_file: > return json.loads(map_file.read(), object_pairs_hook=reject_duplicate_keys) >@@ -386,9 +88,6 @@ def update_deps(trace_pairs): > > def main(): > json_file = 'restricted_traces.json' >- gni_file = 'restricted_traces_autogen.gni' >- header_file = 'restricted_traces_autogen.h' >- source_file = 'restricted_traces_autogen.cpp' > > json_data = read_json(json_file) > if 'traces' not in json_data: >@@ -402,8 +101,9 @@ def main(): > inputs = [json_file] > > # Note: we do not include DEPS in the list of outputs to simplify the integration. >- # Otherwise we'd continually need to regenerate on any roll. >- outputs = [gni_file, header_file, source_file, '.gitignore'] >+ # Otherwise we'd continually need to regenerate on any roll. We include .gitignore >+ # in the outputs so we have a placeholder value. >+ outputs = ['.gitignore'] > > if sys.argv[1] == 'inputs': > print(','.join(inputs)) >@@ -414,36 +114,6 @@ def main(): > return 1 > return 0 > >- format_args = { >- 'script_name': os.path.basename(__file__), >- 'data_source_name': json_file, >- } >- >- if not gen_gni(traces, gni_file, format_args): >- print('.gni file generation failed.') >- return 1 >- >- trace_infos = ['{"%s", {%s}}' % (trace, get_trace_info(trace)) for trace in traces] >- >- no_json_traces = filter(lambda trace: not json_metadata_exists(trace), traces) >- includes = ['#include "%s"' % get_header_name(trace) for trace in no_json_traces] >- >- format_args['filename'] = 'restricted_traces_autogen' >- format_args['num_traces'] = len(trace_infos) >- format_args['trace_includes'] = '\n'.join(includes) >- format_args['trace_infos'] = ',\n'.join(trace_infos) >- if not gen_header(header_file, format_args): >- print('.h file generation failed.') >- return 1 >- >- if not gen_source(source_file, format_args): >- print('.cpp file generation failed.') >- return 1 >- >- if not gen_git_ignore(traces): >- print('.gitignore file generation failed') >- return 1 >- > if not update_deps(trace_pairs): > print('DEPS file update failed') > return 1 >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces.json b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces.json >index 1a9b1bb2641542c3aaaa0d2a846ff38952fdcb34..acdcc1391d0c1e138e3763fd119211a9d75c6bed 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces.json >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces.json >@@ -8,118 +8,121 @@ > " The number to the right of the trace name is the trace version." > ], > "traces": [ >- "aliexpress 1", >- "among_us 1", >- "angry_birds_2_1500 1", >- "arena_of_valor 1", >- "asphalt_8 1", >- "asphalt_9 1", >- "avakin_life 1", >- "aztec_ruins 1", >- "badland 1", >- "beach_buggy_racing 1", >- "blockman_go 1", >- "brawl_stars 1", >- "bricks_breaker_quest 1", >- "bubble_shooter 1", >- "bus_simulator_indonesia 1", >- "call_break_offline_card_game 1", >- "candy_crush_500 1", >- "candy_crush_soda_saga 1", >- "car_parking_multiplayer 1", >- "clash_of_clans 1", >- "clash_royale 1", >- "cod_mobile 1", >- "coin_master 1", >- "command_and_conquer_rivals 1", >- "cookie_run_kingdom 1", >- "disney_tsum_tsum 1", >- "dota_underlords 1", >- "dr_driving 1", >- "dragon_ball_legends 1", >- "dragon_raja 1", >- "efootball_pes_2021 1", >- "egypt_1500 1", >- "eight_ball_pool 1", >- "extreme_car_driving_simulator 1", >- "fallout_shelter_online 1", >- "farm_heroes_saga 1", >- "fate_grand_order 1", >- "fifa_mobile 1", >- "final_fantasy 1", >- "free_fire 1", >- "gardenscapes 1", >- "genshin_impact 2", >- "google_maps 1", >- "happy_color 1", >- "hay_day 1", >- "hearthstone 1", >- "higgs_domino_island 1", >- "hill_climb_racing 1", >- "homescapes 1", >- "idle_heroes 1", >- "junes_journey 1", >- "kartrider_rush 1", >- "klondike_adventures 1", >- "league_of_legends_wild_rift 1", >- "lego_legacy 1", >- "lineage_m 1", >- "ludo_king 1", >- "magic_tiles_3 1", >- "manhattan_10 1", >- "manhattan_31 1", >- "mario_kart_tour 1", >- "marvel_contest_of_champions 1", >- "messenger_lite 1", >- "minecraft 1", >- "mini_world 1", >- "mobile_legends 1", >- "my_talking_tom2 1", >- "my_talking_tom_friends 1", >- "nba2k20_800 1", >- "nier_reincarnation 1", >- "one_punch_man 1", >- "plants_vs_zombies_2 1", >- "pokemon_go 1", >- "pokemon_unite 1", >- "professional_baseball_spirits 1", >- "pubg_mobile_battle_royale 1", >- "pubg_mobile_lite 1", >- "pubg_mobile_skydive 1", >- "ragnarok_m_eternal_love 1", >- "raid_shadow_legends 1", >- "real_commando_secret_mission 1", >- "real_cricket_20 1", >- "real_gangster_crime 1", >- "rise_of_kingdoms 1", >- "romancing_saga 1", >- "rope_hero_vice_town 1", >- "saint_seiya_awakening 1", >- "sakura_school_simulator 1", >- "scrabble_go 1", >- "shadow_fight_2 1", >- "slingshot_test1 1", >- "slingshot_test2 1", >- "sniper_3d 1", >- "sonic_the_hedgehog 1", >- "standoff_2 1", >- "subway_princess_runner 1", >- "subway_surfers 1", >- "summoners_war 1", >- "talking_tom_hero_dash 1", >- "temple_run_2 1", >- "temple_run_300 1", >- "toon_blast 1", >- "township 1", >- "trex_200 1", >- "whatsapp 1", >- "words_with_friends_2 1", >- "wordscapes 1", >- "world_cricket_championship_2 1", >- "world_of_kings 1", >- "world_of_tanks_blitz 1", >- "world_war_doh 1", >- "worms_zone_io 1", >- "zillow 1" >+ "aliexpress 5", >+ "among_us 5", >+ "angry_birds_2_1500 5", >+ "angry_birds_2_launch 7", >+ "arena_of_valor 5", >+ "asphalt_8 5", >+ "asphalt_9 5", >+ "avakin_life 5", >+ "aztec_ruins 5", >+ "badland 5", >+ "beach_buggy_racing 5", >+ "blockman_go 5", >+ "brawl_stars 5", >+ "bricks_breaker_quest 5", >+ "bubble_shooter 5", >+ "bus_simulator_indonesia 5", >+ "call_break_offline_card_game 5", >+ "candy_crush_500 5", >+ "candy_crush_soda_saga 5", >+ "car_parking_multiplayer 5", >+ "clash_of_clans 5", >+ "clash_royale 5", >+ "cod_mobile 5", >+ "coin_master 5", >+ "command_and_conquer_rivals 5", >+ "cookie_run_kingdom 5", >+ "disney_tsum_tsum 5", >+ "dota_underlords 5", >+ "dr_driving 5", >+ "dragon_ball_legends 5", >+ "dragon_raja 5", >+ "efootball_pes_2021 5", >+ "egypt_1500 5", >+ "eight_ball_pool 5", >+ "extreme_car_driving_simulator 5", >+ "fallout_shelter_online 5", >+ "farm_heroes_saga 5", >+ "fate_grand_order 5", >+ "fifa_mobile 5", >+ "final_fantasy 5", >+ "free_fire 5", >+ "gardenscapes 5", >+ "genshin_impact 5", >+ "google_maps 5", >+ "happy_color 5", >+ "hay_day 5", >+ "hearthstone 5", >+ "higgs_domino_island 5", >+ "hill_climb_racing 5", >+ "homescapes 5", >+ "idle_heroes 5", >+ "junes_journey 5", >+ "kartrider_rush 5", >+ "klondike_adventures 5", >+ "league_of_legends_wild_rift 5", >+ "lego_legacy 5", >+ "lineage_m 5", >+ "ludo_king 5", >+ "magic_tiles_3 5", >+ "manhattan_10 5", >+ "manhattan_31 5", >+ "mario_kart_tour 5", >+ "marvel_contest_of_champions 5", >+ "messenger_lite 5", >+ "minecraft 5", >+ "mini_world 5", >+ "mobile_legends 5", >+ "my_talking_tom2 5", >+ "my_talking_tom_friends 5", >+ "nba2k20_800 5", >+ "nier_reincarnation 5", >+ "one_punch_man 5", >+ "plants_vs_zombies_2 5", >+ "pokemon_go 5", >+ "pokemon_unite 5", >+ "professional_baseball_spirits 5", >+ "pubg_mobile_battle_royale 5", >+ "pubg_mobile_launch 6", >+ "pubg_mobile_lite 5", >+ "pubg_mobile_skydive 5", >+ "ragnarok_m_eternal_love 5", >+ "raid_shadow_legends 5", >+ "real_commando_secret_mission 5", >+ "real_cricket_20 5", >+ "real_gangster_crime 5", >+ "respawnables 1", >+ "rise_of_kingdoms 5", >+ "romancing_saga 5", >+ "rope_hero_vice_town 5", >+ "saint_seiya_awakening 5", >+ "sakura_school_simulator 5", >+ "scrabble_go 5", >+ "shadow_fight_2 5", >+ "slingshot_test1 5", >+ "slingshot_test2 5", >+ "sniper_3d 5", >+ "sonic_the_hedgehog 5", >+ "standoff_2 5", >+ "subway_princess_runner 5", >+ "subway_surfers 5", >+ "summoners_war 5", >+ "talking_tom_hero_dash 5", >+ "temple_run_2 5", >+ "temple_run_300 5", >+ "toon_blast 5", >+ "township 5", >+ "trex_200 5", >+ "whatsapp 5", >+ "words_with_friends_2 5", >+ "wordscapes 5", >+ "world_cricket_championship_2 5", >+ "world_of_kings 5", >+ "world_of_tanks_blitz 5", >+ "world_war_doh 5", >+ "worms_zone_io 5", >+ "zillow 5" > ] > } >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.cpp b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.cpp >deleted file mode 100644 >index 87a4bfed71a459927ba61cd6f864efc607918bef..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.cpp >+++ /dev/null >@@ -1,2443 +0,0 @@ >-// GENERATED FILE - DO NOT EDIT. >-// Generated by gen_restricted_traces.py using data from restricted_traces.json >-// >-// Copyright 2020 The ANGLE Project Authors. All rights reserved. >-// Use of this source code is governed by a BSD-style license that can be >-// found in the LICENSE file. >-// >-// restricted_traces_autogen: Types and enumerations for trace tests. >- >-#include "restricted_traces_autogen.h" >- >-#include "common/PackedEnums.h" >-#include "common/system_utils.h" >- >-#include "aliexpress/aliexpress_capture_context1.h" >-#include "among_us/among_us_capture_context1.h" >-#include "angry_birds_2_1500/angry_birds_2_1500_capture_context1.h" >-#include "arena_of_valor/arena_of_valor_capture_context1.h" >-#include "asphalt_8/asphalt_8_capture_context1.h" >-#include "avakin_life/avakin_life_capture_context1.h" >-#include "aztec_ruins/aztec_ruins_capture_context1.h" >-#include "beach_buggy_racing/beach_buggy_racing_capture_context1.h" >-#include "blockman_go/blockman_go_capture_context2.h" >-#include "brawl_stars/brawl_stars_capture_context1.h" >-#include "bricks_breaker_quest/bricks_breaker_quest_capture_context2.h" >-#include "bubble_shooter/bubble_shooter_capture_context5.h" >-#include "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1.h" >-#include "call_break_offline_card_game/call_break_offline_card_game_capture_context2.h" >-#include "candy_crush_500/candy_crush_500_capture_context1.h" >-#include "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2.h" >-#include "car_parking_multiplayer/car_parking_multiplayer_capture_context1.h" >-#include "clash_of_clans/clash_of_clans_capture_context1.h" >-#include "clash_royale/clash_royale_capture_context1.h" >-#include "cod_mobile/cod_mobile_capture_context1.h" >-#include "coin_master/coin_master_capture_context1.h" >-#include "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2.h" >-#include "cookie_run_kingdom/cookie_run_kingdom_capture_context2.h" >-#include "disney_tsum_tsum/disney_tsum_tsum_capture_context3.h" >-#include "dr_driving/dr_driving_capture_context3.h" >-#include "dragon_ball_legends/dragon_ball_legends_capture_context1.h" >-#include "dragon_raja/dragon_raja_capture_context1.h" >-#include "efootball_pes_2021/efootball_pes_2021_capture_context1.h" >-#include "egypt_1500/egypt_1500_capture_context1.h" >-#include "eight_ball_pool/eight_ball_pool_capture_context1.h" >-#include "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1.h" >-#include "fallout_shelter_online/fallout_shelter_online_capture_context1.h" >-#include "farm_heroes_saga/farm_heroes_saga_capture_context2.h" >-#include "fate_grand_order/fate_grand_order_capture_context1.h" >-#include "fifa_mobile/fifa_mobile_capture_context1.h" >-#include "final_fantasy/final_fantasy_capture_context3.h" >-#include "free_fire/free_fire_capture_context1.h" >-#include "gardenscapes/gardenscapes_capture_context1.h" >-#include "genshin_impact/genshin_impact_capture_context3.h" >-#include "google_maps/google_maps_capture_context1.h" >-#include "happy_color/happy_color_capture_context1.h" >-#include "hay_day/hay_day_capture_context1.h" >-#include "hearthstone/hearthstone_capture_context1.h" >-#include "higgs_domino_island/higgs_domino_island_capture_context2.h" >-#include "hill_climb_racing/hill_climb_racing_capture_context1.h" >-#include "homescapes/homescapes_capture_context1.h" >-#include "idle_heroes/idle_heroes_capture_context2.h" >-#include "junes_journey/junes_journey_capture_context1.h" >-#include "kartrider_rush/kartrider_rush_capture_context1.h" >-#include "klondike_adventures/klondike_adventures_capture_context1.h" >-#include "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1.h" >-#include "lego_legacy/lego_legacy_capture_context1.h" >-#include "lineage_m/lineage_m_capture_context1.h" >-#include "ludo_king/ludo_king_capture_context1.h" >-#include "magic_tiles_3/magic_tiles_3_capture_context1.h" >-#include "manhattan_10/manhattan_10_capture_context1.h" >-#include "manhattan_31/manhattan_31_capture_context1.h" >-#include "mario_kart_tour/mario_kart_tour_capture_context1.h" >-#include "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1.h" >-#include "messenger_lite/messenger_lite_capture_context1.h" >-#include "minecraft/minecraft_capture_context1.h" >-#include "mobile_legends/mobile_legends_capture_context1.h" >-#include "nba2k20_800/nba2k20_800_capture_context1.h" >-#include "nier_reincarnation/nier_reincarnation_capture_context2.h" >-#include "one_punch_man/one_punch_man_capture_context1.h" >-#include "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1.h" >-#include "pokemon_go/pokemon_go_capture_context2.h" >-#include "professional_baseball_spirits/professional_baseball_spirits_capture_context1.h" >-#include "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6.h" >-#include "pubg_mobile_lite/pubg_mobile_lite_capture_context1.h" >-#include "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6.h" >-#include "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1.h" >-#include "raid_shadow_legends/raid_shadow_legends_capture_context1.h" >-#include "real_commando_secret_mission/real_commando_secret_mission_capture_context1.h" >-#include "real_cricket_20/real_cricket_20_capture_context1.h" >-#include "real_gangster_crime/real_gangster_crime_capture_context1.h" >-#include "rise_of_kingdoms/rise_of_kingdoms_capture_context1.h" >-#include "romancing_saga/romancing_saga_capture_context1.h" >-#include "rope_hero_vice_town/rope_hero_vice_town_capture_context1.h" >-#include "saint_seiya_awakening/saint_seiya_awakening_capture_context1.h" >-#include "sakura_school_simulator/sakura_school_simulator_capture_context2.h" >-#include "scrabble_go/scrabble_go_capture_context2.h" >-#include "shadow_fight_2/shadow_fight_2_capture_context1.h" >-#include "slingshot_test1/slingshot_test1_capture_context2.h" >-#include "slingshot_test2/slingshot_test2_capture_context2.h" >-#include "sniper_3d/sniper_3d_capture_context1.h" >-#include "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2.h" >-#include "standoff_2/standoff_2_capture_context1.h" >-#include "subway_princess_runner/subway_princess_runner_capture_context2.h" >-#include "subway_surfers/subway_surfers_capture_context1.h" >-#include "summoners_war/summoners_war_capture_context2.h" >-#include "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1.h" >-#include "temple_run_2/temple_run_2_capture_context1.h" >-#include "temple_run_300/temple_run_300_capture_context1.h" >-#include "toon_blast/toon_blast_capture_context2.h" >-#include "township/township_capture_context2.h" >-#include "trex_200/trex_200_capture_context1.h" >-#include "whatsapp/whatsapp_capture_context1.h" >-#include "words_with_friends_2/words_with_friends_2_capture_context1.h" >-#include "wordscapes/wordscapes_capture_context3.h" >-#include "world_of_kings/world_of_kings_capture_context3.h" >-#include "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1.h" >-#include "world_war_doh/world_war_doh_capture_context1.h" >-#include "worms_zone_io/worms_zone_io_capture_context1.h" >- >-namespace trace_angle >-{ >-namespace >-{ >-constexpr size_t kNumTraces = 113; >-struct TracePair >-{ >- const char name[kTraceInfoMaxNameLen]; >- TraceInfo info; >-}; >-constexpr TracePair kTraceInfos[kNumTraces] = { >- {"aliexpress", >- {"aliexpress", >- aliexpress::kReplayContextClientMajorVersion, >- aliexpress::kReplayContextClientMinorVersion, >- aliexpress::kReplayFrameStart, >- aliexpress::kReplayFrameEnd, >- aliexpress::kReplayDrawSurfaceWidth, >- aliexpress::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"among_us", >- {"among_us", >- among_us::kReplayContextClientMajorVersion, >- among_us::kReplayContextClientMinorVersion, >- among_us::kReplayFrameStart, >- among_us::kReplayFrameEnd, >- among_us::kReplayDrawSurfaceWidth, >- among_us::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"angry_birds_2_1500", >- {"angry_birds_2_1500", >- angry_birds_2_1500::kReplayContextClientMajorVersion, >- angry_birds_2_1500::kReplayContextClientMinorVersion, >- angry_birds_2_1500::kReplayFrameStart, >- angry_birds_2_1500::kReplayFrameEnd, >- angry_birds_2_1500::kReplayDrawSurfaceWidth, >- angry_birds_2_1500::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"arena_of_valor", >- {"arena_of_valor", >- arena_of_valor::kReplayContextClientMajorVersion, >- arena_of_valor::kReplayContextClientMinorVersion, >- arena_of_valor::kReplayFrameStart, >- arena_of_valor::kReplayFrameEnd, >- arena_of_valor::kReplayDrawSurfaceWidth, >- arena_of_valor::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"asphalt_8", >- {"asphalt_8", >- asphalt_8::kReplayContextClientMajorVersion, >- asphalt_8::kReplayContextClientMinorVersion, >- asphalt_8::kReplayFrameStart, >- asphalt_8::kReplayFrameEnd, >- asphalt_8::kReplayDrawSurfaceWidth, >- asphalt_8::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"asphalt_9", {}}, >- {"avakin_life", >- {"avakin_life", >- avakin_life::kReplayContextClientMajorVersion, >- avakin_life::kReplayContextClientMinorVersion, >- avakin_life::kReplayFrameStart, >- avakin_life::kReplayFrameEnd, >- avakin_life::kReplayDrawSurfaceWidth, >- avakin_life::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"aztec_ruins", >- {"aztec_ruins", >- aztec_ruins::kReplayContextClientMajorVersion, >- aztec_ruins::kReplayContextClientMinorVersion, >- aztec_ruins::kReplayFrameStart, >- aztec_ruins::kReplayFrameEnd, >- aztec_ruins::kReplayDrawSurfaceWidth, >- aztec_ruins::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"badland", {}}, >- {"beach_buggy_racing", >- {"beach_buggy_racing", >- beach_buggy_racing::kReplayContextClientMajorVersion, >- beach_buggy_racing::kReplayContextClientMinorVersion, >- beach_buggy_racing::kReplayFrameStart, >- beach_buggy_racing::kReplayFrameEnd, >- beach_buggy_racing::kReplayDrawSurfaceWidth, >- beach_buggy_racing::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"blockman_go", >- {"blockman_go", >- blockman_go::kReplayContextClientMajorVersion, >- blockman_go::kReplayContextClientMinorVersion, >- blockman_go::kReplayFrameStart, >- blockman_go::kReplayFrameEnd, >- blockman_go::kReplayDrawSurfaceWidth, >- blockman_go::kReplayDrawSurfaceHeight, >- blockman_go::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"brawl_stars", >- {"brawl_stars", >- brawl_stars::kReplayContextClientMajorVersion, >- brawl_stars::kReplayContextClientMinorVersion, >- brawl_stars::kReplayFrameStart, >- brawl_stars::kReplayFrameEnd, >- brawl_stars::kReplayDrawSurfaceWidth, >- brawl_stars::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"bricks_breaker_quest", >- {"bricks_breaker_quest", >- bricks_breaker_quest::kReplayContextClientMajorVersion, >- bricks_breaker_quest::kReplayContextClientMinorVersion, >- bricks_breaker_quest::kReplayFrameStart, >- bricks_breaker_quest::kReplayFrameEnd, >- bricks_breaker_quest::kReplayDrawSurfaceWidth, >- bricks_breaker_quest::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"bubble_shooter", >- {"bubble_shooter", >- bubble_shooter::kReplayContextClientMajorVersion, >- bubble_shooter::kReplayContextClientMinorVersion, >- bubble_shooter::kReplayFrameStart, >- bubble_shooter::kReplayFrameEnd, >- bubble_shooter::kReplayDrawSurfaceWidth, >- bubble_shooter::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"bus_simulator_indonesia", >- {"bus_simulator_indonesia", >- bus_simulator_indonesia::kReplayContextClientMajorVersion, >- bus_simulator_indonesia::kReplayContextClientMinorVersion, >- bus_simulator_indonesia::kReplayFrameStart, >- bus_simulator_indonesia::kReplayFrameEnd, >- bus_simulator_indonesia::kReplayDrawSurfaceWidth, >- bus_simulator_indonesia::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"call_break_offline_card_game", >- {"call_break_offline_card_game", >- call_break_offline_card_game::kReplayContextClientMajorVersion, >- call_break_offline_card_game::kReplayContextClientMinorVersion, >- call_break_offline_card_game::kReplayFrameStart, >- call_break_offline_card_game::kReplayFrameEnd, >- call_break_offline_card_game::kReplayDrawSurfaceWidth, >- call_break_offline_card_game::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"candy_crush_500", >- {"candy_crush_500", >- candy_crush_500::kReplayContextClientMajorVersion, >- candy_crush_500::kReplayContextClientMinorVersion, >- candy_crush_500::kReplayFrameStart, >- candy_crush_500::kReplayFrameEnd, >- candy_crush_500::kReplayDrawSurfaceWidth, >- candy_crush_500::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"candy_crush_soda_saga", >- {"candy_crush_soda_saga", >- candy_crush_soda_saga::kReplayContextClientMajorVersion, >- candy_crush_soda_saga::kReplayContextClientMinorVersion, >- candy_crush_soda_saga::kReplayFrameStart, >- candy_crush_soda_saga::kReplayFrameEnd, >- candy_crush_soda_saga::kReplayDrawSurfaceWidth, >- candy_crush_soda_saga::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"car_parking_multiplayer", >- {"car_parking_multiplayer", >- car_parking_multiplayer::kReplayContextClientMajorVersion, >- car_parking_multiplayer::kReplayContextClientMinorVersion, >- car_parking_multiplayer::kReplayFrameStart, >- car_parking_multiplayer::kReplayFrameEnd, >- car_parking_multiplayer::kReplayDrawSurfaceWidth, >- car_parking_multiplayer::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"clash_of_clans", >- {"clash_of_clans", >- clash_of_clans::kReplayContextClientMajorVersion, >- clash_of_clans::kReplayContextClientMinorVersion, >- clash_of_clans::kReplayFrameStart, >- clash_of_clans::kReplayFrameEnd, >- clash_of_clans::kReplayDrawSurfaceWidth, >- clash_of_clans::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"clash_royale", >- {"clash_royale", >- clash_royale::kReplayContextClientMajorVersion, >- clash_royale::kReplayContextClientMinorVersion, >- clash_royale::kReplayFrameStart, >- clash_royale::kReplayFrameEnd, >- clash_royale::kReplayDrawSurfaceWidth, >- clash_royale::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"cod_mobile", >- {"cod_mobile", >- cod_mobile::kReplayContextClientMajorVersion, >- cod_mobile::kReplayContextClientMinorVersion, >- cod_mobile::kReplayFrameStart, >- cod_mobile::kReplayFrameEnd, >- cod_mobile::kReplayDrawSurfaceWidth, >- cod_mobile::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"coin_master", >- {"coin_master", >- coin_master::kReplayContextClientMajorVersion, >- coin_master::kReplayContextClientMinorVersion, >- coin_master::kReplayFrameStart, >- coin_master::kReplayFrameEnd, >- coin_master::kReplayDrawSurfaceWidth, >- coin_master::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"command_and_conquer_rivals", >- {"command_and_conquer_rivals", >- command_and_conquer_rivals::kReplayContextClientMajorVersion, >- command_and_conquer_rivals::kReplayContextClientMinorVersion, >- command_and_conquer_rivals::kReplayFrameStart, >- command_and_conquer_rivals::kReplayFrameEnd, >- command_and_conquer_rivals::kReplayDrawSurfaceWidth, >- command_and_conquer_rivals::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"cookie_run_kingdom", >- {"cookie_run_kingdom", >- cookie_run_kingdom::kReplayContextClientMajorVersion, >- cookie_run_kingdom::kReplayContextClientMinorVersion, >- cookie_run_kingdom::kReplayFrameStart, >- cookie_run_kingdom::kReplayFrameEnd, >- cookie_run_kingdom::kReplayDrawSurfaceWidth, >- cookie_run_kingdom::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"disney_tsum_tsum", >- {"disney_tsum_tsum", >- disney_tsum_tsum::kReplayContextClientMajorVersion, >- disney_tsum_tsum::kReplayContextClientMinorVersion, >- disney_tsum_tsum::kReplayFrameStart, >- disney_tsum_tsum::kReplayFrameEnd, >- disney_tsum_tsum::kReplayDrawSurfaceWidth, >- disney_tsum_tsum::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"dota_underlords", {}}, >- {"dr_driving", >- {"dr_driving", >- dr_driving::kReplayContextClientMajorVersion, >- dr_driving::kReplayContextClientMinorVersion, >- dr_driving::kReplayFrameStart, >- dr_driving::kReplayFrameEnd, >- dr_driving::kReplayDrawSurfaceWidth, >- dr_driving::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"dragon_ball_legends", >- {"dragon_ball_legends", >- dragon_ball_legends::kReplayContextClientMajorVersion, >- dragon_ball_legends::kReplayContextClientMinorVersion, >- dragon_ball_legends::kReplayFrameStart, >- dragon_ball_legends::kReplayFrameEnd, >- dragon_ball_legends::kReplayDrawSurfaceWidth, >- dragon_ball_legends::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"dragon_raja", >- {"dragon_raja", >- dragon_raja::kReplayContextClientMajorVersion, >- dragon_raja::kReplayContextClientMinorVersion, >- dragon_raja::kReplayFrameStart, >- dragon_raja::kReplayFrameEnd, >- dragon_raja::kReplayDrawSurfaceWidth, >- dragon_raja::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"efootball_pes_2021", >- {"efootball_pes_2021", >- efootball_pes_2021::kReplayContextClientMajorVersion, >- efootball_pes_2021::kReplayContextClientMinorVersion, >- efootball_pes_2021::kReplayFrameStart, >- efootball_pes_2021::kReplayFrameEnd, >- efootball_pes_2021::kReplayDrawSurfaceWidth, >- efootball_pes_2021::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"egypt_1500", >- {"egypt_1500", >- egypt_1500::kReplayContextClientMajorVersion, >- egypt_1500::kReplayContextClientMinorVersion, >- egypt_1500::kReplayFrameStart, >- egypt_1500::kReplayFrameEnd, >- egypt_1500::kReplayDrawSurfaceWidth, >- egypt_1500::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"eight_ball_pool", >- {"eight_ball_pool", >- eight_ball_pool::kReplayContextClientMajorVersion, >- eight_ball_pool::kReplayContextClientMinorVersion, >- eight_ball_pool::kReplayFrameStart, >- eight_ball_pool::kReplayFrameEnd, >- eight_ball_pool::kReplayDrawSurfaceWidth, >- eight_ball_pool::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"extreme_car_driving_simulator", >- {"extreme_car_driving_simulator", >- extreme_car_driving_simulator::kReplayContextClientMajorVersion, >- extreme_car_driving_simulator::kReplayContextClientMinorVersion, >- extreme_car_driving_simulator::kReplayFrameStart, >- extreme_car_driving_simulator::kReplayFrameEnd, >- extreme_car_driving_simulator::kReplayDrawSurfaceWidth, >- extreme_car_driving_simulator::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"fallout_shelter_online", >- {"fallout_shelter_online", >- fallout_shelter_online::kReplayContextClientMajorVersion, >- fallout_shelter_online::kReplayContextClientMinorVersion, >- fallout_shelter_online::kReplayFrameStart, >- fallout_shelter_online::kReplayFrameEnd, >- fallout_shelter_online::kReplayDrawSurfaceWidth, >- fallout_shelter_online::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"farm_heroes_saga", >- {"farm_heroes_saga", >- farm_heroes_saga::kReplayContextClientMajorVersion, >- farm_heroes_saga::kReplayContextClientMinorVersion, >- farm_heroes_saga::kReplayFrameStart, >- farm_heroes_saga::kReplayFrameEnd, >- farm_heroes_saga::kReplayDrawSurfaceWidth, >- farm_heroes_saga::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"fate_grand_order", >- {"fate_grand_order", >- fate_grand_order::kReplayContextClientMajorVersion, >- fate_grand_order::kReplayContextClientMinorVersion, >- fate_grand_order::kReplayFrameStart, >- fate_grand_order::kReplayFrameEnd, >- fate_grand_order::kReplayDrawSurfaceWidth, >- fate_grand_order::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"fifa_mobile", >- {"fifa_mobile", >- fifa_mobile::kReplayContextClientMajorVersion, >- fifa_mobile::kReplayContextClientMinorVersion, >- fifa_mobile::kReplayFrameStart, >- fifa_mobile::kReplayFrameEnd, >- fifa_mobile::kReplayDrawSurfaceWidth, >- fifa_mobile::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"final_fantasy", >- {"final_fantasy", >- final_fantasy::kReplayContextClientMajorVersion, >- final_fantasy::kReplayContextClientMinorVersion, >- final_fantasy::kReplayFrameStart, >- final_fantasy::kReplayFrameEnd, >- final_fantasy::kReplayDrawSurfaceWidth, >- final_fantasy::kReplayDrawSurfaceHeight, >- final_fantasy::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"free_fire", >- {"free_fire", >- free_fire::kReplayContextClientMajorVersion, >- free_fire::kReplayContextClientMinorVersion, >- free_fire::kReplayFrameStart, >- free_fire::kReplayFrameEnd, >- free_fire::kReplayDrawSurfaceWidth, >- free_fire::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"gardenscapes", >- {"gardenscapes", >- gardenscapes::kReplayContextClientMajorVersion, >- gardenscapes::kReplayContextClientMinorVersion, >- gardenscapes::kReplayFrameStart, >- gardenscapes::kReplayFrameEnd, >- gardenscapes::kReplayDrawSurfaceWidth, >- gardenscapes::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"genshin_impact", >- {"genshin_impact", >- genshin_impact::kReplayContextClientMajorVersion, >- genshin_impact::kReplayContextClientMinorVersion, >- genshin_impact::kReplayFrameStart, >- genshin_impact::kReplayFrameEnd, >- genshin_impact::kReplayDrawSurfaceWidth, >- genshin_impact::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"google_maps", >- {"google_maps", >- google_maps::kReplayContextClientMajorVersion, >- google_maps::kReplayContextClientMinorVersion, >- google_maps::kReplayFrameStart, >- google_maps::kReplayFrameEnd, >- google_maps::kReplayDrawSurfaceWidth, >- google_maps::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"happy_color", >- {"happy_color", >- happy_color::kReplayContextClientMajorVersion, >- happy_color::kReplayContextClientMinorVersion, >- happy_color::kReplayFrameStart, >- happy_color::kReplayFrameEnd, >- happy_color::kReplayDrawSurfaceWidth, >- happy_color::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"hay_day", >- {"hay_day", >- hay_day::kReplayContextClientMajorVersion, >- hay_day::kReplayContextClientMinorVersion, >- hay_day::kReplayFrameStart, >- hay_day::kReplayFrameEnd, >- hay_day::kReplayDrawSurfaceWidth, >- hay_day::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"hearthstone", >- {"hearthstone", >- hearthstone::kReplayContextClientMajorVersion, >- hearthstone::kReplayContextClientMinorVersion, >- hearthstone::kReplayFrameStart, >- hearthstone::kReplayFrameEnd, >- hearthstone::kReplayDrawSurfaceWidth, >- hearthstone::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"higgs_domino_island", >- {"higgs_domino_island", >- higgs_domino_island::kReplayContextClientMajorVersion, >- higgs_domino_island::kReplayContextClientMinorVersion, >- higgs_domino_island::kReplayFrameStart, >- higgs_domino_island::kReplayFrameEnd, >- higgs_domino_island::kReplayDrawSurfaceWidth, >- higgs_domino_island::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"hill_climb_racing", >- {"hill_climb_racing", >- hill_climb_racing::kReplayContextClientMajorVersion, >- hill_climb_racing::kReplayContextClientMinorVersion, >- hill_climb_racing::kReplayFrameStart, >- hill_climb_racing::kReplayFrameEnd, >- hill_climb_racing::kReplayDrawSurfaceWidth, >- hill_climb_racing::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"homescapes", >- {"homescapes", >- homescapes::kReplayContextClientMajorVersion, >- homescapes::kReplayContextClientMinorVersion, >- homescapes::kReplayFrameStart, >- homescapes::kReplayFrameEnd, >- homescapes::kReplayDrawSurfaceWidth, >- homescapes::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"idle_heroes", >- {"idle_heroes", >- idle_heroes::kReplayContextClientMajorVersion, >- idle_heroes::kReplayContextClientMinorVersion, >- idle_heroes::kReplayFrameStart, >- idle_heroes::kReplayFrameEnd, >- idle_heroes::kReplayDrawSurfaceWidth, >- idle_heroes::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"junes_journey", >- {"junes_journey", >- junes_journey::kReplayContextClientMajorVersion, >- junes_journey::kReplayContextClientMinorVersion, >- junes_journey::kReplayFrameStart, >- junes_journey::kReplayFrameEnd, >- junes_journey::kReplayDrawSurfaceWidth, >- junes_journey::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"kartrider_rush", >- {"kartrider_rush", >- kartrider_rush::kReplayContextClientMajorVersion, >- kartrider_rush::kReplayContextClientMinorVersion, >- kartrider_rush::kReplayFrameStart, >- kartrider_rush::kReplayFrameEnd, >- kartrider_rush::kReplayDrawSurfaceWidth, >- kartrider_rush::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"klondike_adventures", >- {"klondike_adventures", >- klondike_adventures::kReplayContextClientMajorVersion, >- klondike_adventures::kReplayContextClientMinorVersion, >- klondike_adventures::kReplayFrameStart, >- klondike_adventures::kReplayFrameEnd, >- klondike_adventures::kReplayDrawSurfaceWidth, >- klondike_adventures::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"league_of_legends_wild_rift", >- {"league_of_legends_wild_rift", >- league_of_legends_wild_rift::kReplayContextClientMajorVersion, >- league_of_legends_wild_rift::kReplayContextClientMinorVersion, >- league_of_legends_wild_rift::kReplayFrameStart, >- league_of_legends_wild_rift::kReplayFrameEnd, >- league_of_legends_wild_rift::kReplayDrawSurfaceWidth, >- league_of_legends_wild_rift::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"lego_legacy", >- {"lego_legacy", >- lego_legacy::kReplayContextClientMajorVersion, >- lego_legacy::kReplayContextClientMinorVersion, >- lego_legacy::kReplayFrameStart, >- lego_legacy::kReplayFrameEnd, >- lego_legacy::kReplayDrawSurfaceWidth, >- lego_legacy::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"lineage_m", >- {"lineage_m", >- lineage_m::kReplayContextClientMajorVersion, >- lineage_m::kReplayContextClientMinorVersion, >- lineage_m::kReplayFrameStart, >- lineage_m::kReplayFrameEnd, >- lineage_m::kReplayDrawSurfaceWidth, >- lineage_m::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"ludo_king", >- {"ludo_king", >- ludo_king::kReplayContextClientMajorVersion, >- ludo_king::kReplayContextClientMinorVersion, >- ludo_king::kReplayFrameStart, >- ludo_king::kReplayFrameEnd, >- ludo_king::kReplayDrawSurfaceWidth, >- ludo_king::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"magic_tiles_3", >- {"magic_tiles_3", >- magic_tiles_3::kReplayContextClientMajorVersion, >- magic_tiles_3::kReplayContextClientMinorVersion, >- magic_tiles_3::kReplayFrameStart, >- magic_tiles_3::kReplayFrameEnd, >- magic_tiles_3::kReplayDrawSurfaceWidth, >- magic_tiles_3::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"manhattan_10", >- {"manhattan_10", >- manhattan_10::kReplayContextClientMajorVersion, >- manhattan_10::kReplayContextClientMinorVersion, >- manhattan_10::kReplayFrameStart, >- manhattan_10::kReplayFrameEnd, >- manhattan_10::kReplayDrawSurfaceWidth, >- manhattan_10::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"manhattan_31", >- {"manhattan_31", >- manhattan_31::kReplayContextClientMajorVersion, >- manhattan_31::kReplayContextClientMinorVersion, >- manhattan_31::kReplayFrameStart, >- manhattan_31::kReplayFrameEnd, >- manhattan_31::kReplayDrawSurfaceWidth, >- manhattan_31::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"mario_kart_tour", >- {"mario_kart_tour", >- mario_kart_tour::kReplayContextClientMajorVersion, >- mario_kart_tour::kReplayContextClientMinorVersion, >- mario_kart_tour::kReplayFrameStart, >- mario_kart_tour::kReplayFrameEnd, >- mario_kart_tour::kReplayDrawSurfaceWidth, >- mario_kart_tour::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"marvel_contest_of_champions", >- {"marvel_contest_of_champions", >- marvel_contest_of_champions::kReplayContextClientMajorVersion, >- marvel_contest_of_champions::kReplayContextClientMinorVersion, >- marvel_contest_of_champions::kReplayFrameStart, >- marvel_contest_of_champions::kReplayFrameEnd, >- marvel_contest_of_champions::kReplayDrawSurfaceWidth, >- marvel_contest_of_champions::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"messenger_lite", >- {"messenger_lite", >- messenger_lite::kReplayContextClientMajorVersion, >- messenger_lite::kReplayContextClientMinorVersion, >- messenger_lite::kReplayFrameStart, >- messenger_lite::kReplayFrameEnd, >- messenger_lite::kReplayDrawSurfaceWidth, >- messenger_lite::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"minecraft", >- {"minecraft", >- minecraft::kReplayContextClientMajorVersion, >- minecraft::kReplayContextClientMinorVersion, >- minecraft::kReplayFrameStart, >- minecraft::kReplayFrameEnd, >- minecraft::kReplayDrawSurfaceWidth, >- minecraft::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"mini_world", {}}, >- {"mobile_legends", >- {"mobile_legends", >- mobile_legends::kReplayContextClientMajorVersion, >- mobile_legends::kReplayContextClientMinorVersion, >- mobile_legends::kReplayFrameStart, >- mobile_legends::kReplayFrameEnd, >- mobile_legends::kReplayDrawSurfaceWidth, >- mobile_legends::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"my_talking_tom2", {}}, >- {"my_talking_tom_friends", {}}, >- {"nba2k20_800", >- {"nba2k20_800", >- nba2k20_800::kReplayContextClientMajorVersion, >- nba2k20_800::kReplayContextClientMinorVersion, >- nba2k20_800::kReplayFrameStart, >- nba2k20_800::kReplayFrameEnd, >- nba2k20_800::kReplayDrawSurfaceWidth, >- nba2k20_800::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"nier_reincarnation", >- {"nier_reincarnation", >- nier_reincarnation::kReplayContextClientMajorVersion, >- nier_reincarnation::kReplayContextClientMinorVersion, >- nier_reincarnation::kReplayFrameStart, >- nier_reincarnation::kReplayFrameEnd, >- nier_reincarnation::kReplayDrawSurfaceWidth, >- nier_reincarnation::kReplayDrawSurfaceHeight, >- nier_reincarnation::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"one_punch_man", >- {"one_punch_man", >- one_punch_man::kReplayContextClientMajorVersion, >- one_punch_man::kReplayContextClientMinorVersion, >- one_punch_man::kReplayFrameStart, >- one_punch_man::kReplayFrameEnd, >- one_punch_man::kReplayDrawSurfaceWidth, >- one_punch_man::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"plants_vs_zombies_2", >- {"plants_vs_zombies_2", >- plants_vs_zombies_2::kReplayContextClientMajorVersion, >- plants_vs_zombies_2::kReplayContextClientMinorVersion, >- plants_vs_zombies_2::kReplayFrameStart, >- plants_vs_zombies_2::kReplayFrameEnd, >- plants_vs_zombies_2::kReplayDrawSurfaceWidth, >- plants_vs_zombies_2::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"pokemon_go", >- {"pokemon_go", >- pokemon_go::kReplayContextClientMajorVersion, >- pokemon_go::kReplayContextClientMinorVersion, >- pokemon_go::kReplayFrameStart, >- pokemon_go::kReplayFrameEnd, >- pokemon_go::kReplayDrawSurfaceWidth, >- pokemon_go::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"pokemon_unite", {}}, >- {"professional_baseball_spirits", >- {"professional_baseball_spirits", >- professional_baseball_spirits::kReplayContextClientMajorVersion, >- professional_baseball_spirits::kReplayContextClientMinorVersion, >- professional_baseball_spirits::kReplayFrameStart, >- professional_baseball_spirits::kReplayFrameEnd, >- professional_baseball_spirits::kReplayDrawSurfaceWidth, >- professional_baseball_spirits::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"pubg_mobile_battle_royale", >- {"pubg_mobile_battle_royale", >- pubg_mobile_battle_royale::kReplayContextClientMajorVersion, >- pubg_mobile_battle_royale::kReplayContextClientMinorVersion, >- pubg_mobile_battle_royale::kReplayFrameStart, >- pubg_mobile_battle_royale::kReplayFrameEnd, >- pubg_mobile_battle_royale::kReplayDrawSurfaceWidth, >- pubg_mobile_battle_royale::kReplayDrawSurfaceHeight, >- pubg_mobile_battle_royale::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"pubg_mobile_lite", >- {"pubg_mobile_lite", >- pubg_mobile_lite::kReplayContextClientMajorVersion, >- pubg_mobile_lite::kReplayContextClientMinorVersion, >- pubg_mobile_lite::kReplayFrameStart, >- pubg_mobile_lite::kReplayFrameEnd, >- pubg_mobile_lite::kReplayDrawSurfaceWidth, >- pubg_mobile_lite::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"pubg_mobile_skydive", >- {"pubg_mobile_skydive", >- pubg_mobile_skydive::kReplayContextClientMajorVersion, >- pubg_mobile_skydive::kReplayContextClientMinorVersion, >- pubg_mobile_skydive::kReplayFrameStart, >- pubg_mobile_skydive::kReplayFrameEnd, >- pubg_mobile_skydive::kReplayDrawSurfaceWidth, >- pubg_mobile_skydive::kReplayDrawSurfaceHeight, >- pubg_mobile_skydive::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"ragnarok_m_eternal_love", >- {"ragnarok_m_eternal_love", >- ragnarok_m_eternal_love::kReplayContextClientMajorVersion, >- ragnarok_m_eternal_love::kReplayContextClientMinorVersion, >- ragnarok_m_eternal_love::kReplayFrameStart, >- ragnarok_m_eternal_love::kReplayFrameEnd, >- ragnarok_m_eternal_love::kReplayDrawSurfaceWidth, >- ragnarok_m_eternal_love::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"raid_shadow_legends", >- {"raid_shadow_legends", >- raid_shadow_legends::kReplayContextClientMajorVersion, >- raid_shadow_legends::kReplayContextClientMinorVersion, >- raid_shadow_legends::kReplayFrameStart, >- raid_shadow_legends::kReplayFrameEnd, >- raid_shadow_legends::kReplayDrawSurfaceWidth, >- raid_shadow_legends::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"real_commando_secret_mission", >- {"real_commando_secret_mission", >- real_commando_secret_mission::kReplayContextClientMajorVersion, >- real_commando_secret_mission::kReplayContextClientMinorVersion, >- real_commando_secret_mission::kReplayFrameStart, >- real_commando_secret_mission::kReplayFrameEnd, >- real_commando_secret_mission::kReplayDrawSurfaceWidth, >- real_commando_secret_mission::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"real_cricket_20", >- {"real_cricket_20", >- real_cricket_20::kReplayContextClientMajorVersion, >- real_cricket_20::kReplayContextClientMinorVersion, >- real_cricket_20::kReplayFrameStart, >- real_cricket_20::kReplayFrameEnd, >- real_cricket_20::kReplayDrawSurfaceWidth, >- real_cricket_20::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"real_gangster_crime", >- {"real_gangster_crime", >- real_gangster_crime::kReplayContextClientMajorVersion, >- real_gangster_crime::kReplayContextClientMinorVersion, >- real_gangster_crime::kReplayFrameStart, >- real_gangster_crime::kReplayFrameEnd, >- real_gangster_crime::kReplayDrawSurfaceWidth, >- real_gangster_crime::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"rise_of_kingdoms", >- {"rise_of_kingdoms", >- rise_of_kingdoms::kReplayContextClientMajorVersion, >- rise_of_kingdoms::kReplayContextClientMinorVersion, >- rise_of_kingdoms::kReplayFrameStart, >- rise_of_kingdoms::kReplayFrameEnd, >- rise_of_kingdoms::kReplayDrawSurfaceWidth, >- rise_of_kingdoms::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"romancing_saga", >- {"romancing_saga", >- romancing_saga::kReplayContextClientMajorVersion, >- romancing_saga::kReplayContextClientMinorVersion, >- romancing_saga::kReplayFrameStart, >- romancing_saga::kReplayFrameEnd, >- romancing_saga::kReplayDrawSurfaceWidth, >- romancing_saga::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"rope_hero_vice_town", >- {"rope_hero_vice_town", >- rope_hero_vice_town::kReplayContextClientMajorVersion, >- rope_hero_vice_town::kReplayContextClientMinorVersion, >- rope_hero_vice_town::kReplayFrameStart, >- rope_hero_vice_town::kReplayFrameEnd, >- rope_hero_vice_town::kReplayDrawSurfaceWidth, >- rope_hero_vice_town::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"saint_seiya_awakening", >- {"saint_seiya_awakening", >- saint_seiya_awakening::kReplayContextClientMajorVersion, >- saint_seiya_awakening::kReplayContextClientMinorVersion, >- saint_seiya_awakening::kReplayFrameStart, >- saint_seiya_awakening::kReplayFrameEnd, >- saint_seiya_awakening::kReplayDrawSurfaceWidth, >- saint_seiya_awakening::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"sakura_school_simulator", >- {"sakura_school_simulator", >- sakura_school_simulator::kReplayContextClientMajorVersion, >- sakura_school_simulator::kReplayContextClientMinorVersion, >- sakura_school_simulator::kReplayFrameStart, >- sakura_school_simulator::kReplayFrameEnd, >- sakura_school_simulator::kReplayDrawSurfaceWidth, >- sakura_school_simulator::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"scrabble_go", >- {"scrabble_go", >- scrabble_go::kReplayContextClientMajorVersion, >- scrabble_go::kReplayContextClientMinorVersion, >- scrabble_go::kReplayFrameStart, >- scrabble_go::kReplayFrameEnd, >- scrabble_go::kReplayDrawSurfaceWidth, >- scrabble_go::kReplayDrawSurfaceHeight, >- scrabble_go::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"shadow_fight_2", >- {"shadow_fight_2", >- shadow_fight_2::kReplayContextClientMajorVersion, >- shadow_fight_2::kReplayContextClientMinorVersion, >- shadow_fight_2::kReplayFrameStart, >- shadow_fight_2::kReplayFrameEnd, >- shadow_fight_2::kReplayDrawSurfaceWidth, >- shadow_fight_2::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"slingshot_test1", >- {"slingshot_test1", >- slingshot_test1::kReplayContextClientMajorVersion, >- slingshot_test1::kReplayContextClientMinorVersion, >- slingshot_test1::kReplayFrameStart, >- slingshot_test1::kReplayFrameEnd, >- slingshot_test1::kReplayDrawSurfaceWidth, >- slingshot_test1::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"slingshot_test2", >- {"slingshot_test2", >- slingshot_test2::kReplayContextClientMajorVersion, >- slingshot_test2::kReplayContextClientMinorVersion, >- slingshot_test2::kReplayFrameStart, >- slingshot_test2::kReplayFrameEnd, >- slingshot_test2::kReplayDrawSurfaceWidth, >- slingshot_test2::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"sniper_3d", >- {"sniper_3d", >- sniper_3d::kReplayContextClientMajorVersion, >- sniper_3d::kReplayContextClientMinorVersion, >- sniper_3d::kReplayFrameStart, >- sniper_3d::kReplayFrameEnd, >- sniper_3d::kReplayDrawSurfaceWidth, >- sniper_3d::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"sonic_the_hedgehog", >- {"sonic_the_hedgehog", >- sonic_the_hedgehog::kReplayContextClientMajorVersion, >- sonic_the_hedgehog::kReplayContextClientMinorVersion, >- sonic_the_hedgehog::kReplayFrameStart, >- sonic_the_hedgehog::kReplayFrameEnd, >- sonic_the_hedgehog::kReplayDrawSurfaceWidth, >- sonic_the_hedgehog::kReplayDrawSurfaceHeight, >- sonic_the_hedgehog::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"standoff_2", >- {"standoff_2", >- standoff_2::kReplayContextClientMajorVersion, >- standoff_2::kReplayContextClientMinorVersion, >- standoff_2::kReplayFrameStart, >- standoff_2::kReplayFrameEnd, >- standoff_2::kReplayDrawSurfaceWidth, >- standoff_2::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"subway_princess_runner", >- {"subway_princess_runner", >- subway_princess_runner::kReplayContextClientMajorVersion, >- subway_princess_runner::kReplayContextClientMinorVersion, >- subway_princess_runner::kReplayFrameStart, >- subway_princess_runner::kReplayFrameEnd, >- subway_princess_runner::kReplayDrawSurfaceWidth, >- subway_princess_runner::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"subway_surfers", >- {"subway_surfers", >- subway_surfers::kReplayContextClientMajorVersion, >- subway_surfers::kReplayContextClientMinorVersion, >- subway_surfers::kReplayFrameStart, >- subway_surfers::kReplayFrameEnd, >- subway_surfers::kReplayDrawSurfaceWidth, >- subway_surfers::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"summoners_war", >- {"summoners_war", >- summoners_war::kReplayContextClientMajorVersion, >- summoners_war::kReplayContextClientMinorVersion, >- summoners_war::kReplayFrameStart, >- summoners_war::kReplayFrameEnd, >- summoners_war::kReplayDrawSurfaceWidth, >- summoners_war::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"talking_tom_hero_dash", >- {"talking_tom_hero_dash", >- talking_tom_hero_dash::kReplayContextClientMajorVersion, >- talking_tom_hero_dash::kReplayContextClientMinorVersion, >- talking_tom_hero_dash::kReplayFrameStart, >- talking_tom_hero_dash::kReplayFrameEnd, >- talking_tom_hero_dash::kReplayDrawSurfaceWidth, >- talking_tom_hero_dash::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"temple_run_2", >- {"temple_run_2", >- temple_run_2::kReplayContextClientMajorVersion, >- temple_run_2::kReplayContextClientMinorVersion, >- temple_run_2::kReplayFrameStart, >- temple_run_2::kReplayFrameEnd, >- temple_run_2::kReplayDrawSurfaceWidth, >- temple_run_2::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"temple_run_300", >- {"temple_run_300", >- temple_run_300::kReplayContextClientMajorVersion, >- temple_run_300::kReplayContextClientMinorVersion, >- temple_run_300::kReplayFrameStart, >- temple_run_300::kReplayFrameEnd, >- temple_run_300::kReplayDrawSurfaceWidth, >- temple_run_300::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"toon_blast", >- {"toon_blast", >- toon_blast::kReplayContextClientMajorVersion, >- toon_blast::kReplayContextClientMinorVersion, >- toon_blast::kReplayFrameStart, >- toon_blast::kReplayFrameEnd, >- toon_blast::kReplayDrawSurfaceWidth, >- toon_blast::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"township", >- {"township", >- township::kReplayContextClientMajorVersion, >- township::kReplayContextClientMinorVersion, >- township::kReplayFrameStart, >- township::kReplayFrameEnd, >- township::kReplayDrawSurfaceWidth, >- township::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"trex_200", >- {"trex_200", >- trex_200::kReplayContextClientMajorVersion, >- trex_200::kReplayContextClientMinorVersion, >- trex_200::kReplayFrameStart, >- trex_200::kReplayFrameEnd, >- trex_200::kReplayDrawSurfaceWidth, >- trex_200::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"whatsapp", >- {"whatsapp", >- whatsapp::kReplayContextClientMajorVersion, >- whatsapp::kReplayContextClientMinorVersion, >- whatsapp::kReplayFrameStart, >- whatsapp::kReplayFrameEnd, >- whatsapp::kReplayDrawSurfaceWidth, >- whatsapp::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"words_with_friends_2", >- {"words_with_friends_2", >- words_with_friends_2::kReplayContextClientMajorVersion, >- words_with_friends_2::kReplayContextClientMinorVersion, >- words_with_friends_2::kReplayFrameStart, >- words_with_friends_2::kReplayFrameEnd, >- words_with_friends_2::kReplayDrawSurfaceWidth, >- words_with_friends_2::kReplayDrawSurfaceHeight, >- words_with_friends_2::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"wordscapes", >- {"wordscapes", >- wordscapes::kReplayContextClientMajorVersion, >- wordscapes::kReplayContextClientMinorVersion, >- wordscapes::kReplayFrameStart, >- wordscapes::kReplayFrameEnd, >- wordscapes::kReplayDrawSurfaceWidth, >- wordscapes::kReplayDrawSurfaceHeight, >- wordscapes::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"world_cricket_championship_2", {}}, >- {"world_of_kings", >- {"world_of_kings", >- world_of_kings::kReplayContextClientMajorVersion, >- world_of_kings::kReplayContextClientMinorVersion, >- world_of_kings::kReplayFrameStart, >- world_of_kings::kReplayFrameEnd, >- world_of_kings::kReplayDrawSurfaceWidth, >- world_of_kings::kReplayDrawSurfaceHeight, >- world_of_kings::kReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"world_of_tanks_blitz", >- {"world_of_tanks_blitz", >- world_of_tanks_blitz::kReplayContextClientMajorVersion, >- world_of_tanks_blitz::kReplayContextClientMinorVersion, >- world_of_tanks_blitz::kReplayFrameStart, >- world_of_tanks_blitz::kReplayFrameEnd, >- world_of_tanks_blitz::kReplayDrawSurfaceWidth, >- world_of_tanks_blitz::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"world_war_doh", >- {"world_war_doh", >- world_war_doh::kReplayContextClientMajorVersion, >- world_war_doh::kReplayContextClientMinorVersion, >- world_war_doh::kReplayFrameStart, >- world_war_doh::kReplayFrameEnd, >- world_war_doh::kReplayDrawSurfaceWidth, >- world_war_doh::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"worms_zone_io", >- {"worms_zone_io", >- worms_zone_io::kReplayContextClientMajorVersion, >- worms_zone_io::kReplayContextClientMinorVersion, >- worms_zone_io::kReplayFrameStart, >- worms_zone_io::kReplayFrameEnd, >- worms_zone_io::kReplayDrawSurfaceWidth, >- worms_zone_io::kReplayDrawSurfaceHeight, >- kDefaultReplayDrawSurfaceColorSpace, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- 0, >- false, >- false, >- false, >- false, >- false}}, >- {"zillow", {}}}; >-} // namespace >- >-const TraceInfo &GetTraceInfo(const char *traceName) >-{ >- // Could be improved using std::lower_bound. >- for (const TracePair &tracePair : kTraceInfos) >- { >- if (strncmp(tracePair.name, traceName, kTraceInfoMaxNameLen) == 0) >- { >- return tracePair.info; >- } >- } >- UNREACHABLE(); >- return kTraceInfos[0].info; >-} >-} // namespace trace_angle >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.gni b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.gni >deleted file mode 100644 >index 0c9393e0de7d060529f334db2cbc618b9d680888..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.gni >+++ /dev/null >@@ -1,6727 +0,0 @@ >-# GENERATED FILE - DO NOT EDIT. >-# Generated by gen_restricted_traces.py using data from restricted_traces.json >-# >-# Copyright 2020 The ANGLE Project Authors. All rights reserved. >-# Use of this source code is governed by a BSD-style license that can be >-# found in the LICENSE file. >-# >-# A list of all restricted trace tests, paired with their context. >-# Can be consumed by tests/BUILD.gn. >- >-angle_restricted_traces = [ >- [ >- "aliexpress", >- 1, >- [ >- "aliexpress/aliexpress_capture_context1_frame001.cpp", >- "aliexpress/aliexpress_capture_context1_frame002.cpp", >- "aliexpress/aliexpress_capture_context1_frame003.cpp", >- "aliexpress/aliexpress_capture_context1_frame004.cpp", >- "aliexpress/aliexpress_capture_context1_frame005.cpp", >- "aliexpress/aliexpress_capture_context1_frame006.cpp", >- "aliexpress/aliexpress_capture_context1_frame007.cpp", >- "aliexpress/aliexpress_capture_context1_frame008.cpp", >- "aliexpress/aliexpress_capture_context1_frame009.cpp", >- "aliexpress/aliexpress_capture_context1_frame010.cpp", >- ], >- [ "aliexpress/aliexpress_capture_context1.angledata.gz" ], >- "aliexpress/aliexpress_capture_context1", >- ], >- [ >- "among_us", >- 1, >- [ >- "among_us/among_us_capture_context1_frame001.cpp", >- "among_us/among_us_capture_context1_frame002.cpp", >- "among_us/among_us_capture_context1_frame003.cpp", >- "among_us/among_us_capture_context1_frame004.cpp", >- "among_us/among_us_capture_context1_frame005.cpp", >- "among_us/among_us_capture_context1_frame006.cpp", >- "among_us/among_us_capture_context1_frame007.cpp", >- "among_us/among_us_capture_context1_frame008.cpp", >- "among_us/among_us_capture_context1_frame009.cpp", >- "among_us/among_us_capture_context1_frame010.cpp", >- ], >- [ "among_us/among_us_capture_context1.angledata.gz" ], >- "among_us/among_us_capture_context1", >- ], >- [ >- "angry_birds_2_1500", >- 1, >- [ >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame001.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame002.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame003.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame004.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame005.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame006.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame007.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame008.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame009.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame010.cpp", >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1_frame011.cpp", >- ], >- [ "angry_birds_2_1500/angry_birds_2_1500_capture_context1.angledata.gz" ], >- "angry_birds_2_1500/angry_birds_2_1500_capture_context1", >- ], >- [ >- "arena_of_valor", >- 1, >- [ >- "arena_of_valor/arena_of_valor_capture_context1_frame001.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame002.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame003.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame004.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame005.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame006.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame007.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame008.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame009.cpp", >- "arena_of_valor/arena_of_valor_capture_context1_frame010.cpp", >- ], >- [ "arena_of_valor/arena_of_valor_capture_context1.angledata.gz" ], >- "arena_of_valor/arena_of_valor_capture_context1", >- ], >- [ >- "asphalt_8", >- 1, >- [ >- "asphalt_8/asphalt_8_capture_context1_frame001.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame002.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame003.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame004.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame005.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame006.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame007.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame008.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame009.cpp", >- "asphalt_8/asphalt_8_capture_context1_frame010.cpp", >- ], >- [ "asphalt_8/asphalt_8_capture_context1.angledata.gz" ], >- "asphalt_8/asphalt_8_capture_context1", >- ], >- [ >- "asphalt_9", >- 2, >- [ >- "asphalt_9/asphalt_9_context2_frame001.cpp", >- "asphalt_9/asphalt_9_context2_frame002.cpp", >- "asphalt_9/asphalt_9_context2_frame003.cpp", >- "asphalt_9/asphalt_9_context2_frame004.cpp", >- "asphalt_9/asphalt_9_context2_frame005.cpp", >- "asphalt_9/asphalt_9_context2_frame006.cpp", >- "asphalt_9/asphalt_9_context2_frame007.cpp", >- "asphalt_9/asphalt_9_context2_frame008.cpp", >- "asphalt_9/asphalt_9_context2_frame009.cpp", >- "asphalt_9/asphalt_9_context2_frame010.cpp", >- "asphalt_9/asphalt_9_context2_frame011.cpp", >- "asphalt_9/asphalt_9_context2_frame012.cpp", >- "asphalt_9/asphalt_9_context2_frame013.cpp", >- "asphalt_9/asphalt_9_context2_frame014.cpp", >- "asphalt_9/asphalt_9_context2_frame015.cpp", >- "asphalt_9/asphalt_9_context2_frame016.cpp", >- "asphalt_9/asphalt_9_context2_frame017.cpp", >- "asphalt_9/asphalt_9_context2_frame018.cpp", >- "asphalt_9/asphalt_9_context2_frame019.cpp", >- "asphalt_9/asphalt_9_context2_frame020.cpp", >- "asphalt_9/asphalt_9_context2_frame021.cpp", >- "asphalt_9/asphalt_9_context2_frame022.cpp", >- "asphalt_9/asphalt_9_context2_frame023.cpp", >- "asphalt_9/asphalt_9_context2_frame024.cpp", >- "asphalt_9/asphalt_9_context2_frame025.cpp", >- "asphalt_9/asphalt_9_context2_frame026.cpp", >- "asphalt_9/asphalt_9_context2_frame027.cpp", >- "asphalt_9/asphalt_9_context2_frame028.cpp", >- "asphalt_9/asphalt_9_context2_frame029.cpp", >- "asphalt_9/asphalt_9_context2_frame030.cpp", >- "asphalt_9/asphalt_9_context2_frame031.cpp", >- "asphalt_9/asphalt_9_context2_frame032.cpp", >- "asphalt_9/asphalt_9_context2_frame033.cpp", >- "asphalt_9/asphalt_9_context2_frame034.cpp", >- "asphalt_9/asphalt_9_context2_frame035.cpp", >- "asphalt_9/asphalt_9_context2_frame036.cpp", >- "asphalt_9/asphalt_9_context2_frame037.cpp", >- "asphalt_9/asphalt_9_context2_frame038.cpp", >- "asphalt_9/asphalt_9_context2_frame039.cpp", >- "asphalt_9/asphalt_9_context2_frame040.cpp", >- "asphalt_9/asphalt_9_context2_frame041.cpp", >- "asphalt_9/asphalt_9_context2_frame042.cpp", >- "asphalt_9/asphalt_9_context2_frame043.cpp", >- "asphalt_9/asphalt_9_context2_frame044.cpp", >- "asphalt_9/asphalt_9_context2_frame045.cpp", >- "asphalt_9/asphalt_9_context2_frame046.cpp", >- "asphalt_9/asphalt_9_context2_frame047.cpp", >- "asphalt_9/asphalt_9_context2_frame048.cpp", >- "asphalt_9/asphalt_9_context2_frame049.cpp", >- "asphalt_9/asphalt_9_context2_frame050.cpp", >- "asphalt_9/asphalt_9_context2_frame051.cpp", >- "asphalt_9/asphalt_9_context2_frame052.cpp", >- "asphalt_9/asphalt_9_context2_frame053.cpp", >- "asphalt_9/asphalt_9_context2_frame054.cpp", >- "asphalt_9/asphalt_9_context2_frame055.cpp", >- "asphalt_9/asphalt_9_context2_frame056.cpp", >- "asphalt_9/asphalt_9_context2_frame057.cpp", >- "asphalt_9/asphalt_9_context2_frame058.cpp", >- "asphalt_9/asphalt_9_context2_frame059.cpp", >- "asphalt_9/asphalt_9_context2_frame060.cpp", >- "asphalt_9/asphalt_9_context2_frame061.cpp", >- "asphalt_9/asphalt_9_context2_frame062.cpp", >- "asphalt_9/asphalt_9_context2_frame063.cpp", >- "asphalt_9/asphalt_9_context2_frame064.cpp", >- "asphalt_9/asphalt_9_context2_frame065.cpp", >- "asphalt_9/asphalt_9_context2_frame066.cpp", >- "asphalt_9/asphalt_9_context2_frame067.cpp", >- "asphalt_9/asphalt_9_context2_frame068.cpp", >- "asphalt_9/asphalt_9_context2_frame069.cpp", >- "asphalt_9/asphalt_9_context2_frame070.cpp", >- "asphalt_9/asphalt_9_context2_frame071.cpp", >- "asphalt_9/asphalt_9_context2_frame072.cpp", >- "asphalt_9/asphalt_9_context2_frame073.cpp", >- "asphalt_9/asphalt_9_context2_frame074.cpp", >- "asphalt_9/asphalt_9_context2_frame075.cpp", >- "asphalt_9/asphalt_9_context2_frame076.cpp", >- "asphalt_9/asphalt_9_context2_frame077.cpp", >- "asphalt_9/asphalt_9_context2_frame078.cpp", >- "asphalt_9/asphalt_9_context2_frame079.cpp", >- "asphalt_9/asphalt_9_context2_frame080.cpp", >- "asphalt_9/asphalt_9_context2_frame081.cpp", >- "asphalt_9/asphalt_9_context2_frame082.cpp", >- "asphalt_9/asphalt_9_context2_frame083.cpp", >- "asphalt_9/asphalt_9_context2_frame084.cpp", >- "asphalt_9/asphalt_9_context2_frame085.cpp", >- "asphalt_9/asphalt_9_context2_frame086.cpp", >- "asphalt_9/asphalt_9_context2_frame087.cpp", >- "asphalt_9/asphalt_9_context2_frame088.cpp", >- "asphalt_9/asphalt_9_context2_frame089.cpp", >- "asphalt_9/asphalt_9_context2_frame090.cpp", >- "asphalt_9/asphalt_9_context2_frame091.cpp", >- "asphalt_9/asphalt_9_context2_frame092.cpp", >- "asphalt_9/asphalt_9_context2_frame093.cpp", >- "asphalt_9/asphalt_9_context2_frame094.cpp", >- "asphalt_9/asphalt_9_context2_frame095.cpp", >- "asphalt_9/asphalt_9_context2_frame096.cpp", >- "asphalt_9/asphalt_9_context2_frame097.cpp", >- "asphalt_9/asphalt_9_context2_frame098.cpp", >- "asphalt_9/asphalt_9_context2_frame099.cpp", >- "asphalt_9/asphalt_9_context2_frame100.cpp", >- "asphalt_9/asphalt_9_context3_frame001.cpp", >- "asphalt_9/asphalt_9_context4_frame001.cpp", >- "asphalt_9/asphalt_9_context6_frame001.cpp", >- "asphalt_9/asphalt_9_context5_frame001.cpp", >- "asphalt_9/asphalt_9_shared.cpp", >- ], >- [ >- "asphalt_9/asphalt_9.angledata.gz", >- "asphalt_9/asphalt_9.json", >- ], >- "asphalt_9/asphalt_9_context2", >- ], >- [ >- "avakin_life", >- 1, >- [ >- "avakin_life/avakin_life_capture_context1_frame001.cpp", >- "avakin_life/avakin_life_capture_context1_frame002.cpp", >- "avakin_life/avakin_life_capture_context1_frame003.cpp", >- "avakin_life/avakin_life_capture_context1_frame004.cpp", >- "avakin_life/avakin_life_capture_context1_frame005.cpp", >- "avakin_life/avakin_life_capture_context1_frame006.cpp", >- "avakin_life/avakin_life_capture_context1_frame007.cpp", >- "avakin_life/avakin_life_capture_context1_frame008.cpp", >- "avakin_life/avakin_life_capture_context1_frame009.cpp", >- "avakin_life/avakin_life_capture_context1_frame010.cpp", >- ], >- [ "avakin_life/avakin_life_capture_context1.angledata.gz" ], >- "avakin_life/avakin_life_capture_context1", >- ], >- [ >- "aztec_ruins", >- 1, >- [ >- "aztec_ruins/aztec_ruins_capture_context1_frame001.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame002.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame003.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame004.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame005.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame006.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame007.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame008.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame009.cpp", >- "aztec_ruins/aztec_ruins_capture_context1_frame010.cpp", >- ], >- [ "aztec_ruins/aztec_ruins_capture_context1.angledata.gz" ], >- "aztec_ruins/aztec_ruins_capture_context1", >- ], >- [ >- "badland", >- 2, >- [ >- "badland/badland_context2_frame001.cpp", >- "badland/badland_context2_frame002.cpp", >- "badland/badland_context2_frame003.cpp", >- "badland/badland_context2_frame004.cpp", >- "badland/badland_context2_frame005.cpp", >- "badland/badland_context2_frame006.cpp", >- "badland/badland_context2_frame007.cpp", >- "badland/badland_context2_frame008.cpp", >- "badland/badland_context2_frame009.cpp", >- "badland/badland_context2_frame010.cpp", >- "badland/badland_context2_frame011.cpp", >- "badland/badland_context2_frame012.cpp", >- "badland/badland_context2_frame013.cpp", >- "badland/badland_context2_frame014.cpp", >- "badland/badland_context2_frame015.cpp", >- "badland/badland_context2_frame016.cpp", >- "badland/badland_context2_frame017.cpp", >- "badland/badland_context2_frame018.cpp", >- "badland/badland_context2_frame019.cpp", >- "badland/badland_context2_frame020.cpp", >- "badland/badland_context2_frame021.cpp", >- "badland/badland_context2_frame022.cpp", >- "badland/badland_context2_frame023.cpp", >- "badland/badland_context2_frame024.cpp", >- "badland/badland_context2_frame025.cpp", >- "badland/badland_context2_frame026.cpp", >- "badland/badland_context2_frame027.cpp", >- "badland/badland_context2_frame028.cpp", >- "badland/badland_context2_frame029.cpp", >- "badland/badland_context2_frame030.cpp", >- "badland/badland_shared.cpp", >- ], >- [ >- "badland/badland.angledata.gz", >- "badland/badland.json", >- ], >- "badland/badland_context2", >- ], >- [ >- "beach_buggy_racing", >- 1, >- [ >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame001.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame002.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame003.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame004.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame005.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame006.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame007.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame008.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame009.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame010.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame011.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame012.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame013.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame014.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame015.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame016.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame017.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame018.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame019.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame020.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame021.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame022.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame023.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame024.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame025.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame026.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame027.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame028.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame029.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame030.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame031.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame032.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame033.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame034.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame035.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame036.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame037.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame038.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame039.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame040.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame041.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame042.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame043.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame044.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame045.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame046.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame047.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame048.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame049.cpp", >- "beach_buggy_racing/beach_buggy_racing_capture_context1_frame050.cpp", >- ], >- [ "beach_buggy_racing/beach_buggy_racing_capture_context1.angledata.gz" ], >- "beach_buggy_racing/beach_buggy_racing_capture_context1", >- ], >- [ >- "blockman_go", >- 2, >- [ >- "blockman_go/blockman_go_capture_context2_frame001.cpp", >- "blockman_go/blockman_go_capture_context2_frame002.cpp", >- "blockman_go/blockman_go_capture_context2_frame003.cpp", >- "blockman_go/blockman_go_capture_context2_frame004.cpp", >- "blockman_go/blockman_go_capture_context2_frame005.cpp", >- "blockman_go/blockman_go_capture_context2_frame006.cpp", >- "blockman_go/blockman_go_capture_context2_frame007.cpp", >- "blockman_go/blockman_go_capture_context2_frame008.cpp", >- "blockman_go/blockman_go_capture_context2_frame009.cpp", >- "blockman_go/blockman_go_capture_context2_frame010.cpp", >- "blockman_go/blockman_go_capture_context2_frame011.cpp", >- "blockman_go/blockman_go_capture_context2_frame012.cpp", >- "blockman_go/blockman_go_capture_context2_frame013.cpp", >- "blockman_go/blockman_go_capture_context2_frame014.cpp", >- "blockman_go/blockman_go_capture_context2_frame015.cpp", >- "blockman_go/blockman_go_capture_context2_frame016.cpp", >- "blockman_go/blockman_go_capture_context2_frame017.cpp", >- "blockman_go/blockman_go_capture_context2_frame018.cpp", >- "blockman_go/blockman_go_capture_context2_frame019.cpp", >- "blockman_go/blockman_go_capture_context2_frame020.cpp", >- "blockman_go/blockman_go_capture_context2_frame021.cpp", >- "blockman_go/blockman_go_capture_context2_frame022.cpp", >- "blockman_go/blockman_go_capture_context2_frame023.cpp", >- "blockman_go/blockman_go_capture_context2_frame024.cpp", >- "blockman_go/blockman_go_capture_context2_frame025.cpp", >- "blockman_go/blockman_go_capture_context2_frame026.cpp", >- "blockman_go/blockman_go_capture_context2_frame027.cpp", >- "blockman_go/blockman_go_capture_context2_frame028.cpp", >- "blockman_go/blockman_go_capture_context2_frame029.cpp", >- "blockman_go/blockman_go_capture_context2_frame030.cpp", >- "blockman_go/blockman_go_capture_context2_frame031.cpp", >- "blockman_go/blockman_go_capture_context2_frame032.cpp", >- "blockman_go/blockman_go_capture_context2_frame033.cpp", >- "blockman_go/blockman_go_capture_context2_frame034.cpp", >- "blockman_go/blockman_go_capture_context2_frame035.cpp", >- "blockman_go/blockman_go_capture_context2_frame036.cpp", >- "blockman_go/blockman_go_capture_context2_frame037.cpp", >- "blockman_go/blockman_go_capture_context2_frame038.cpp", >- "blockman_go/blockman_go_capture_context2_frame039.cpp", >- "blockman_go/blockman_go_capture_context2_frame040.cpp", >- "blockman_go/blockman_go_capture_context2_frame041.cpp", >- "blockman_go/blockman_go_capture_context2_frame042.cpp", >- "blockman_go/blockman_go_capture_context2_frame043.cpp", >- "blockman_go/blockman_go_capture_context2_frame044.cpp", >- "blockman_go/blockman_go_capture_context2_frame045.cpp", >- "blockman_go/blockman_go_capture_context2_frame046.cpp", >- "blockman_go/blockman_go_capture_context2_frame047.cpp", >- "blockman_go/blockman_go_capture_context2_frame048.cpp", >- "blockman_go/blockman_go_capture_context2_frame049.cpp", >- "blockman_go/blockman_go_capture_context2_frame050.cpp", >- "blockman_go/blockman_go_capture_context2_frame051.cpp", >- "blockman_go/blockman_go_capture_context2_frame052.cpp", >- "blockman_go/blockman_go_capture_context2_frame053.cpp", >- "blockman_go/blockman_go_capture_context2_frame054.cpp", >- "blockman_go/blockman_go_capture_context2_frame055.cpp", >- "blockman_go/blockman_go_capture_context2_frame056.cpp", >- "blockman_go/blockman_go_capture_context2_frame057.cpp", >- "blockman_go/blockman_go_capture_context2_frame058.cpp", >- "blockman_go/blockman_go_capture_context2_frame059.cpp", >- "blockman_go/blockman_go_capture_context2_frame060.cpp", >- "blockman_go/blockman_go_capture_context2_frame061.cpp", >- "blockman_go/blockman_go_capture_context2_frame062.cpp", >- "blockman_go/blockman_go_capture_context2_frame063.cpp", >- "blockman_go/blockman_go_capture_context2_frame064.cpp", >- "blockman_go/blockman_go_capture_context2_frame065.cpp", >- "blockman_go/blockman_go_capture_context2_frame066.cpp", >- "blockman_go/blockman_go_capture_context2_frame067.cpp", >- "blockman_go/blockman_go_capture_context2_frame068.cpp", >- "blockman_go/blockman_go_capture_context2_frame069.cpp", >- "blockman_go/blockman_go_capture_context2_frame070.cpp", >- "blockman_go/blockman_go_capture_context2_frame071.cpp", >- "blockman_go/blockman_go_capture_context2_frame072.cpp", >- "blockman_go/blockman_go_capture_context2_frame073.cpp", >- "blockman_go/blockman_go_capture_context2_frame074.cpp", >- "blockman_go/blockman_go_capture_context2_frame075.cpp", >- "blockman_go/blockman_go_capture_context2_frame076.cpp", >- "blockman_go/blockman_go_capture_context2_frame077.cpp", >- "blockman_go/blockman_go_capture_context2_frame078.cpp", >- "blockman_go/blockman_go_capture_context2_frame079.cpp", >- "blockman_go/blockman_go_capture_context2_frame080.cpp", >- "blockman_go/blockman_go_capture_context2_frame081.cpp", >- "blockman_go/blockman_go_capture_context2_frame082.cpp", >- "blockman_go/blockman_go_capture_context2_frame083.cpp", >- "blockman_go/blockman_go_capture_context2_frame084.cpp", >- "blockman_go/blockman_go_capture_context2_frame085.cpp", >- "blockman_go/blockman_go_capture_context2_frame086.cpp", >- "blockman_go/blockman_go_capture_context2_frame087.cpp", >- "blockman_go/blockman_go_capture_context2_frame088.cpp", >- "blockman_go/blockman_go_capture_context2_frame089.cpp", >- "blockman_go/blockman_go_capture_context2_frame090.cpp", >- "blockman_go/blockman_go_capture_context2_frame091.cpp", >- "blockman_go/blockman_go_capture_context2_frame092.cpp", >- "blockman_go/blockman_go_capture_context2_frame093.cpp", >- "blockman_go/blockman_go_capture_context2_frame094.cpp", >- "blockman_go/blockman_go_capture_context2_frame095.cpp", >- "blockman_go/blockman_go_capture_context2_frame096.cpp", >- "blockman_go/blockman_go_capture_context2_frame097.cpp", >- "blockman_go/blockman_go_capture_context2_frame098.cpp", >- "blockman_go/blockman_go_capture_context2_frame099.cpp", >- "blockman_go/blockman_go_capture_context2_frame100.cpp", >- "blockman_go/blockman_go_capture_shared.cpp", >- ], >- [ "blockman_go/blockman_go.angledata.gz" ], >- "blockman_go/blockman_go_capture_context2", >- ], >- [ >- "brawl_stars", >- 1, >- [ >- "brawl_stars/brawl_stars_capture_context1_frame001.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame002.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame003.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame004.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame005.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame006.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame007.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame008.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame009.cpp", >- "brawl_stars/brawl_stars_capture_context1_frame010.cpp", >- ], >- [ "brawl_stars/brawl_stars_capture_context1.angledata.gz" ], >- "brawl_stars/brawl_stars_capture_context1", >- ], >- [ >- "bricks_breaker_quest", >- 2, >- [ >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame001.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame002.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame003.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame004.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame005.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame006.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame007.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame008.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame009.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame010.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame011.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame012.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame013.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame014.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame015.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame016.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame017.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame018.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame019.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame020.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame021.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame022.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame023.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame024.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame025.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame026.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame027.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame028.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame029.cpp", >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2_frame030.cpp", >- ], >- [ "bricks_breaker_quest/bricks_breaker_quest_capture_context2.angledata.gz" ], >- "bricks_breaker_quest/bricks_breaker_quest_capture_context2", >- ], >- [ >- "bubble_shooter", >- 5, >- [ >- "bubble_shooter/bubble_shooter_capture_context5_frame001.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame002.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame003.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame004.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame005.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame006.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame007.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame008.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame009.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame010.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame011.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame012.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame013.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame014.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame015.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame016.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame017.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame018.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame019.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame020.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame021.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame022.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame023.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame024.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame025.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame026.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame027.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame028.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame029.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame030.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame031.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame032.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame033.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame034.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame035.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame036.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame037.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame038.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame039.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame040.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame041.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame042.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame043.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame044.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame045.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame046.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame047.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame048.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame049.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame050.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame051.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame052.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame053.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame054.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame055.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame056.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame057.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame058.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame059.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame060.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame061.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame062.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame063.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame064.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame065.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame066.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame067.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame068.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame069.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame070.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame071.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame072.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame073.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame074.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame075.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame076.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame077.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame078.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame079.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame080.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame081.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame082.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame083.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame084.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame085.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame086.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame087.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame088.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame089.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame090.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame091.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame092.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame093.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame094.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame095.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame096.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame097.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame098.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame099.cpp", >- "bubble_shooter/bubble_shooter_capture_context5_frame100.cpp", >- ], >- [ "bubble_shooter/bubble_shooter_capture_context5.angledata.gz" ], >- "bubble_shooter/bubble_shooter_capture_context5", >- ], >- [ >- "bus_simulator_indonesia", >- 1, >- [ >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame001.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame002.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame003.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame004.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame005.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame006.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame007.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame008.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame009.cpp", >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1_frame010.cpp", >- ], >- [ "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1.angledata.gz" ], >- "bus_simulator_indonesia/bus_simulator_indonesia_capture_context1", >- ], >- [ >- "call_break_offline_card_game", >- 2, >- [ >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame001.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame002.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame003.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame004.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame005.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame006.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame007.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame008.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame009.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame010.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame011.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame012.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame013.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame014.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame015.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame016.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame017.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame018.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame019.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame020.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame021.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame022.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame023.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame024.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame025.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame026.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame027.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame028.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame029.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame030.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame031.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame032.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame033.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame034.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame035.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame036.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame037.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame038.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame039.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame040.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame041.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame042.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame043.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame044.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame045.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame046.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame047.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame048.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame049.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame050.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame051.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame052.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame053.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame054.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame055.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame056.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame057.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame058.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame059.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame060.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame061.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame062.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame063.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame064.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame065.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame066.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame067.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame068.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame069.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame070.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame071.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame072.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame073.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame074.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame075.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame076.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame077.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame078.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame079.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame080.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame081.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame082.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame083.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame084.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame085.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame086.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame087.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame088.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame089.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame090.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame091.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame092.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame093.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame094.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame095.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame096.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame097.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame098.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame099.cpp", >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2_frame100.cpp", >- ], >- [ "call_break_offline_card_game/call_break_offline_card_game_capture_context2.angledata.gz" ], >- "call_break_offline_card_game/call_break_offline_card_game_capture_context2", >- ], >- [ >- "candy_crush_500", >- 1, >- [ >- "candy_crush_500/candy_crush_500_capture_context1_frame001.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame002.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame003.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame004.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame005.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame006.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame007.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame008.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame009.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame010.cpp", >- "candy_crush_500/candy_crush_500_capture_context1_frame011.cpp", >- ], >- [ "candy_crush_500/candy_crush_500_capture_context1.angledata.gz" ], >- "candy_crush_500/candy_crush_500_capture_context1", >- ], >- [ >- "candy_crush_soda_saga", >- 2, >- [ >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame001.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame002.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame003.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame004.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame005.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame006.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame007.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame008.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame009.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame010.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame011.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame012.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame013.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame014.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame015.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame016.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame017.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame018.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame019.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame020.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame021.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame022.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame023.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame024.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame025.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame026.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame027.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame028.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame029.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame030.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame031.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame032.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame033.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame034.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame035.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame036.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame037.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame038.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame039.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame040.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame041.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame042.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame043.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame044.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame045.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame046.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame047.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame048.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame049.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame050.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame051.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame052.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame053.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame054.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame055.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame056.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame057.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame058.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame059.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame060.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame061.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame062.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame063.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame064.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame065.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame066.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame067.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame068.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame069.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame070.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame071.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame072.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame073.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame074.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame075.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame076.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame077.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame078.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame079.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame080.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame081.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame082.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame083.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame084.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame085.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame086.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame087.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame088.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame089.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame090.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame091.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame092.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame093.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame094.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame095.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame096.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame097.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame098.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame099.cpp", >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2_frame100.cpp", >- ], >- [ "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2.angledata.gz" ], >- "candy_crush_soda_saga/candy_crush_soda_saga_capture_context2", >- ], >- [ >- "car_parking_multiplayer", >- 1, >- [ >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame001.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame002.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame003.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame004.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame005.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame006.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame007.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame008.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame009.cpp", >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1_frame010.cpp", >- ], >- [ "car_parking_multiplayer/car_parking_multiplayer_capture_context1.angledata.gz" ], >- "car_parking_multiplayer/car_parking_multiplayer_capture_context1", >- ], >- [ >- "clash_of_clans", >- 1, >- [ >- "clash_of_clans/clash_of_clans_capture_context1_frame001.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame002.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame003.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame004.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame005.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame006.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame007.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame008.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame009.cpp", >- "clash_of_clans/clash_of_clans_capture_context1_frame010.cpp", >- ], >- [ "clash_of_clans/clash_of_clans_capture_context1.angledata.gz" ], >- "clash_of_clans/clash_of_clans_capture_context1", >- ], >- [ >- "clash_royale", >- 1, >- [ >- "clash_royale/clash_royale_capture_context1_frame001.cpp", >- "clash_royale/clash_royale_capture_context1_frame002.cpp", >- "clash_royale/clash_royale_capture_context1_frame003.cpp", >- "clash_royale/clash_royale_capture_context1_frame004.cpp", >- "clash_royale/clash_royale_capture_context1_frame005.cpp", >- "clash_royale/clash_royale_capture_context1_frame006.cpp", >- "clash_royale/clash_royale_capture_context1_frame007.cpp", >- "clash_royale/clash_royale_capture_context1_frame008.cpp", >- "clash_royale/clash_royale_capture_context1_frame009.cpp", >- "clash_royale/clash_royale_capture_context1_frame010.cpp", >- ], >- [ "clash_royale/clash_royale_capture_context1.angledata.gz" ], >- "clash_royale/clash_royale_capture_context1", >- ], >- [ >- "cod_mobile", >- 1, >- [ >- "cod_mobile/cod_mobile_capture_context1_frame001.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame002.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame003.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame004.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame005.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame006.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame007.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame008.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame009.cpp", >- "cod_mobile/cod_mobile_capture_context1_frame010.cpp", >- ], >- [ "cod_mobile/cod_mobile_capture_context1.angledata.gz" ], >- "cod_mobile/cod_mobile_capture_context1", >- ], >- [ >- "coin_master", >- 1, >- [ >- "coin_master/coin_master_capture_context1_frame001.cpp", >- "coin_master/coin_master_capture_context1_frame002.cpp", >- "coin_master/coin_master_capture_context1_frame003.cpp", >- "coin_master/coin_master_capture_context1_frame004.cpp", >- "coin_master/coin_master_capture_context1_frame005.cpp", >- "coin_master/coin_master_capture_context1_frame006.cpp", >- "coin_master/coin_master_capture_context1_frame007.cpp", >- "coin_master/coin_master_capture_context1_frame008.cpp", >- "coin_master/coin_master_capture_context1_frame009.cpp", >- "coin_master/coin_master_capture_context1_frame010.cpp", >- ], >- [ "coin_master/coin_master_capture_context1.angledata.gz" ], >- "coin_master/coin_master_capture_context1", >- ], >- [ >- "command_and_conquer_rivals", >- 2, >- [ >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame001.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame002.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame003.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame004.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame005.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame006.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame007.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame008.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame009.cpp", >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2_frame010.cpp", >- ], >- [ "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2.angledata.gz" ], >- "command_and_conquer_rivals/command_and_conquer_rivals_capture_context2", >- ], >- [ >- "cookie_run_kingdom", >- 2, >- [ >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame001.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame002.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame003.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame004.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame005.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame006.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame007.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame008.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame009.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame010.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame011.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame012.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame013.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame014.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame015.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame016.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame017.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame018.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame019.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame020.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame021.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame022.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame023.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame024.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame025.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame026.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame027.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame028.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame029.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame030.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame031.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame032.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame033.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame034.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame035.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame036.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame037.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame038.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame039.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame040.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame041.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame042.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame043.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame044.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame045.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame046.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame047.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame048.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame049.cpp", >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2_frame050.cpp", >- ], >- [ "cookie_run_kingdom/cookie_run_kingdom_capture_context2.angledata.gz" ], >- "cookie_run_kingdom/cookie_run_kingdom_capture_context2", >- ], >- [ >- "disney_tsum_tsum", >- 3, >- [ >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame001.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame002.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame003.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame004.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame005.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame006.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame007.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame008.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame009.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame010.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame011.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame012.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame013.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame014.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame015.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame016.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame017.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame018.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame019.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame020.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame021.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame022.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame023.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame024.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame025.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame026.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame027.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame028.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame029.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame030.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame031.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame032.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame033.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame034.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame035.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame036.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame037.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame038.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame039.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame040.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame041.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame042.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame043.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame044.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame045.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame046.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame047.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame048.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame049.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame050.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame051.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame052.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame053.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame054.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame055.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame056.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame057.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame058.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame059.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame060.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame061.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame062.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame063.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame064.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame065.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame066.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame067.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame068.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame069.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame070.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame071.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame072.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame073.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame074.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame075.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame076.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame077.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame078.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame079.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame080.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame081.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame082.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame083.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame084.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame085.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame086.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame087.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame088.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame089.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame090.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame091.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame092.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame093.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame094.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame095.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame096.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame097.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame098.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame099.cpp", >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3_frame100.cpp", >- ], >- [ "disney_tsum_tsum/disney_tsum_tsum_capture_context3.angledata.gz" ], >- "disney_tsum_tsum/disney_tsum_tsum_capture_context3", >- ], >- [ >- "dota_underlords", >- 4, >- [ >- "dota_underlords/dota_underlords_context4_001.cpp", >- "dota_underlords/dota_underlords_context4_002.cpp", >- "dota_underlords/dota_underlords_context4_003.cpp", >- "dota_underlords/dota_underlords_context4_004.cpp", >- "dota_underlords/dota_underlords_context4_005.cpp", >- "dota_underlords/dota_underlords_context4_006.cpp", >- "dota_underlords/dota_underlords_context4_007.cpp", >- "dota_underlords/dota_underlords_context4_008.cpp", >- "dota_underlords/dota_underlords_context4_009.cpp", >- "dota_underlords/dota_underlords_context4_010.cpp", >- "dota_underlords/dota_underlords_context4_011.cpp", >- "dota_underlords/dota_underlords_context4_012.cpp", >- "dota_underlords/dota_underlords_context4_013.cpp", >- "dota_underlords/dota_underlords_context4_014.cpp", >- "dota_underlords/dota_underlords_context4_015.cpp", >- "dota_underlords/dota_underlords_context4_016.cpp", >- "dota_underlords/dota_underlords_context4_017.cpp", >- "dota_underlords/dota_underlords_context4_018.cpp", >- "dota_underlords/dota_underlords_context4_019.cpp", >- "dota_underlords/dota_underlords_context4_020.cpp", >- "dota_underlords/dota_underlords_context4_021.cpp", >- "dota_underlords/dota_underlords_context4_022.cpp", >- "dota_underlords/dota_underlords_context4_023.cpp", >- "dota_underlords/dota_underlords_context4_024.cpp", >- "dota_underlords/dota_underlords_context4_025.cpp", >- "dota_underlords/dota_underlords_context4_026.cpp", >- "dota_underlords/dota_underlords_context4_027.cpp", >- "dota_underlords/dota_underlords_context4_028.cpp", >- "dota_underlords/dota_underlords_context4_029.cpp", >- "dota_underlords/dota_underlords_context4_030.cpp", >- "dota_underlords/dota_underlords_context4_031.cpp", >- "dota_underlords/dota_underlords_context4_032.cpp", >- "dota_underlords/dota_underlords_context4_033.cpp", >- "dota_underlords/dota_underlords_context4_034.cpp", >- "dota_underlords/dota_underlords_context4_035.cpp", >- "dota_underlords/dota_underlords_context4_036.cpp", >- "dota_underlords/dota_underlords_context4_037.cpp", >- "dota_underlords/dota_underlords_context4_038.cpp", >- "dota_underlords/dota_underlords_context4_039.cpp", >- "dota_underlords/dota_underlords_context4_040.cpp", >- "dota_underlords/dota_underlords_context4_041.cpp", >- "dota_underlords/dota_underlords_context4_042.cpp", >- "dota_underlords/dota_underlords_context4_043.cpp", >- "dota_underlords/dota_underlords_context4_044.cpp", >- "dota_underlords/dota_underlords_context4_045.cpp", >- "dota_underlords/dota_underlords_context4_046.cpp", >- "dota_underlords/dota_underlords_context4_047.cpp", >- "dota_underlords/dota_underlords_context4_048.cpp", >- "dota_underlords/dota_underlords_context4_049.cpp", >- "dota_underlords/dota_underlords_context4_050.cpp", >- "dota_underlords/dota_underlords_context4_051.cpp", >- "dota_underlords/dota_underlords_context4_052.cpp", >- "dota_underlords/dota_underlords_context4_053.cpp", >- "dota_underlords/dota_underlords_context4_054.cpp", >- "dota_underlords/dota_underlords_context4_055.cpp", >- "dota_underlords/dota_underlords_context4_056.cpp", >- "dota_underlords/dota_underlords_context4_057.cpp", >- "dota_underlords/dota_underlords_context4_058.cpp", >- "dota_underlords/dota_underlords_context4_059.cpp", >- "dota_underlords/dota_underlords_context4_060.cpp", >- "dota_underlords/dota_underlords_context4_061.cpp", >- "dota_underlords/dota_underlords_context4_062.cpp", >- "dota_underlords/dota_underlords_context4_063.cpp", >- "dota_underlords/dota_underlords_context4_064.cpp", >- "dota_underlords/dota_underlords_context4_065.cpp", >- "dota_underlords/dota_underlords_context4_066.cpp", >- "dota_underlords/dota_underlords_context4_067.cpp", >- "dota_underlords/dota_underlords_context4_068.cpp", >- "dota_underlords/dota_underlords_context4_069.cpp", >- "dota_underlords/dota_underlords_context4_070.cpp", >- "dota_underlords/dota_underlords_context4_071.cpp", >- "dota_underlords/dota_underlords_shared.cpp", >- ], >- [ >- "dota_underlords/dota_underlords.angledata.gz", >- "dota_underlords/dota_underlords.json", >- ], >- "dota_underlords/dota_underlords_context4", >- ], >- [ >- "dr_driving", >- 3, >- [ >- "dr_driving/dr_driving_capture_context3_frame001.cpp", >- "dr_driving/dr_driving_capture_context3_frame002.cpp", >- "dr_driving/dr_driving_capture_context3_frame003.cpp", >- "dr_driving/dr_driving_capture_context3_frame004.cpp", >- "dr_driving/dr_driving_capture_context3_frame005.cpp", >- "dr_driving/dr_driving_capture_context3_frame006.cpp", >- "dr_driving/dr_driving_capture_context3_frame007.cpp", >- "dr_driving/dr_driving_capture_context3_frame008.cpp", >- "dr_driving/dr_driving_capture_context3_frame009.cpp", >- "dr_driving/dr_driving_capture_context3_frame010.cpp", >- "dr_driving/dr_driving_capture_context3_frame011.cpp", >- "dr_driving/dr_driving_capture_context3_frame012.cpp", >- "dr_driving/dr_driving_capture_context3_frame013.cpp", >- "dr_driving/dr_driving_capture_context3_frame014.cpp", >- "dr_driving/dr_driving_capture_context3_frame015.cpp", >- "dr_driving/dr_driving_capture_context3_frame016.cpp", >- "dr_driving/dr_driving_capture_context3_frame017.cpp", >- "dr_driving/dr_driving_capture_context3_frame018.cpp", >- "dr_driving/dr_driving_capture_context3_frame019.cpp", >- "dr_driving/dr_driving_capture_context3_frame020.cpp", >- "dr_driving/dr_driving_capture_context3_frame021.cpp", >- "dr_driving/dr_driving_capture_context3_frame022.cpp", >- "dr_driving/dr_driving_capture_context3_frame023.cpp", >- "dr_driving/dr_driving_capture_context3_frame024.cpp", >- "dr_driving/dr_driving_capture_context3_frame025.cpp", >- "dr_driving/dr_driving_capture_context3_frame026.cpp", >- "dr_driving/dr_driving_capture_context3_frame027.cpp", >- "dr_driving/dr_driving_capture_context3_frame028.cpp", >- "dr_driving/dr_driving_capture_context3_frame029.cpp", >- "dr_driving/dr_driving_capture_context3_frame030.cpp", >- "dr_driving/dr_driving_capture_context3_frame031.cpp", >- "dr_driving/dr_driving_capture_context3_frame032.cpp", >- "dr_driving/dr_driving_capture_context3_frame033.cpp", >- "dr_driving/dr_driving_capture_context3_frame034.cpp", >- "dr_driving/dr_driving_capture_context3_frame035.cpp", >- "dr_driving/dr_driving_capture_context3_frame036.cpp", >- "dr_driving/dr_driving_capture_context3_frame037.cpp", >- "dr_driving/dr_driving_capture_context3_frame038.cpp", >- "dr_driving/dr_driving_capture_context3_frame039.cpp", >- "dr_driving/dr_driving_capture_context3_frame040.cpp", >- "dr_driving/dr_driving_capture_context3_frame041.cpp", >- "dr_driving/dr_driving_capture_context3_frame042.cpp", >- "dr_driving/dr_driving_capture_context3_frame043.cpp", >- "dr_driving/dr_driving_capture_context3_frame044.cpp", >- "dr_driving/dr_driving_capture_context3_frame045.cpp", >- "dr_driving/dr_driving_capture_context3_frame046.cpp", >- "dr_driving/dr_driving_capture_context3_frame047.cpp", >- "dr_driving/dr_driving_capture_context3_frame048.cpp", >- "dr_driving/dr_driving_capture_context3_frame049.cpp", >- "dr_driving/dr_driving_capture_context3_frame050.cpp", >- ], >- [ "dr_driving/dr_driving_capture_context3.angledata.gz" ], >- "dr_driving/dr_driving_capture_context3", >- ], >- [ >- "dragon_ball_legends", >- 1, >- [ >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame001.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame002.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame003.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame004.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame005.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame006.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame007.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame008.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame009.cpp", >- "dragon_ball_legends/dragon_ball_legends_capture_context1_frame010.cpp", >- ], >- [ "dragon_ball_legends/dragon_ball_legends_capture_context1.angledata.gz" ], >- "dragon_ball_legends/dragon_ball_legends_capture_context1", >- ], >- [ >- "dragon_raja", >- 1, >- [ >- "dragon_raja/dragon_raja_capture_context1_frame001.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame002.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame003.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame004.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame005.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame006.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame007.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame008.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame009.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame010.cpp", >- "dragon_raja/dragon_raja_capture_context1_frame011.cpp", >- ], >- [ "dragon_raja/dragon_raja_capture_context1.angledata.gz" ], >- "dragon_raja/dragon_raja_capture_context1", >- ], >- [ >- "efootball_pes_2021", >- 1, >- [ >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame001.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame002.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame003.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame004.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame005.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame006.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame007.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame008.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame009.cpp", >- "efootball_pes_2021/efootball_pes_2021_capture_context1_frame010.cpp", >- ], >- [ "efootball_pes_2021/efootball_pes_2021_capture_context1.angledata.gz" ], >- "efootball_pes_2021/efootball_pes_2021_capture_context1", >- ], >- [ >- "egypt_1500", >- 1, >- [ >- "egypt_1500/egypt_1500_capture_context1_frame001.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame002.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame003.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame004.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame005.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame006.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame007.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame008.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame009.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame010.cpp", >- "egypt_1500/egypt_1500_capture_context1_frame011.cpp", >- ], >- [ "egypt_1500/egypt_1500_capture_context1.angledata.gz" ], >- "egypt_1500/egypt_1500_capture_context1", >- ], >- [ >- "eight_ball_pool", >- 1, >- [ >- "eight_ball_pool/eight_ball_pool_capture_context1_frame001.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame002.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame003.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame004.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame005.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame006.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame007.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame008.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame009.cpp", >- "eight_ball_pool/eight_ball_pool_capture_context1_frame010.cpp", >- ], >- [ "eight_ball_pool/eight_ball_pool_capture_context1.angledata.gz" ], >- "eight_ball_pool/eight_ball_pool_capture_context1", >- ], >- [ >- "extreme_car_driving_simulator", >- 1, >- [ >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame001.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame002.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame003.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame004.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame005.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame006.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame007.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame008.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame009.cpp", >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1_frame010.cpp", >- ], >- [ "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1.angledata.gz" ], >- "extreme_car_driving_simulator/extreme_car_driving_simulator_capture_context1", >- ], >- [ >- "fallout_shelter_online", >- 1, >- [ >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame001.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame002.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame003.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame004.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame005.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame006.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame007.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame008.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame009.cpp", >- "fallout_shelter_online/fallout_shelter_online_capture_context1_frame010.cpp", >- ], >- [ "fallout_shelter_online/fallout_shelter_online_capture_context1.angledata.gz" ], >- "fallout_shelter_online/fallout_shelter_online_capture_context1", >- ], >- [ >- "farm_heroes_saga", >- 2, >- [ >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame001.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame002.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame003.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame004.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame005.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame006.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame007.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame008.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame009.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame010.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame011.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame012.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame013.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame014.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame015.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame016.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame017.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame018.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame019.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame020.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame021.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame022.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame023.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame024.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame025.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame026.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame027.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame028.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame029.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame030.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame031.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame032.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame033.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame034.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame035.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame036.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame037.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame038.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame039.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame040.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame041.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame042.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame043.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame044.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame045.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame046.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame047.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame048.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame049.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame050.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame051.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame052.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame053.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame054.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame055.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame056.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame057.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame058.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame059.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame060.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame061.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame062.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame063.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame064.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame065.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame066.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame067.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame068.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame069.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame070.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame071.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame072.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame073.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame074.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame075.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame076.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame077.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame078.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame079.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame080.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame081.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame082.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame083.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame084.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame085.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame086.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame087.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame088.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame089.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame090.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame091.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame092.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame093.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame094.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame095.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame096.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame097.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame098.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame099.cpp", >- "farm_heroes_saga/farm_heroes_saga_capture_context2_frame100.cpp", >- ], >- [ "farm_heroes_saga/farm_heroes_saga_capture_context2.angledata.gz" ], >- "farm_heroes_saga/farm_heroes_saga_capture_context2", >- ], >- [ >- "fate_grand_order", >- 1, >- [ >- "fate_grand_order/fate_grand_order_capture_context1_frame001.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame002.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame003.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame004.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame005.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame006.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame007.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame008.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame009.cpp", >- "fate_grand_order/fate_grand_order_capture_context1_frame010.cpp", >- ], >- [ "fate_grand_order/fate_grand_order_capture_context1.angledata.gz" ], >- "fate_grand_order/fate_grand_order_capture_context1", >- ], >- [ >- "fifa_mobile", >- 1, >- [ >- "fifa_mobile/fifa_mobile_capture_context1_frame001.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame002.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame003.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame004.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame005.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame006.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame007.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame008.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame009.cpp", >- "fifa_mobile/fifa_mobile_capture_context1_frame010.cpp", >- ], >- [ "fifa_mobile/fifa_mobile_capture_context1.angledata.gz" ], >- "fifa_mobile/fifa_mobile_capture_context1", >- ], >- [ >- "final_fantasy", >- 3, >- [ >- "final_fantasy/final_fantasy_capture_context3_frame001.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame002.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame003.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame004.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame005.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame006.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame007.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame008.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame009.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame010.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame011.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame012.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame013.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame014.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame015.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame016.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame017.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame018.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame019.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame020.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame021.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame022.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame023.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame024.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame025.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame026.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame027.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame028.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame029.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame030.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame031.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame032.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame033.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame034.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame035.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame036.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame037.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame038.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame039.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame040.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame041.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame042.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame043.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame044.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame045.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame046.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame047.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame048.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame049.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame050.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame051.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame052.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame053.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame054.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame055.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame056.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame057.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame058.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame059.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame060.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame061.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame062.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame063.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame064.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame065.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame066.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame067.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame068.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame069.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame070.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame071.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame072.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame073.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame074.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame075.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame076.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame077.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame078.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame079.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame080.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame081.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame082.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame083.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame084.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame085.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame086.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame087.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame088.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame089.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame090.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame091.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame092.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame093.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame094.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame095.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame096.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame097.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame098.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame099.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame100.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame101.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame102.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame103.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame104.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame105.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame106.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame107.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame108.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame109.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame110.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame111.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame112.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame113.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame114.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame115.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame116.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame117.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame118.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame119.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame120.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame121.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame122.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame123.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame124.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame125.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame126.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame127.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame128.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame129.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame130.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame131.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame132.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame133.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame134.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame135.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame136.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame137.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame138.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame139.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame140.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame141.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame142.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame143.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame144.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame145.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame146.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame147.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame148.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame149.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame150.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame151.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame152.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame153.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame154.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame155.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame156.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame157.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame158.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame159.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame160.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame161.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame162.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame163.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame164.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame165.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame166.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame167.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame168.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame169.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame170.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame171.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame172.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame173.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame174.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame175.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame176.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame177.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame178.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame179.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame180.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame181.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame182.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame183.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame184.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame185.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame186.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame187.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame188.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame189.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame190.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame191.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame192.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame193.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame194.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame195.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame196.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame197.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame198.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame199.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame200.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame201.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame202.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame203.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame204.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame205.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame206.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame207.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame208.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame209.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame210.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame211.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame212.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame213.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame214.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame215.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame216.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame217.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame218.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame219.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame220.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame221.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame222.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame223.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame224.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame225.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame226.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame227.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame228.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame229.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame230.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame231.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame232.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame233.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame234.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame235.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame236.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame237.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame238.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame239.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame240.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame241.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame242.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame243.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame244.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame245.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame246.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame247.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame248.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame249.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame250.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame251.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame252.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame253.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame254.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame255.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame256.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame257.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame258.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame259.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame260.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame261.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame262.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame263.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame264.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame265.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame266.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame267.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame268.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame269.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame270.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame271.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame272.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame273.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame274.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame275.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame276.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame277.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame278.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame279.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame280.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame281.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame282.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame283.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame284.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame285.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame286.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame287.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame288.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame289.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame290.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame291.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame292.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame293.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame294.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame295.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame296.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame297.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame298.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame299.cpp", >- "final_fantasy/final_fantasy_capture_context3_frame300.cpp", >- "final_fantasy/final_fantasy_frame001.cpp", >- ], >- [ "final_fantasy/final_fantasy.angledata.gz" ], >- "final_fantasy/final_fantasy_capture_context3", >- ], >- [ >- "free_fire", >- 1, >- [ >- "free_fire/free_fire_capture_context1_frame001.cpp", >- "free_fire/free_fire_capture_context1_frame002.cpp", >- "free_fire/free_fire_capture_context1_frame003.cpp", >- "free_fire/free_fire_capture_context1_frame004.cpp", >- "free_fire/free_fire_capture_context1_frame005.cpp", >- "free_fire/free_fire_capture_context1_frame006.cpp", >- "free_fire/free_fire_capture_context1_frame007.cpp", >- "free_fire/free_fire_capture_context1_frame008.cpp", >- "free_fire/free_fire_capture_context1_frame009.cpp", >- "free_fire/free_fire_capture_context1_frame010.cpp", >- ], >- [ "free_fire/free_fire_capture_context1.angledata.gz" ], >- "free_fire/free_fire_capture_context1", >- ], >- [ >- "gardenscapes", >- 1, >- [ >- "gardenscapes/gardenscapes_capture_context1_frame001.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame002.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame003.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame004.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame005.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame006.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame007.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame008.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame009.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame010.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame011.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame012.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame013.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame014.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame015.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame016.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame017.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame018.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame019.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame020.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame021.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame022.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame023.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame024.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame025.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame026.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame027.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame028.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame029.cpp", >- "gardenscapes/gardenscapes_capture_context1_frame030.cpp", >- ], >- [ "gardenscapes/gardenscapes_capture_context1.angledata.gz" ], >- "gardenscapes/gardenscapes_capture_context1", >- ], >- [ >- "genshin_impact", >- 3, >- [ >- "genshin_impact/genshin_impact_capture_context3_frame001.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame002.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame003.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame004.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame005.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame006.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame007.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame008.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame009.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame010.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame011.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame012.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame013.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame014.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame015.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame016.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame017.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame018.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame019.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame020.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame021.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame022.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame023.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame024.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame025.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame026.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame027.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame028.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame029.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame030.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame031.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame032.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame033.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame034.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame035.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame036.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame037.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame038.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame039.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame040.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame041.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame042.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame043.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame044.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame045.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame046.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame047.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame048.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame049.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame050.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame051.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame052.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame053.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame054.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame055.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame056.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame057.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame058.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame059.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame060.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame061.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame062.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame063.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame064.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame065.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame066.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame067.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame068.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame069.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame070.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame071.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame072.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame073.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame074.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame075.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame076.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame077.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame078.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame079.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame080.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame081.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame082.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame083.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame084.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame085.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame086.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame087.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame088.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame089.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame090.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame091.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame092.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame093.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame094.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame095.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame096.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame097.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame098.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame099.cpp", >- "genshin_impact/genshin_impact_capture_context3_frame100.cpp", >- ], >- [ "genshin_impact/genshin_impact_capture_context3.angledata.gz" ], >- "genshin_impact/genshin_impact_capture_context3", >- ], >- [ >- "google_maps", >- 1, >- [ >- "google_maps/google_maps_capture_context1_frame001.cpp", >- "google_maps/google_maps_capture_context1_frame002.cpp", >- "google_maps/google_maps_capture_context1_frame003.cpp", >- "google_maps/google_maps_capture_context1_frame004.cpp", >- "google_maps/google_maps_capture_context1_frame005.cpp", >- "google_maps/google_maps_capture_context1_frame006.cpp", >- "google_maps/google_maps_capture_context1_frame007.cpp", >- "google_maps/google_maps_capture_context1_frame008.cpp", >- "google_maps/google_maps_capture_context1_frame009.cpp", >- "google_maps/google_maps_capture_context1_frame010.cpp", >- "google_maps/google_maps_capture_context1_frame011.cpp", >- "google_maps/google_maps_capture_context1_frame012.cpp", >- "google_maps/google_maps_capture_context1_frame013.cpp", >- "google_maps/google_maps_capture_context1_frame014.cpp", >- "google_maps/google_maps_capture_context1_frame015.cpp", >- "google_maps/google_maps_capture_context1_frame016.cpp", >- "google_maps/google_maps_capture_context1_frame017.cpp", >- "google_maps/google_maps_capture_context1_frame018.cpp", >- "google_maps/google_maps_capture_context1_frame019.cpp", >- "google_maps/google_maps_capture_context1_frame020.cpp", >- "google_maps/google_maps_capture_context1_frame021.cpp", >- "google_maps/google_maps_capture_context1_frame022.cpp", >- "google_maps/google_maps_capture_context1_frame023.cpp", >- "google_maps/google_maps_capture_context1_frame024.cpp", >- "google_maps/google_maps_capture_context1_frame025.cpp", >- "google_maps/google_maps_capture_context1_frame026.cpp", >- "google_maps/google_maps_capture_context1_frame027.cpp", >- "google_maps/google_maps_capture_context1_frame028.cpp", >- "google_maps/google_maps_capture_context1_frame029.cpp", >- "google_maps/google_maps_capture_context1_frame030.cpp", >- "google_maps/google_maps_capture_context1_frame031.cpp", >- "google_maps/google_maps_capture_context1_frame032.cpp", >- "google_maps/google_maps_capture_context1_frame033.cpp", >- "google_maps/google_maps_capture_context1_frame034.cpp", >- "google_maps/google_maps_capture_context1_frame035.cpp", >- "google_maps/google_maps_capture_context1_frame036.cpp", >- "google_maps/google_maps_capture_context1_frame037.cpp", >- "google_maps/google_maps_capture_context1_frame038.cpp", >- "google_maps/google_maps_capture_context1_frame039.cpp", >- "google_maps/google_maps_capture_context1_frame040.cpp", >- "google_maps/google_maps_capture_context1_frame041.cpp", >- "google_maps/google_maps_capture_context1_frame042.cpp", >- "google_maps/google_maps_capture_context1_frame043.cpp", >- "google_maps/google_maps_capture_context1_frame044.cpp", >- "google_maps/google_maps_capture_context1_frame045.cpp", >- "google_maps/google_maps_capture_context1_frame046.cpp", >- "google_maps/google_maps_capture_context1_frame047.cpp", >- "google_maps/google_maps_capture_context1_frame048.cpp", >- "google_maps/google_maps_capture_context1_frame049.cpp", >- "google_maps/google_maps_capture_context1_frame050.cpp", >- "google_maps/google_maps_capture_context1_frame051.cpp", >- "google_maps/google_maps_capture_context1_frame052.cpp", >- "google_maps/google_maps_capture_context1_frame053.cpp", >- "google_maps/google_maps_capture_context1_frame054.cpp", >- "google_maps/google_maps_capture_context1_frame055.cpp", >- "google_maps/google_maps_capture_context1_frame056.cpp", >- "google_maps/google_maps_capture_context1_frame057.cpp", >- "google_maps/google_maps_capture_context1_frame058.cpp", >- "google_maps/google_maps_capture_context1_frame059.cpp", >- "google_maps/google_maps_capture_context1_frame060.cpp", >- "google_maps/google_maps_capture_context1_frame061.cpp", >- "google_maps/google_maps_capture_context1_frame062.cpp", >- "google_maps/google_maps_capture_context1_frame063.cpp", >- "google_maps/google_maps_capture_context1_frame064.cpp", >- "google_maps/google_maps_capture_context1_frame065.cpp", >- "google_maps/google_maps_capture_context1_frame066.cpp", >- "google_maps/google_maps_capture_context1_frame067.cpp", >- "google_maps/google_maps_capture_context1_frame068.cpp", >- "google_maps/google_maps_capture_context1_frame069.cpp", >- "google_maps/google_maps_capture_context1_frame070.cpp", >- "google_maps/google_maps_capture_context1_frame071.cpp", >- "google_maps/google_maps_capture_context1_frame072.cpp", >- "google_maps/google_maps_capture_context1_frame073.cpp", >- "google_maps/google_maps_capture_context1_frame074.cpp", >- "google_maps/google_maps_capture_context1_frame075.cpp", >- "google_maps/google_maps_capture_context1_frame076.cpp", >- "google_maps/google_maps_capture_context1_frame077.cpp", >- "google_maps/google_maps_capture_context1_frame078.cpp", >- "google_maps/google_maps_capture_context1_frame079.cpp", >- "google_maps/google_maps_capture_context1_frame080.cpp", >- "google_maps/google_maps_capture_context1_frame081.cpp", >- "google_maps/google_maps_capture_context1_frame082.cpp", >- "google_maps/google_maps_capture_context1_frame083.cpp", >- "google_maps/google_maps_capture_context1_frame084.cpp", >- "google_maps/google_maps_capture_context1_frame085.cpp", >- "google_maps/google_maps_capture_context1_frame086.cpp", >- "google_maps/google_maps_capture_context1_frame087.cpp", >- "google_maps/google_maps_capture_context1_frame088.cpp", >- "google_maps/google_maps_capture_context1_frame089.cpp", >- "google_maps/google_maps_capture_context1_frame090.cpp", >- "google_maps/google_maps_capture_context1_frame091.cpp", >- "google_maps/google_maps_capture_context1_frame092.cpp", >- "google_maps/google_maps_capture_context1_frame093.cpp", >- "google_maps/google_maps_capture_context1_frame094.cpp", >- "google_maps/google_maps_capture_context1_frame095.cpp", >- "google_maps/google_maps_capture_context1_frame096.cpp", >- "google_maps/google_maps_capture_context1_frame097.cpp", >- "google_maps/google_maps_capture_context1_frame098.cpp", >- "google_maps/google_maps_capture_context1_frame099.cpp", >- "google_maps/google_maps_capture_context1_frame100.cpp", >- "google_maps/google_maps_capture_context1_frame101.cpp", >- "google_maps/google_maps_capture_context1_frame102.cpp", >- "google_maps/google_maps_capture_context1_frame103.cpp", >- "google_maps/google_maps_capture_context1_frame104.cpp", >- "google_maps/google_maps_capture_context1_frame105.cpp", >- "google_maps/google_maps_capture_context1_frame106.cpp", >- "google_maps/google_maps_capture_context1_frame107.cpp", >- "google_maps/google_maps_capture_context1_frame108.cpp", >- "google_maps/google_maps_capture_context1_frame109.cpp", >- "google_maps/google_maps_capture_context1_frame110.cpp", >- "google_maps/google_maps_capture_context1_frame111.cpp", >- "google_maps/google_maps_capture_context1_frame112.cpp", >- "google_maps/google_maps_capture_context1_frame113.cpp", >- "google_maps/google_maps_capture_context1_frame114.cpp", >- "google_maps/google_maps_capture_context1_frame115.cpp", >- "google_maps/google_maps_capture_context1_frame116.cpp", >- "google_maps/google_maps_capture_context1_frame117.cpp", >- "google_maps/google_maps_capture_context1_frame118.cpp", >- "google_maps/google_maps_capture_context1_frame119.cpp", >- "google_maps/google_maps_capture_context1_frame120.cpp", >- "google_maps/google_maps_capture_context1_frame121.cpp", >- "google_maps/google_maps_capture_context1_frame122.cpp", >- "google_maps/google_maps_capture_context1_frame123.cpp", >- "google_maps/google_maps_capture_context1_frame124.cpp", >- "google_maps/google_maps_capture_context1_frame125.cpp", >- "google_maps/google_maps_capture_context1_frame126.cpp", >- "google_maps/google_maps_capture_context1_frame127.cpp", >- "google_maps/google_maps_capture_context1_frame128.cpp", >- "google_maps/google_maps_capture_context1_frame129.cpp", >- "google_maps/google_maps_capture_context1_frame130.cpp", >- "google_maps/google_maps_capture_context1_frame131.cpp", >- "google_maps/google_maps_capture_context1_frame132.cpp", >- "google_maps/google_maps_capture_context1_frame133.cpp", >- "google_maps/google_maps_capture_context1_frame134.cpp", >- "google_maps/google_maps_capture_context1_frame135.cpp", >- "google_maps/google_maps_capture_context1_frame136.cpp", >- "google_maps/google_maps_capture_context1_frame137.cpp", >- "google_maps/google_maps_capture_context1_frame138.cpp", >- "google_maps/google_maps_capture_context1_frame139.cpp", >- "google_maps/google_maps_capture_context1_frame140.cpp", >- "google_maps/google_maps_capture_context1_frame141.cpp", >- "google_maps/google_maps_capture_context1_frame142.cpp", >- "google_maps/google_maps_capture_context1_frame143.cpp", >- "google_maps/google_maps_capture_context1_frame144.cpp", >- "google_maps/google_maps_capture_context1_frame145.cpp", >- "google_maps/google_maps_capture_context1_frame146.cpp", >- "google_maps/google_maps_capture_context1_frame147.cpp", >- "google_maps/google_maps_capture_context1_frame148.cpp", >- "google_maps/google_maps_capture_context1_frame149.cpp", >- "google_maps/google_maps_capture_context1_frame150.cpp", >- "google_maps/google_maps_capture_context1_frame151.cpp", >- "google_maps/google_maps_capture_context1_frame152.cpp", >- "google_maps/google_maps_capture_context1_frame153.cpp", >- "google_maps/google_maps_capture_context1_frame154.cpp", >- "google_maps/google_maps_capture_context1_frame155.cpp", >- "google_maps/google_maps_capture_context1_frame156.cpp", >- "google_maps/google_maps_capture_context1_frame157.cpp", >- "google_maps/google_maps_capture_context1_frame158.cpp", >- "google_maps/google_maps_capture_context1_frame159.cpp", >- "google_maps/google_maps_capture_context1_frame160.cpp", >- "google_maps/google_maps_capture_context1_frame161.cpp", >- "google_maps/google_maps_capture_context1_frame162.cpp", >- "google_maps/google_maps_capture_context1_frame163.cpp", >- "google_maps/google_maps_capture_context1_frame164.cpp", >- "google_maps/google_maps_capture_context1_frame165.cpp", >- "google_maps/google_maps_capture_context1_frame166.cpp", >- "google_maps/google_maps_capture_context1_frame167.cpp", >- "google_maps/google_maps_capture_context1_frame168.cpp", >- "google_maps/google_maps_capture_context1_frame169.cpp", >- "google_maps/google_maps_capture_context1_frame170.cpp", >- "google_maps/google_maps_capture_context1_frame171.cpp", >- "google_maps/google_maps_capture_context1_frame172.cpp", >- "google_maps/google_maps_capture_context1_frame173.cpp", >- "google_maps/google_maps_capture_context1_frame174.cpp", >- "google_maps/google_maps_capture_context1_frame175.cpp", >- "google_maps/google_maps_capture_context1_frame176.cpp", >- "google_maps/google_maps_capture_context1_frame177.cpp", >- "google_maps/google_maps_capture_context1_frame178.cpp", >- "google_maps/google_maps_capture_context1_frame179.cpp", >- "google_maps/google_maps_capture_context1_frame180.cpp", >- "google_maps/google_maps_capture_context1_frame181.cpp", >- "google_maps/google_maps_capture_context1_frame182.cpp", >- "google_maps/google_maps_capture_context1_frame183.cpp", >- "google_maps/google_maps_capture_context1_frame184.cpp", >- "google_maps/google_maps_capture_context1_frame185.cpp", >- "google_maps/google_maps_capture_context1_frame186.cpp", >- "google_maps/google_maps_capture_context1_frame187.cpp", >- "google_maps/google_maps_capture_context1_frame188.cpp", >- "google_maps/google_maps_capture_context1_frame189.cpp", >- "google_maps/google_maps_capture_context1_frame190.cpp", >- "google_maps/google_maps_capture_context1_frame191.cpp", >- "google_maps/google_maps_capture_context1_frame192.cpp", >- "google_maps/google_maps_capture_context1_frame193.cpp", >- "google_maps/google_maps_capture_context1_frame194.cpp", >- "google_maps/google_maps_capture_context1_frame195.cpp", >- "google_maps/google_maps_capture_context1_frame196.cpp", >- "google_maps/google_maps_capture_context1_frame197.cpp", >- "google_maps/google_maps_capture_context1_frame198.cpp", >- "google_maps/google_maps_capture_context1_frame199.cpp", >- "google_maps/google_maps_capture_context1_frame200.cpp", >- "google_maps/google_maps_capture_context1_frame201.cpp", >- "google_maps/google_maps_capture_context1_frame202.cpp", >- "google_maps/google_maps_capture_context1_frame203.cpp", >- "google_maps/google_maps_capture_context1_frame204.cpp", >- "google_maps/google_maps_capture_context1_frame205.cpp", >- "google_maps/google_maps_capture_context1_frame206.cpp", >- "google_maps/google_maps_capture_context1_frame207.cpp", >- "google_maps/google_maps_capture_context1_frame208.cpp", >- "google_maps/google_maps_capture_context1_frame209.cpp", >- "google_maps/google_maps_capture_context1_frame210.cpp", >- "google_maps/google_maps_capture_context1_frame211.cpp", >- "google_maps/google_maps_capture_context1_frame212.cpp", >- "google_maps/google_maps_capture_context1_frame213.cpp", >- "google_maps/google_maps_capture_context1_frame214.cpp", >- "google_maps/google_maps_capture_context1_frame215.cpp", >- "google_maps/google_maps_capture_context1_frame216.cpp", >- "google_maps/google_maps_capture_context1_frame217.cpp", >- "google_maps/google_maps_capture_context1_frame218.cpp", >- "google_maps/google_maps_capture_context1_frame219.cpp", >- "google_maps/google_maps_capture_context1_frame220.cpp", >- "google_maps/google_maps_capture_context1_frame221.cpp", >- "google_maps/google_maps_capture_context1_frame222.cpp", >- "google_maps/google_maps_capture_context1_frame223.cpp", >- "google_maps/google_maps_capture_context1_frame224.cpp", >- "google_maps/google_maps_capture_context1_frame225.cpp", >- "google_maps/google_maps_capture_context1_frame226.cpp", >- "google_maps/google_maps_capture_context1_frame227.cpp", >- "google_maps/google_maps_capture_context1_frame228.cpp", >- "google_maps/google_maps_capture_context1_frame229.cpp", >- "google_maps/google_maps_capture_context1_frame230.cpp", >- "google_maps/google_maps_capture_context1_frame231.cpp", >- "google_maps/google_maps_capture_context1_frame232.cpp", >- "google_maps/google_maps_capture_context1_frame233.cpp", >- "google_maps/google_maps_capture_context1_frame234.cpp", >- "google_maps/google_maps_capture_context1_frame235.cpp", >- "google_maps/google_maps_capture_context1_frame236.cpp", >- "google_maps/google_maps_capture_context1_frame237.cpp", >- "google_maps/google_maps_capture_context1_frame238.cpp", >- "google_maps/google_maps_capture_context1_frame239.cpp", >- "google_maps/google_maps_capture_context1_frame240.cpp", >- "google_maps/google_maps_capture_context1_frame241.cpp", >- "google_maps/google_maps_capture_context1_frame242.cpp", >- "google_maps/google_maps_capture_context1_frame243.cpp", >- "google_maps/google_maps_capture_context1_frame244.cpp", >- "google_maps/google_maps_capture_context1_frame245.cpp", >- "google_maps/google_maps_capture_context1_frame246.cpp", >- "google_maps/google_maps_capture_context1_frame247.cpp", >- "google_maps/google_maps_capture_context1_frame248.cpp", >- "google_maps/google_maps_capture_context1_frame249.cpp", >- "google_maps/google_maps_capture_context1_frame250.cpp", >- "google_maps/google_maps_capture_context1_frame251.cpp", >- "google_maps/google_maps_capture_context1_frame252.cpp", >- "google_maps/google_maps_capture_context1_frame253.cpp", >- "google_maps/google_maps_capture_context1_frame254.cpp", >- "google_maps/google_maps_capture_context1_frame255.cpp", >- "google_maps/google_maps_capture_context1_frame256.cpp", >- "google_maps/google_maps_capture_context1_frame257.cpp", >- "google_maps/google_maps_capture_context1_frame258.cpp", >- "google_maps/google_maps_capture_context1_frame259.cpp", >- "google_maps/google_maps_capture_context1_frame260.cpp", >- "google_maps/google_maps_capture_context1_frame261.cpp", >- "google_maps/google_maps_capture_context1_frame262.cpp", >- "google_maps/google_maps_capture_context1_frame263.cpp", >- "google_maps/google_maps_capture_context1_frame264.cpp", >- "google_maps/google_maps_capture_context1_frame265.cpp", >- "google_maps/google_maps_capture_context1_frame266.cpp", >- "google_maps/google_maps_capture_context1_frame267.cpp", >- "google_maps/google_maps_capture_context1_frame268.cpp", >- "google_maps/google_maps_capture_context1_frame269.cpp", >- "google_maps/google_maps_capture_context1_frame270.cpp", >- "google_maps/google_maps_capture_context1_frame271.cpp", >- "google_maps/google_maps_capture_context1_frame272.cpp", >- "google_maps/google_maps_capture_context1_frame273.cpp", >- "google_maps/google_maps_capture_context1_frame274.cpp", >- "google_maps/google_maps_capture_context1_frame275.cpp", >- "google_maps/google_maps_capture_context1_frame276.cpp", >- "google_maps/google_maps_capture_context1_frame277.cpp", >- "google_maps/google_maps_capture_context1_frame278.cpp", >- "google_maps/google_maps_capture_context1_frame279.cpp", >- "google_maps/google_maps_capture_context1_frame280.cpp", >- "google_maps/google_maps_capture_context1_frame281.cpp", >- "google_maps/google_maps_capture_context1_frame282.cpp", >- "google_maps/google_maps_capture_context1_frame283.cpp", >- "google_maps/google_maps_capture_context1_frame284.cpp", >- "google_maps/google_maps_capture_context1_frame285.cpp", >- "google_maps/google_maps_capture_context1_frame286.cpp", >- "google_maps/google_maps_capture_context1_frame287.cpp", >- "google_maps/google_maps_capture_context1_frame288.cpp", >- "google_maps/google_maps_capture_context1_frame289.cpp", >- "google_maps/google_maps_capture_context1_frame290.cpp", >- "google_maps/google_maps_capture_context1_frame291.cpp", >- "google_maps/google_maps_capture_context1_frame292.cpp", >- "google_maps/google_maps_capture_context1_frame293.cpp", >- "google_maps/google_maps_capture_context1_frame294.cpp", >- "google_maps/google_maps_capture_context1_frame295.cpp", >- "google_maps/google_maps_capture_context1_frame296.cpp", >- "google_maps/google_maps_capture_context1_frame297.cpp", >- "google_maps/google_maps_capture_context1_frame298.cpp", >- "google_maps/google_maps_capture_context1_frame299.cpp", >- "google_maps/google_maps_capture_context1_frame300.cpp", >- ], >- [ "google_maps/google_maps_capture_context1.angledata.gz" ], >- "google_maps/google_maps_capture_context1", >- ], >- [ >- "happy_color", >- 1, >- [ >- "happy_color/happy_color_capture_context1_frame001.cpp", >- "happy_color/happy_color_capture_context1_frame002.cpp", >- "happy_color/happy_color_capture_context1_frame003.cpp", >- "happy_color/happy_color_capture_context1_frame004.cpp", >- "happy_color/happy_color_capture_context1_frame005.cpp", >- "happy_color/happy_color_capture_context1_frame006.cpp", >- "happy_color/happy_color_capture_context1_frame007.cpp", >- "happy_color/happy_color_capture_context1_frame008.cpp", >- "happy_color/happy_color_capture_context1_frame009.cpp", >- "happy_color/happy_color_capture_context1_frame010.cpp", >- ], >- [ "happy_color/happy_color_capture_context1.angledata.gz" ], >- "happy_color/happy_color_capture_context1", >- ], >- [ >- "hay_day", >- 1, >- [ >- "hay_day/hay_day_capture_context1_frame001.cpp", >- "hay_day/hay_day_capture_context1_frame002.cpp", >- "hay_day/hay_day_capture_context1_frame003.cpp", >- "hay_day/hay_day_capture_context1_frame004.cpp", >- "hay_day/hay_day_capture_context1_frame005.cpp", >- "hay_day/hay_day_capture_context1_frame006.cpp", >- "hay_day/hay_day_capture_context1_frame007.cpp", >- "hay_day/hay_day_capture_context1_frame008.cpp", >- "hay_day/hay_day_capture_context1_frame009.cpp", >- "hay_day/hay_day_capture_context1_frame010.cpp", >- ], >- [ "hay_day/hay_day_capture_context1.angledata.gz" ], >- "hay_day/hay_day_capture_context1", >- ], >- [ >- "hearthstone", >- 1, >- [ >- "hearthstone/hearthstone_capture_context1_frame001.cpp", >- "hearthstone/hearthstone_capture_context1_frame002.cpp", >- "hearthstone/hearthstone_capture_context1_frame003.cpp", >- "hearthstone/hearthstone_capture_context1_frame004.cpp", >- "hearthstone/hearthstone_capture_context1_frame005.cpp", >- "hearthstone/hearthstone_capture_context1_frame006.cpp", >- "hearthstone/hearthstone_capture_context1_frame007.cpp", >- "hearthstone/hearthstone_capture_context1_frame008.cpp", >- "hearthstone/hearthstone_capture_context1_frame009.cpp", >- "hearthstone/hearthstone_capture_context1_frame010.cpp", >- ], >- [ "hearthstone/hearthstone_capture_context1.angledata.gz" ], >- "hearthstone/hearthstone_capture_context1", >- ], >- [ >- "higgs_domino_island", >- 2, >- [ >- "higgs_domino_island/higgs_domino_island_capture_context2_frame001.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame002.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame003.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame004.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame005.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame006.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame007.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame008.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame009.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame010.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame011.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame012.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame013.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame014.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame015.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame016.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame017.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame018.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame019.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame020.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame021.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame022.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame023.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame024.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame025.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame026.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame027.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame028.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame029.cpp", >- "higgs_domino_island/higgs_domino_island_capture_context2_frame030.cpp", >- ], >- [ "higgs_domino_island/higgs_domino_island_capture_context2.angledata.gz" ], >- "higgs_domino_island/higgs_domino_island_capture_context2", >- ], >- [ >- "hill_climb_racing", >- 1, >- [ >- "hill_climb_racing/hill_climb_racing_capture_context1_frame001.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame002.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame003.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame004.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame005.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame006.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame007.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame008.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame009.cpp", >- "hill_climb_racing/hill_climb_racing_capture_context1_frame010.cpp", >- ], >- [ "hill_climb_racing/hill_climb_racing_capture_context1.angledata.gz" ], >- "hill_climb_racing/hill_climb_racing_capture_context1", >- ], >- [ >- "homescapes", >- 1, >- [ >- "homescapes/homescapes_capture_context1_frame001.cpp", >- "homescapes/homescapes_capture_context1_frame002.cpp", >- "homescapes/homescapes_capture_context1_frame003.cpp", >- "homescapes/homescapes_capture_context1_frame004.cpp", >- "homescapes/homescapes_capture_context1_frame005.cpp", >- "homescapes/homescapes_capture_context1_frame006.cpp", >- "homescapes/homescapes_capture_context1_frame007.cpp", >- "homescapes/homescapes_capture_context1_frame008.cpp", >- "homescapes/homescapes_capture_context1_frame009.cpp", >- "homescapes/homescapes_capture_context1_frame010.cpp", >- ], >- [ "homescapes/homescapes_capture_context1.angledata.gz" ], >- "homescapes/homescapes_capture_context1", >- ], >- [ >- "idle_heroes", >- 2, >- [ >- "idle_heroes/idle_heroes_capture_context2_frame001.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame002.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame003.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame004.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame005.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame006.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame007.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame008.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame009.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame010.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame011.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame012.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame013.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame014.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame015.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame016.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame017.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame018.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame019.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame020.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame021.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame022.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame023.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame024.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame025.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame026.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame027.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame028.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame029.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame030.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame031.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame032.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame033.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame034.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame035.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame036.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame037.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame038.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame039.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame040.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame041.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame042.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame043.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame044.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame045.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame046.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame047.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame048.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame049.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame050.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame051.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame052.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame053.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame054.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame055.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame056.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame057.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame058.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame059.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame060.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame061.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame062.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame063.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame064.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame065.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame066.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame067.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame068.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame069.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame070.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame071.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame072.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame073.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame074.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame075.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame076.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame077.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame078.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame079.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame080.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame081.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame082.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame083.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame084.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame085.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame086.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame087.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame088.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame089.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame090.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame091.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame092.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame093.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame094.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame095.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame096.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame097.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame098.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame099.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame100.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame101.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame102.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame103.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame104.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame105.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame106.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame107.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame108.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame109.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame110.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame111.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame112.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame113.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame114.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame115.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame116.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame117.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame118.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame119.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame120.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame121.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame122.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame123.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame124.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame125.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame126.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame127.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame128.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame129.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame130.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame131.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame132.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame133.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame134.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame135.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame136.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame137.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame138.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame139.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame140.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame141.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame142.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame143.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame144.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame145.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame146.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame147.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame148.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame149.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame150.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame151.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame152.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame153.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame154.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame155.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame156.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame157.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame158.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame159.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame160.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame161.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame162.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame163.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame164.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame165.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame166.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame167.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame168.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame169.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame170.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame171.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame172.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame173.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame174.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame175.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame176.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame177.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame178.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame179.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame180.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame181.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame182.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame183.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame184.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame185.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame186.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame187.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame188.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame189.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame190.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame191.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame192.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame193.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame194.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame195.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame196.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame197.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame198.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame199.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame200.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame201.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame202.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame203.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame204.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame205.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame206.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame207.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame208.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame209.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame210.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame211.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame212.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame213.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame214.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame215.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame216.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame217.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame218.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame219.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame220.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame221.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame222.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame223.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame224.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame225.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame226.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame227.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame228.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame229.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame230.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame231.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame232.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame233.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame234.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame235.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame236.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame237.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame238.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame239.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame240.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame241.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame242.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame243.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame244.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame245.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame246.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame247.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame248.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame249.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame250.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame251.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame252.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame253.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame254.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame255.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame256.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame257.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame258.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame259.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame260.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame261.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame262.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame263.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame264.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame265.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame266.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame267.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame268.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame269.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame270.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame271.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame272.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame273.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame274.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame275.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame276.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame277.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame278.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame279.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame280.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame281.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame282.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame283.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame284.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame285.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame286.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame287.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame288.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame289.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame290.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame291.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame292.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame293.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame294.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame295.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame296.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame297.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame298.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame299.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame300.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame301.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame302.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame303.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame304.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame305.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame306.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame307.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame308.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame309.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame310.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame311.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame312.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame313.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame314.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame315.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame316.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame317.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame318.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame319.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame320.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame321.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame322.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame323.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame324.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame325.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame326.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame327.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame328.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame329.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame330.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame331.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame332.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame333.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame334.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame335.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame336.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame337.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame338.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame339.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame340.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame341.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame342.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame343.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame344.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame345.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame346.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame347.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame348.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame349.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame350.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame351.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame352.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame353.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame354.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame355.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame356.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame357.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame358.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame359.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame360.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame361.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame362.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame363.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame364.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame365.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame366.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame367.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame368.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame369.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame370.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame371.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame372.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame373.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame374.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame375.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame376.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame377.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame378.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame379.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame380.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame381.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame382.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame383.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame384.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame385.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame386.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame387.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame388.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame389.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame390.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame391.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame392.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame393.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame394.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame395.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame396.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame397.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame398.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame399.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame400.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame401.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame402.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame403.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame404.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame405.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame406.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame407.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame408.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame409.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame410.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame411.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame412.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame413.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame414.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame415.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame416.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame417.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame418.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame419.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame420.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame421.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame422.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame423.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame424.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame425.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame426.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame427.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame428.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame429.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame430.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame431.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame432.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame433.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame434.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame435.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame436.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame437.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame438.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame439.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame440.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame441.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame442.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame443.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame444.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame445.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame446.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame447.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame448.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame449.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame450.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame451.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame452.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame453.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame454.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame455.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame456.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame457.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame458.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame459.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame460.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame461.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame462.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame463.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame464.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame465.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame466.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame467.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame468.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame469.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame470.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame471.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame472.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame473.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame474.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame475.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame476.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame477.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame478.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame479.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame480.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame481.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame482.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame483.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame484.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame485.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame486.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame487.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame488.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame489.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame490.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame491.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame492.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame493.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame494.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame495.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame496.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame497.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame498.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame499.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame500.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame501.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame502.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame503.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame504.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame505.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame506.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame507.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame508.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame509.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame510.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame511.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame512.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame513.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame514.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame515.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame516.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame517.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame518.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame519.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame520.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame521.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame522.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame523.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame524.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame525.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame526.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame527.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame528.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame529.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame530.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame531.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame532.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame533.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame534.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame535.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame536.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame537.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame538.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame539.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame540.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame541.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame542.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame543.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame544.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame545.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame546.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame547.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame548.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame549.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame550.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame551.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame552.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame553.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame554.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame555.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame556.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame557.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame558.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame559.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame560.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame561.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame562.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame563.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame564.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame565.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame566.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame567.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame568.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame569.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame570.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame571.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame572.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame573.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame574.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame575.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame576.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame577.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame578.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame579.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame580.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame581.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame582.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame583.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame584.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame585.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame586.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame587.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame588.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame589.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame590.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame591.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame592.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame593.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame594.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame595.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame596.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame597.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame598.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame599.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame600.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame601.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame602.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame603.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame604.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame605.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame606.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame607.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame608.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame609.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame610.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame611.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame612.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame613.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame614.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame615.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame616.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame617.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame618.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame619.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame620.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame621.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame622.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame623.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame624.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame625.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame626.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame627.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame628.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame629.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame630.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame631.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame632.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame633.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame634.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame635.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame636.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame637.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame638.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame639.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame640.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame641.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame642.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame643.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame644.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame645.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame646.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame647.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame648.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame649.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame650.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame651.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame652.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame653.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame654.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame655.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame656.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame657.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame658.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame659.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame660.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame661.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame662.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame663.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame664.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame665.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame666.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame667.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame668.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame669.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame670.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame671.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame672.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame673.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame674.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame675.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame676.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame677.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame678.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame679.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame680.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame681.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame682.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame683.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame684.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame685.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame686.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame687.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame688.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame689.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame690.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame691.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame692.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame693.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame694.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame695.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame696.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame697.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame698.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame699.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame700.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame701.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame702.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame703.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame704.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame705.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame706.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame707.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame708.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame709.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame710.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame711.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame712.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame713.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame714.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame715.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame716.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame717.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame718.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame719.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame720.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame721.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame722.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame723.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame724.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame725.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame726.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame727.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame728.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame729.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame730.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame731.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame732.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame733.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame734.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame735.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame736.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame737.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame738.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame739.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame740.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame741.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame742.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame743.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame744.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame745.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame746.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame747.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame748.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame749.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame750.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame751.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame752.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame753.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame754.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame755.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame756.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame757.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame758.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame759.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame760.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame761.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame762.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame763.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame764.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame765.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame766.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame767.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame768.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame769.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame770.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame771.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame772.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame773.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame774.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame775.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame776.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame777.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame778.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame779.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame780.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame781.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame782.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame783.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame784.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame785.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame786.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame787.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame788.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame789.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame790.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame791.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame792.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame793.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame794.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame795.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame796.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame797.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame798.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame799.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame800.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame801.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame802.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame803.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame804.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame805.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame806.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame807.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame808.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame809.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame810.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame811.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame812.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame813.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame814.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame815.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame816.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame817.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame818.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame819.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame820.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame821.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame822.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame823.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame824.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame825.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame826.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame827.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame828.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame829.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame830.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame831.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame832.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame833.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame834.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame835.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame836.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame837.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame838.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame839.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame840.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame841.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame842.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame843.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame844.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame845.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame846.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame847.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame848.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame849.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame850.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame851.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame852.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame853.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame854.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame855.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame856.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame857.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame858.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame859.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame860.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame861.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame862.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame863.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame864.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame865.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame866.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame867.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame868.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame869.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame870.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame871.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame872.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame873.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame874.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame875.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame876.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame877.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame878.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame879.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame880.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame881.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame882.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame883.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame884.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame885.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame886.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame887.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame888.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame889.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame890.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame891.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame892.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame893.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame894.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame895.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame896.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame897.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame898.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame899.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame900.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame901.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame902.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame903.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame904.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame905.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame906.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame907.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame908.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame909.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame910.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame911.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame912.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame913.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame914.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame915.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame916.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame917.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame918.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame919.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame920.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame921.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame922.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame923.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame924.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame925.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame926.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame927.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame928.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame929.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame930.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame931.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame932.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame933.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame934.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame935.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame936.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame937.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame938.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame939.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame940.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame941.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame942.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame943.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame944.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame945.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame946.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame947.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame948.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame949.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame950.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame951.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame952.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame953.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame954.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame955.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame956.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame957.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame958.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame959.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame960.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame961.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame962.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame963.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame964.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame965.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame966.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame967.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame968.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame969.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame970.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame971.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame972.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame973.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame974.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame975.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame976.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame977.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame978.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame979.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame980.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame981.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame982.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame983.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame984.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame985.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame986.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame987.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame988.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame989.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame990.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame991.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame992.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame993.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame994.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame995.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame996.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame997.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame998.cpp", >- "idle_heroes/idle_heroes_capture_context2_frame999.cpp", >- ], >- [ "idle_heroes/idle_heroes_capture_context2.angledata.gz" ], >- "idle_heroes/idle_heroes_capture_context2", >- ], >- [ >- "junes_journey", >- 1, >- [ >- "junes_journey/junes_journey_capture_context1_frame001.cpp", >- "junes_journey/junes_journey_capture_context1_frame002.cpp", >- "junes_journey/junes_journey_capture_context1_frame003.cpp", >- "junes_journey/junes_journey_capture_context1_frame004.cpp", >- "junes_journey/junes_journey_capture_context1_frame005.cpp", >- "junes_journey/junes_journey_capture_context1_frame006.cpp", >- "junes_journey/junes_journey_capture_context1_frame007.cpp", >- "junes_journey/junes_journey_capture_context1_frame008.cpp", >- "junes_journey/junes_journey_capture_context1_frame009.cpp", >- "junes_journey/junes_journey_capture_context1_frame010.cpp", >- ], >- [ "junes_journey/junes_journey_capture_context1.angledata.gz" ], >- "junes_journey/junes_journey_capture_context1", >- ], >- [ >- "kartrider_rush", >- 1, >- [ >- "kartrider_rush/kartrider_rush_capture_context1_frame001.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame002.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame003.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame004.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame005.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame006.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame007.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame008.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame009.cpp", >- "kartrider_rush/kartrider_rush_capture_context1_frame010.cpp", >- ], >- [ "kartrider_rush/kartrider_rush_capture_context1.angledata.gz" ], >- "kartrider_rush/kartrider_rush_capture_context1", >- ], >- [ >- "klondike_adventures", >- 1, >- [ >- "klondike_adventures/klondike_adventures_capture_context1_frame001.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame002.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame003.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame004.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame005.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame006.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame007.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame008.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame009.cpp", >- "klondike_adventures/klondike_adventures_capture_context1_frame010.cpp", >- ], >- [ "klondike_adventures/klondike_adventures_capture_context1.angledata.gz" ], >- "klondike_adventures/klondike_adventures_capture_context1", >- ], >- [ >- "league_of_legends_wild_rift", >- 1, >- [ >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame001.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame002.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame003.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame004.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame005.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame006.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame007.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame008.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame009.cpp", >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1_frame010.cpp", >- ], >- [ "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1.angledata.gz" ], >- "league_of_legends_wild_rift/league_of_legends_wild_rift_capture_context1", >- ], >- [ >- "lego_legacy", >- 1, >- [ >- "lego_legacy/lego_legacy_capture_context1_frame001.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame002.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame003.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame004.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame005.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame006.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame007.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame008.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame009.cpp", >- "lego_legacy/lego_legacy_capture_context1_frame010.cpp", >- ], >- [ "lego_legacy/lego_legacy_capture_context1.angledata.gz" ], >- "lego_legacy/lego_legacy_capture_context1", >- ], >- [ >- "lineage_m", >- 1, >- [ >- "lineage_m/lineage_m_capture_context1_frame001.cpp", >- "lineage_m/lineage_m_capture_context1_frame002.cpp", >- "lineage_m/lineage_m_capture_context1_frame003.cpp", >- "lineage_m/lineage_m_capture_context1_frame004.cpp", >- "lineage_m/lineage_m_capture_context1_frame005.cpp", >- "lineage_m/lineage_m_capture_context1_frame006.cpp", >- "lineage_m/lineage_m_capture_context1_frame007.cpp", >- "lineage_m/lineage_m_capture_context1_frame008.cpp", >- "lineage_m/lineage_m_capture_context1_frame009.cpp", >- "lineage_m/lineage_m_capture_context1_frame010.cpp", >- ], >- [ "lineage_m/lineage_m_capture_context1.angledata.gz" ], >- "lineage_m/lineage_m_capture_context1", >- ], >- [ >- "ludo_king", >- 1, >- [ >- "ludo_king/ludo_king_capture_context1_frame001.cpp", >- "ludo_king/ludo_king_capture_context1_frame002.cpp", >- "ludo_king/ludo_king_capture_context1_frame003.cpp", >- "ludo_king/ludo_king_capture_context1_frame004.cpp", >- "ludo_king/ludo_king_capture_context1_frame005.cpp", >- "ludo_king/ludo_king_capture_context1_frame006.cpp", >- "ludo_king/ludo_king_capture_context1_frame007.cpp", >- "ludo_king/ludo_king_capture_context1_frame008.cpp", >- "ludo_king/ludo_king_capture_context1_frame009.cpp", >- "ludo_king/ludo_king_capture_context1_frame010.cpp", >- "ludo_king/ludo_king_capture_context1_frame011.cpp", >- "ludo_king/ludo_king_capture_context1_frame012.cpp", >- "ludo_king/ludo_king_capture_context1_frame013.cpp", >- "ludo_king/ludo_king_capture_context1_frame014.cpp", >- "ludo_king/ludo_king_capture_context1_frame015.cpp", >- "ludo_king/ludo_king_capture_context1_frame016.cpp", >- "ludo_king/ludo_king_capture_context1_frame017.cpp", >- "ludo_king/ludo_king_capture_context1_frame018.cpp", >- "ludo_king/ludo_king_capture_context1_frame019.cpp", >- "ludo_king/ludo_king_capture_context1_frame020.cpp", >- "ludo_king/ludo_king_capture_context1_frame021.cpp", >- "ludo_king/ludo_king_capture_context1_frame022.cpp", >- "ludo_king/ludo_king_capture_context1_frame023.cpp", >- "ludo_king/ludo_king_capture_context1_frame024.cpp", >- "ludo_king/ludo_king_capture_context1_frame025.cpp", >- "ludo_king/ludo_king_capture_context1_frame026.cpp", >- "ludo_king/ludo_king_capture_context1_frame027.cpp", >- "ludo_king/ludo_king_capture_context1_frame028.cpp", >- "ludo_king/ludo_king_capture_context1_frame029.cpp", >- "ludo_king/ludo_king_capture_context1_frame030.cpp", >- ], >- [ "ludo_king/ludo_king_capture_context1.angledata.gz" ], >- "ludo_king/ludo_king_capture_context1", >- ], >- [ >- "magic_tiles_3", >- 1, >- [ >- "magic_tiles_3/magic_tiles_3_capture_context1_frame001.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame002.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame003.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame004.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame005.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame006.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame007.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame008.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame009.cpp", >- "magic_tiles_3/magic_tiles_3_capture_context1_frame010.cpp", >- ], >- [ "magic_tiles_3/magic_tiles_3_capture_context1.angledata.gz" ], >- "magic_tiles_3/magic_tiles_3_capture_context1", >- ], >- [ >- "manhattan_10", >- 1, >- [ >- "manhattan_10/manhattan_10_capture_context1_frame001.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame002.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame003.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame004.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame005.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame006.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame007.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame008.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame009.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame010.cpp", >- "manhattan_10/manhattan_10_capture_context1_frame011.cpp", >- ], >- [ "manhattan_10/manhattan_10_capture_context1.angledata.gz" ], >- "manhattan_10/manhattan_10_capture_context1", >- ], >- [ >- "manhattan_31", >- 1, >- [ >- "manhattan_31/manhattan_31_capture_context1_frame001.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame002.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame003.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame004.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame005.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame006.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame007.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame008.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame009.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame010.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame011.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame012.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame013.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame014.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame015.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame016.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame017.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame018.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame019.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame020.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame021.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame022.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame023.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame024.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame025.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame026.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame027.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame028.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame029.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame030.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame031.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame032.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame033.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame034.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame035.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame036.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame037.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame038.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame039.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame040.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame041.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame042.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame043.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame044.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame045.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame046.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame047.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame048.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame049.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame050.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame051.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame052.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame053.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame054.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame055.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame056.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame057.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame058.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame059.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame060.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame061.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame062.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame063.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame064.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame065.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame066.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame067.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame068.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame069.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame070.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame071.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame072.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame073.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame074.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame075.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame076.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame077.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame078.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame079.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame080.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame081.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame082.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame083.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame084.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame085.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame086.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame087.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame088.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame089.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame090.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame091.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame092.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame093.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame094.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame095.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame096.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame097.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame098.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame099.cpp", >- "manhattan_31/manhattan_31_capture_context1_frame100.cpp", >- ], >- [ "manhattan_31/manhattan_31_capture_context1.angledata.gz" ], >- "manhattan_31/manhattan_31_capture_context1", >- ], >- [ >- "mario_kart_tour", >- 1, >- [ >- "mario_kart_tour/mario_kart_tour_capture_context1_frame001.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame002.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame003.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame004.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame005.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame006.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame007.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame008.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame009.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame010.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame011.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame012.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame013.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame014.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame015.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame016.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame017.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame018.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame019.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame020.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame021.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame022.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame023.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame024.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame025.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame026.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame027.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame028.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame029.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame030.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame031.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame032.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame033.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame034.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame035.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame036.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame037.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame038.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame039.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame040.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame041.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame042.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame043.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame044.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame045.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame046.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame047.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame048.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame049.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame050.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame051.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame052.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame053.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame054.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame055.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame056.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame057.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame058.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame059.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame060.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame061.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame062.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame063.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame064.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame065.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame066.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame067.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame068.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame069.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame070.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame071.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame072.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame073.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame074.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame075.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame076.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame077.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame078.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame079.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame080.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame081.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame082.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame083.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame084.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame085.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame086.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame087.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame088.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame089.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame090.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame091.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame092.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame093.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame094.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame095.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame096.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame097.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame098.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame099.cpp", >- "mario_kart_tour/mario_kart_tour_capture_context1_frame100.cpp", >- ], >- [ "mario_kart_tour/mario_kart_tour_capture_context1.angledata.gz" ], >- "mario_kart_tour/mario_kart_tour_capture_context1", >- ], >- [ >- "marvel_contest_of_champions", >- 1, >- [ >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame001.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame002.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame003.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame004.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame005.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame006.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame007.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame008.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame009.cpp", >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1_frame010.cpp", >- ], >- [ "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1.angledata.gz" ], >- "marvel_contest_of_champions/marvel_contest_of_champions_capture_context1", >- ], >- [ >- "messenger_lite", >- 1, >- [ >- "messenger_lite/messenger_lite_capture_context1_frame001.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame002.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame003.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame004.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame005.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame006.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame007.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame008.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame009.cpp", >- "messenger_lite/messenger_lite_capture_context1_frame010.cpp", >- ], >- [ "messenger_lite/messenger_lite_capture_context1.angledata.gz" ], >- "messenger_lite/messenger_lite_capture_context1", >- ], >- [ >- "minecraft", >- 1, >- [ >- "minecraft/minecraft_capture_context1_frame001.cpp", >- "minecraft/minecraft_capture_context1_frame002.cpp", >- "minecraft/minecraft_capture_context1_frame003.cpp", >- "minecraft/minecraft_capture_context1_frame004.cpp", >- "minecraft/minecraft_capture_context1_frame005.cpp", >- "minecraft/minecraft_capture_context1_frame006.cpp", >- "minecraft/minecraft_capture_context1_frame007.cpp", >- "minecraft/minecraft_capture_context1_frame008.cpp", >- "minecraft/minecraft_capture_context1_frame009.cpp", >- "minecraft/minecraft_capture_context1_frame010.cpp", >- ], >- [ "minecraft/minecraft_capture_context1.angledata.gz" ], >- "minecraft/minecraft_capture_context1", >- ], >- [ >- "mini_world", >- 2, >- [ >- "mini_world/mini_world_capture_context2_frame001.cpp", >- "mini_world/mini_world_capture_context2_frame002.cpp", >- "mini_world/mini_world_capture_context2_frame003.cpp", >- "mini_world/mini_world_capture_context2_frame004.cpp", >- "mini_world/mini_world_capture_context2_frame005.cpp", >- "mini_world/mini_world_capture_context2_frame006.cpp", >- "mini_world/mini_world_capture_context2_frame007.cpp", >- "mini_world/mini_world_capture_context2_frame008.cpp", >- "mini_world/mini_world_capture_context2_frame009.cpp", >- "mini_world/mini_world_capture_context2_frame010.cpp", >- "mini_world/mini_world_capture_context2_frame011.cpp", >- "mini_world/mini_world_capture_context2_frame012.cpp", >- "mini_world/mini_world_capture_context2_frame013.cpp", >- "mini_world/mini_world_capture_context2_frame014.cpp", >- "mini_world/mini_world_capture_context2_frame015.cpp", >- "mini_world/mini_world_capture_context2_frame016.cpp", >- "mini_world/mini_world_capture_context2_frame017.cpp", >- "mini_world/mini_world_capture_context2_frame018.cpp", >- "mini_world/mini_world_capture_context2_frame019.cpp", >- "mini_world/mini_world_capture_context2_frame020.cpp", >- "mini_world/mini_world_capture_context2_frame021.cpp", >- "mini_world/mini_world_capture_context2_frame022.cpp", >- "mini_world/mini_world_capture_context2_frame023.cpp", >- "mini_world/mini_world_capture_context2_frame024.cpp", >- "mini_world/mini_world_capture_context2_frame025.cpp", >- "mini_world/mini_world_capture_context2_frame026.cpp", >- "mini_world/mini_world_capture_context2_frame027.cpp", >- "mini_world/mini_world_capture_context2_frame028.cpp", >- "mini_world/mini_world_capture_context2_frame029.cpp", >- "mini_world/mini_world_capture_context2_frame030.cpp", >- "mini_world/mini_world_capture_context2_frame031.cpp", >- "mini_world/mini_world_capture_context2_frame032.cpp", >- "mini_world/mini_world_capture_context2_frame033.cpp", >- "mini_world/mini_world_capture_context2_frame034.cpp", >- "mini_world/mini_world_capture_context2_frame035.cpp", >- "mini_world/mini_world_capture_context2_frame036.cpp", >- "mini_world/mini_world_capture_context2_frame037.cpp", >- "mini_world/mini_world_capture_context2_frame038.cpp", >- "mini_world/mini_world_capture_context2_frame039.cpp", >- "mini_world/mini_world_capture_context2_frame040.cpp", >- "mini_world/mini_world_capture_context2_frame041.cpp", >- "mini_world/mini_world_capture_context2_frame042.cpp", >- "mini_world/mini_world_capture_context2_frame043.cpp", >- "mini_world/mini_world_capture_context2_frame044.cpp", >- "mini_world/mini_world_capture_context2_frame045.cpp", >- "mini_world/mini_world_capture_context2_frame046.cpp", >- "mini_world/mini_world_capture_context2_frame047.cpp", >- "mini_world/mini_world_capture_context2_frame048.cpp", >- "mini_world/mini_world_capture_context2_frame049.cpp", >- "mini_world/mini_world_capture_context2_frame050.cpp", >- "mini_world/mini_world_capture_context2_frame051.cpp", >- "mini_world/mini_world_capture_context2_frame052.cpp", >- "mini_world/mini_world_capture_context2_frame053.cpp", >- "mini_world/mini_world_capture_context2_frame054.cpp", >- "mini_world/mini_world_capture_context2_frame055.cpp", >- "mini_world/mini_world_capture_context2_frame056.cpp", >- "mini_world/mini_world_capture_context2_frame057.cpp", >- "mini_world/mini_world_capture_context2_frame058.cpp", >- "mini_world/mini_world_capture_context2_frame059.cpp", >- "mini_world/mini_world_capture_context2_frame060.cpp", >- "mini_world/mini_world_capture_context2_frame061.cpp", >- "mini_world/mini_world_capture_context2_frame062.cpp", >- "mini_world/mini_world_capture_context2_frame063.cpp", >- "mini_world/mini_world_capture_context2_frame064.cpp", >- "mini_world/mini_world_capture_context2_frame065.cpp", >- "mini_world/mini_world_capture_context2_frame066.cpp", >- "mini_world/mini_world_capture_context2_frame067.cpp", >- "mini_world/mini_world_capture_context2_frame068.cpp", >- "mini_world/mini_world_capture_context2_frame069.cpp", >- "mini_world/mini_world_capture_context2_frame070.cpp", >- "mini_world/mini_world_capture_context2_frame071.cpp", >- "mini_world/mini_world_capture_context2_frame072.cpp", >- "mini_world/mini_world_capture_context2_frame073.cpp", >- "mini_world/mini_world_capture_context2_frame074.cpp", >- "mini_world/mini_world_capture_context2_frame075.cpp", >- "mini_world/mini_world_capture_context2_frame076.cpp", >- "mini_world/mini_world_capture_context2_frame077.cpp", >- "mini_world/mini_world_capture_context2_frame078.cpp", >- "mini_world/mini_world_capture_context2_frame079.cpp", >- "mini_world/mini_world_capture_context2_frame080.cpp", >- "mini_world/mini_world_capture_context2_frame081.cpp", >- "mini_world/mini_world_capture_context2_frame082.cpp", >- "mini_world/mini_world_capture_context2_frame083.cpp", >- "mini_world/mini_world_capture_context2_frame084.cpp", >- "mini_world/mini_world_capture_context2_frame085.cpp", >- "mini_world/mini_world_capture_context2_frame086.cpp", >- "mini_world/mini_world_capture_context2_frame087.cpp", >- "mini_world/mini_world_capture_context2_frame088.cpp", >- "mini_world/mini_world_capture_context2_frame089.cpp", >- "mini_world/mini_world_capture_context2_frame090.cpp", >- "mini_world/mini_world_capture_context2_frame091.cpp", >- "mini_world/mini_world_capture_context2_frame092.cpp", >- "mini_world/mini_world_capture_context2_frame093.cpp", >- "mini_world/mini_world_capture_context2_frame094.cpp", >- "mini_world/mini_world_capture_context2_frame095.cpp", >- "mini_world/mini_world_capture_context2_frame096.cpp", >- "mini_world/mini_world_capture_context2_frame097.cpp", >- "mini_world/mini_world_capture_context2_frame098.cpp", >- "mini_world/mini_world_capture_context2_frame099.cpp", >- "mini_world/mini_world_capture_context2_frame100.cpp", >- "mini_world/mini_world_capture_shared.cpp", >- ], >- [ >- "mini_world/mini_world.angledata.gz", >- "mini_world/mini_world.json", >- ], >- "mini_world/mini_world_capture_context2", >- ], >- [ >- "mobile_legends", >- 1, >- [ >- "mobile_legends/mobile_legends_capture_context1_frame001.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame002.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame003.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame004.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame005.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame006.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame007.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame008.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame009.cpp", >- "mobile_legends/mobile_legends_capture_context1_frame010.cpp", >- ], >- [ "mobile_legends/mobile_legends_capture_context1.angledata.gz" ], >- "mobile_legends/mobile_legends_capture_context1", >- ], >- [ >- "my_talking_tom2", >- 2, >- [ >- "my_talking_tom2/my_talking_tom2_context2_frame001.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame002.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame003.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame004.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame005.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame006.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame007.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame008.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame009.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame010.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame011.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame012.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame013.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame014.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame015.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame016.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame017.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame018.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame019.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame020.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame021.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame022.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame023.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame024.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame025.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame026.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame027.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame028.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame029.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame030.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame031.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame032.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame033.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame034.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame035.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame036.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame037.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame038.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame039.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame040.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame041.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame042.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame043.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame044.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame045.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame046.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame047.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame048.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame049.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame050.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame051.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame052.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame053.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame054.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame055.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame056.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame057.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame058.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame059.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame060.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame061.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame062.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame063.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame064.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame065.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame066.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame067.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame068.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame069.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame070.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame071.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame072.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame073.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame074.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame075.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame076.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame077.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame078.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame079.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame080.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame081.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame082.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame083.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame084.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame085.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame086.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame087.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame088.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame089.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame090.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame091.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame092.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame093.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame094.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame095.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame096.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame097.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame098.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame099.cpp", >- "my_talking_tom2/my_talking_tom2_context2_frame100.cpp", >- "my_talking_tom2/my_talking_tom2_shared.cpp", >- ], >- [ >- "my_talking_tom2/my_talking_tom2.angledata.gz", >- "my_talking_tom2/my_talking_tom2.json", >- ], >- "my_talking_tom2/my_talking_tom2_context2", >- ], >- [ >- "my_talking_tom_friends", >- 2, >- [ >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame001.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame002.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame003.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame004.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame005.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame006.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame007.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame008.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame009.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame010.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame011.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame012.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame013.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame014.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame015.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame016.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame017.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame018.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame019.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame020.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame021.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame022.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame023.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame024.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame025.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame026.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame027.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame028.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame029.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame030.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame031.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame032.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame033.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame034.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame035.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame036.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame037.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame038.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame039.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame040.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame041.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame042.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame043.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame044.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame045.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame046.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame047.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame048.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame049.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame050.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame051.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame052.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame053.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame054.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame055.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame056.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame057.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame058.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame059.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame060.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame061.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame062.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame063.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame064.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame065.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame066.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame067.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame068.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame069.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame070.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame071.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame072.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame073.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame074.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame075.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame076.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame077.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame078.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame079.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame080.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame081.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame082.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame083.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame084.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame085.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame086.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame087.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame088.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame089.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame090.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame091.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame092.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame093.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame094.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame095.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame096.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame097.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame098.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame099.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_context2_frame100.cpp", >- "my_talking_tom_friends/my_talking_tom_friends_shared.cpp", >- ], >- [ >- "my_talking_tom_friends/my_talking_tom_friends.angledata.gz", >- "my_talking_tom_friends/my_talking_tom_friends.json", >- ], >- "my_talking_tom_friends/my_talking_tom_friends_context2", >- ], >- [ >- "nba2k20_800", >- 1, >- [ >- "nba2k20_800/nba2k20_800_capture_context1_frame001.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame002.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame003.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame004.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame005.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame006.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame007.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame008.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame009.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame010.cpp", >- "nba2k20_800/nba2k20_800_capture_context1_frame011.cpp", >- ], >- [ "nba2k20_800/nba2k20_800_capture_context1.angledata.gz" ], >- "nba2k20_800/nba2k20_800_capture_context1", >- ], >- [ >- "nier_reincarnation", >- 2, >- [ >- "nier_reincarnation/nier_reincarnation_capture_context2_frame001.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame002.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame003.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame004.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame005.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame006.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame007.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame008.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame009.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame010.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame011.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame012.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame013.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame014.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame015.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame016.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame017.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame018.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame019.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame020.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame021.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame022.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame023.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame024.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame025.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame026.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame027.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame028.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame029.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame030.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame031.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame032.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame033.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame034.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame035.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame036.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame037.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame038.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame039.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame040.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame041.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame042.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame043.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame044.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame045.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame046.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame047.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame048.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame049.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame050.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame051.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame052.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame053.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame054.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame055.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame056.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame057.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame058.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame059.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame060.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame061.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame062.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame063.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame064.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame065.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame066.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame067.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame068.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame069.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame070.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame071.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame072.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame073.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame074.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame075.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame076.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame077.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame078.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame079.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame080.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame081.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame082.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame083.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame084.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame085.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame086.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame087.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame088.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame089.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame090.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame091.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame092.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame093.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame094.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame095.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame096.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame097.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame098.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame099.cpp", >- "nier_reincarnation/nier_reincarnation_capture_context2_frame100.cpp", >- "nier_reincarnation/nier_reincarnation_capture_shared.cpp", >- ], >- [ "nier_reincarnation/nier_reincarnation.angledata.gz" ], >- "nier_reincarnation/nier_reincarnation_capture_context2", >- ], >- [ >- "one_punch_man", >- 1, >- [ >- "one_punch_man/one_punch_man_capture_context1_frame001.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame002.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame003.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame004.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame005.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame006.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame007.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame008.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame009.cpp", >- "one_punch_man/one_punch_man_capture_context1_frame010.cpp", >- ], >- [ "one_punch_man/one_punch_man_capture_context1.angledata.gz" ], >- "one_punch_man/one_punch_man_capture_context1", >- ], >- [ >- "plants_vs_zombies_2", >- 1, >- [ >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame001.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame002.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame003.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame004.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame005.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame006.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame007.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame008.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame009.cpp", >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1_frame010.cpp", >- ], >- [ "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1.angledata.gz" ], >- "plants_vs_zombies_2/plants_vs_zombies_2_capture_context1", >- ], >- [ >- "pokemon_go", >- 2, >- [ >- "pokemon_go/pokemon_go_capture_context2_frame001.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame002.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame003.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame004.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame005.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame006.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame007.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame008.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame009.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame010.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame011.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame012.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame013.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame014.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame015.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame016.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame017.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame018.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame019.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame020.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame021.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame022.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame023.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame024.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame025.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame026.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame027.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame028.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame029.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame030.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame031.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame032.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame033.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame034.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame035.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame036.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame037.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame038.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame039.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame040.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame041.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame042.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame043.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame044.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame045.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame046.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame047.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame048.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame049.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame050.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame051.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame052.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame053.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame054.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame055.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame056.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame057.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame058.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame059.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame060.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame061.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame062.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame063.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame064.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame065.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame066.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame067.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame068.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame069.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame070.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame071.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame072.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame073.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame074.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame075.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame076.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame077.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame078.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame079.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame080.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame081.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame082.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame083.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame084.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame085.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame086.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame087.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame088.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame089.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame090.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame091.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame092.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame093.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame094.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame095.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame096.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame097.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame098.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame099.cpp", >- "pokemon_go/pokemon_go_capture_context2_frame100.cpp", >- ], >- [ "pokemon_go/pokemon_go_capture_context2.angledata.gz" ], >- "pokemon_go/pokemon_go_capture_context2", >- ], >- [ >- "pokemon_unite", >- 2, >- [ >- "pokemon_unite/pokemon_unite_context2_frame001.cpp", >- "pokemon_unite/pokemon_unite_context2_frame002.cpp", >- "pokemon_unite/pokemon_unite_context2_frame003.cpp", >- "pokemon_unite/pokemon_unite_context2_frame004.cpp", >- "pokemon_unite/pokemon_unite_context2_frame005.cpp", >- "pokemon_unite/pokemon_unite_context2_frame006.cpp", >- "pokemon_unite/pokemon_unite_context2_frame007.cpp", >- "pokemon_unite/pokemon_unite_context2_frame008.cpp", >- "pokemon_unite/pokemon_unite_context2_frame009.cpp", >- "pokemon_unite/pokemon_unite_context2_frame010.cpp", >- "pokemon_unite/pokemon_unite_context2_frame011.cpp", >- "pokemon_unite/pokemon_unite_context2_frame012.cpp", >- "pokemon_unite/pokemon_unite_context2_frame013.cpp", >- "pokemon_unite/pokemon_unite_context2_frame014.cpp", >- "pokemon_unite/pokemon_unite_context2_frame015.cpp", >- "pokemon_unite/pokemon_unite_context2_frame016.cpp", >- "pokemon_unite/pokemon_unite_context2_frame017.cpp", >- "pokemon_unite/pokemon_unite_context2_frame018.cpp", >- "pokemon_unite/pokemon_unite_context2_frame019.cpp", >- "pokemon_unite/pokemon_unite_context2_frame020.cpp", >- "pokemon_unite/pokemon_unite_context2_frame021.cpp", >- "pokemon_unite/pokemon_unite_context2_frame022.cpp", >- "pokemon_unite/pokemon_unite_context2_frame023.cpp", >- "pokemon_unite/pokemon_unite_context2_frame024.cpp", >- "pokemon_unite/pokemon_unite_context2_frame025.cpp", >- "pokemon_unite/pokemon_unite_context2_frame026.cpp", >- "pokemon_unite/pokemon_unite_context2_frame027.cpp", >- "pokemon_unite/pokemon_unite_context2_frame028.cpp", >- "pokemon_unite/pokemon_unite_context2_frame029.cpp", >- "pokemon_unite/pokemon_unite_context2_frame030.cpp", >- "pokemon_unite/pokemon_unite_context2_frame031.cpp", >- "pokemon_unite/pokemon_unite_context2_frame032.cpp", >- "pokemon_unite/pokemon_unite_context2_frame033.cpp", >- "pokemon_unite/pokemon_unite_context2_frame034.cpp", >- "pokemon_unite/pokemon_unite_context2_frame035.cpp", >- "pokemon_unite/pokemon_unite_context2_frame036.cpp", >- "pokemon_unite/pokemon_unite_context2_frame037.cpp", >- "pokemon_unite/pokemon_unite_context2_frame038.cpp", >- "pokemon_unite/pokemon_unite_context2_frame039.cpp", >- "pokemon_unite/pokemon_unite_context2_frame040.cpp", >- "pokemon_unite/pokemon_unite_context2_frame041.cpp", >- "pokemon_unite/pokemon_unite_context2_frame042.cpp", >- "pokemon_unite/pokemon_unite_context2_frame043.cpp", >- "pokemon_unite/pokemon_unite_context2_frame044.cpp", >- "pokemon_unite/pokemon_unite_context2_frame045.cpp", >- "pokemon_unite/pokemon_unite_context2_frame046.cpp", >- "pokemon_unite/pokemon_unite_context2_frame047.cpp", >- "pokemon_unite/pokemon_unite_context2_frame048.cpp", >- "pokemon_unite/pokemon_unite_context2_frame049.cpp", >- "pokemon_unite/pokemon_unite_context2_frame050.cpp", >- "pokemon_unite/pokemon_unite_context2_frame051.cpp", >- "pokemon_unite/pokemon_unite_context2_frame052.cpp", >- "pokemon_unite/pokemon_unite_context2_frame053.cpp", >- "pokemon_unite/pokemon_unite_context2_frame054.cpp", >- "pokemon_unite/pokemon_unite_context2_frame055.cpp", >- "pokemon_unite/pokemon_unite_context2_frame056.cpp", >- "pokemon_unite/pokemon_unite_context2_frame057.cpp", >- "pokemon_unite/pokemon_unite_context2_frame058.cpp", >- "pokemon_unite/pokemon_unite_context2_frame059.cpp", >- "pokemon_unite/pokemon_unite_context2_frame060.cpp", >- "pokemon_unite/pokemon_unite_context2_frame061.cpp", >- "pokemon_unite/pokemon_unite_context2_frame062.cpp", >- "pokemon_unite/pokemon_unite_context2_frame063.cpp", >- "pokemon_unite/pokemon_unite_context2_frame064.cpp", >- "pokemon_unite/pokemon_unite_context2_frame065.cpp", >- "pokemon_unite/pokemon_unite_context2_frame066.cpp", >- "pokemon_unite/pokemon_unite_context2_frame067.cpp", >- "pokemon_unite/pokemon_unite_context2_frame068.cpp", >- "pokemon_unite/pokemon_unite_context2_frame069.cpp", >- "pokemon_unite/pokemon_unite_context2_frame070.cpp", >- "pokemon_unite/pokemon_unite_context2_frame071.cpp", >- "pokemon_unite/pokemon_unite_context2_frame072.cpp", >- "pokemon_unite/pokemon_unite_context2_frame073.cpp", >- "pokemon_unite/pokemon_unite_context2_frame074.cpp", >- "pokemon_unite/pokemon_unite_context2_frame075.cpp", >- "pokemon_unite/pokemon_unite_context2_frame076.cpp", >- "pokemon_unite/pokemon_unite_context2_frame077.cpp", >- "pokemon_unite/pokemon_unite_context2_frame078.cpp", >- "pokemon_unite/pokemon_unite_context2_frame079.cpp", >- "pokemon_unite/pokemon_unite_context2_frame080.cpp", >- "pokemon_unite/pokemon_unite_context2_frame081.cpp", >- "pokemon_unite/pokemon_unite_context2_frame082.cpp", >- "pokemon_unite/pokemon_unite_context2_frame083.cpp", >- "pokemon_unite/pokemon_unite_context2_frame084.cpp", >- "pokemon_unite/pokemon_unite_context2_frame085.cpp", >- "pokemon_unite/pokemon_unite_context2_frame086.cpp", >- "pokemon_unite/pokemon_unite_context2_frame087.cpp", >- "pokemon_unite/pokemon_unite_context2_frame088.cpp", >- "pokemon_unite/pokemon_unite_context2_frame089.cpp", >- "pokemon_unite/pokemon_unite_context2_frame090.cpp", >- "pokemon_unite/pokemon_unite_context2_frame091.cpp", >- "pokemon_unite/pokemon_unite_context2_frame092.cpp", >- "pokemon_unite/pokemon_unite_context2_frame093.cpp", >- "pokemon_unite/pokemon_unite_context2_frame094.cpp", >- "pokemon_unite/pokemon_unite_context2_frame095.cpp", >- "pokemon_unite/pokemon_unite_context2_frame096.cpp", >- "pokemon_unite/pokemon_unite_context2_frame097.cpp", >- "pokemon_unite/pokemon_unite_context2_frame098.cpp", >- "pokemon_unite/pokemon_unite_context2_frame099.cpp", >- "pokemon_unite/pokemon_unite_context2_frame100.cpp", >- "pokemon_unite/pokemon_unite_shared.cpp", >- ], >- [ >- "pokemon_unite/pokemon_unite.angledata.gz", >- "pokemon_unite/pokemon_unite.json", >- ], >- "pokemon_unite/pokemon_unite_context2", >- ], >- [ >- "professional_baseball_spirits", >- 1, >- [ >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame001.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame002.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame003.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame004.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame005.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame006.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame007.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame008.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame009.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame010.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame011.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame012.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame013.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame014.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame015.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame016.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame017.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame018.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame019.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame020.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame021.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame022.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame023.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame024.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame025.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame026.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame027.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame028.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame029.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame030.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame031.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame032.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame033.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame034.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame035.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame036.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame037.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame038.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame039.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame040.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame041.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame042.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame043.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame044.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame045.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame046.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame047.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame048.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame049.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame050.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame051.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame052.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame053.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame054.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame055.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame056.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame057.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame058.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame059.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame060.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame061.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame062.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame063.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame064.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame065.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame066.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame067.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame068.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame069.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame070.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame071.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame072.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame073.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame074.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame075.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame076.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame077.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame078.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame079.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame080.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame081.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame082.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame083.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame084.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame085.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame086.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame087.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame088.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame089.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame090.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame091.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame092.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame093.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame094.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame095.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame096.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame097.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame098.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame099.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame100.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame101.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame102.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame103.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame104.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame105.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame106.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame107.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame108.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame109.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame110.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame111.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame112.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame113.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame114.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame115.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame116.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame117.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame118.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame119.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame120.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame121.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame122.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame123.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame124.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame125.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame126.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame127.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame128.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame129.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame130.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame131.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame132.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame133.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame134.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame135.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame136.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame137.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame138.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame139.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame140.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame141.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame142.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame143.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame144.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame145.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame146.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame147.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame148.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame149.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame150.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame151.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame152.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame153.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame154.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame155.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame156.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame157.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame158.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame159.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame160.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame161.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame162.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame163.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame164.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame165.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame166.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame167.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame168.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame169.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame170.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame171.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame172.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame173.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame174.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame175.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame176.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame177.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame178.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame179.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame180.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame181.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame182.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame183.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame184.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame185.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame186.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame187.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame188.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame189.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame190.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame191.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame192.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame193.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame194.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame195.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame196.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame197.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame198.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame199.cpp", >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1_frame200.cpp", >- ], >- [ "professional_baseball_spirits/professional_baseball_spirits_capture_context1.angledata.gz" ], >- "professional_baseball_spirits/professional_baseball_spirits_capture_context1", >- ], >- [ >- "pubg_mobile_battle_royale", >- 6, >- [ >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame001.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame002.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame003.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame004.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame005.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame006.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame007.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame008.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame009.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame010.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame011.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame012.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame013.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame014.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame015.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame016.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame017.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame018.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame019.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame020.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame021.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame022.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame023.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame024.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame025.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame026.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame027.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame028.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame029.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame030.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame031.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame032.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame033.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame034.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame035.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame036.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame037.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame038.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame039.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame040.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame041.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame042.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame043.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame044.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame045.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame046.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame047.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame048.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame049.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame050.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame051.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame052.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame053.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame054.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame055.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame056.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame057.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame058.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame059.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame060.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame061.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame062.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame063.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame064.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame065.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame066.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame067.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame068.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame069.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame070.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame071.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame072.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame073.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame074.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame075.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame076.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame077.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame078.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame079.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame080.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame081.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame082.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame083.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame084.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame085.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame086.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame087.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame088.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame089.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame090.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame091.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame092.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame093.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame094.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame095.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame096.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame097.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame098.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame099.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6_frame100.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context5_frame001.cpp", >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_frame001.cpp", >- ], >- [ "pubg_mobile_battle_royale/pubg_mobile_battle_royale.angledata.gz" ], >- "pubg_mobile_battle_royale/pubg_mobile_battle_royale_capture_context6", >- ], >- [ >- "pubg_mobile_lite", >- 1, >- [ >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame001.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame002.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame003.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame004.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame005.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame006.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame007.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame008.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame009.cpp", >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1_frame010.cpp", >- ], >- [ "pubg_mobile_lite/pubg_mobile_lite_capture_context1.angledata.gz" ], >- "pubg_mobile_lite/pubg_mobile_lite_capture_context1", >- ], >- [ >- "pubg_mobile_skydive", >- 6, >- [ >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame001.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame002.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame003.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame004.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame005.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame006.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame007.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame008.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame009.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame010.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame011.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame012.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame013.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame014.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame015.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame016.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame017.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame018.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame019.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame020.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame021.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame022.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame023.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame024.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame025.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame026.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame027.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame028.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame029.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame030.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame031.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame032.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame033.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame034.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame035.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame036.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame037.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame038.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame039.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame040.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame041.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame042.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame043.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame044.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame045.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame046.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame047.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame048.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame049.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame050.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame051.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame052.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame053.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame054.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame055.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame056.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame057.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame058.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame059.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame060.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame061.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame062.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame063.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame064.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame065.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame066.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame067.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame068.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame069.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame070.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame071.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame072.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame073.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame074.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame075.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame076.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame077.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame078.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame079.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame080.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame081.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame082.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame083.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame084.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame085.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame086.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame087.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame088.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame089.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame090.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame091.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame092.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame093.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame094.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame095.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame096.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame097.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame098.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame099.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6_frame100.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context5_frame001.cpp", >- "pubg_mobile_skydive/pubg_mobile_skydive_frame001.cpp", >- ], >- [ "pubg_mobile_skydive/pubg_mobile_skydive.angledata.gz" ], >- "pubg_mobile_skydive/pubg_mobile_skydive_capture_context6", >- ], >- [ >- "ragnarok_m_eternal_love", >- 1, >- [ >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame001.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame002.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame003.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame004.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame005.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame006.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame007.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame008.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame009.cpp", >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1_frame010.cpp", >- ], >- [ "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1.angledata.gz" ], >- "ragnarok_m_eternal_love/ragnarok_m_eternal_love_capture_context1", >- ], >- [ >- "raid_shadow_legends", >- 1, >- [ >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame001.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame002.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame003.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame004.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame005.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame006.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame007.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame008.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame009.cpp", >- "raid_shadow_legends/raid_shadow_legends_capture_context1_frame010.cpp", >- ], >- [ "raid_shadow_legends/raid_shadow_legends_capture_context1.angledata.gz" ], >- "raid_shadow_legends/raid_shadow_legends_capture_context1", >- ], >- [ >- "real_commando_secret_mission", >- 1, >- [ >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame001.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame002.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame003.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame004.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame005.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame006.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame007.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame008.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame009.cpp", >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1_frame010.cpp", >- ], >- [ "real_commando_secret_mission/real_commando_secret_mission_capture_context1.angledata.gz" ], >- "real_commando_secret_mission/real_commando_secret_mission_capture_context1", >- ], >- [ >- "real_cricket_20", >- 1, >- [ >- "real_cricket_20/real_cricket_20_capture_context1_frame001.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame002.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame003.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame004.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame005.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame006.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame007.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame008.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame009.cpp", >- "real_cricket_20/real_cricket_20_capture_context1_frame010.cpp", >- ], >- [ "real_cricket_20/real_cricket_20_capture_context1.angledata.gz" ], >- "real_cricket_20/real_cricket_20_capture_context1", >- ], >- [ >- "real_gangster_crime", >- 1, >- [ >- "real_gangster_crime/real_gangster_crime_capture_context1_frame001.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame002.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame003.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame004.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame005.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame006.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame007.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame008.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame009.cpp", >- "real_gangster_crime/real_gangster_crime_capture_context1_frame010.cpp", >- ], >- [ "real_gangster_crime/real_gangster_crime_capture_context1.angledata.gz" ], >- "real_gangster_crime/real_gangster_crime_capture_context1", >- ], >- [ >- "rise_of_kingdoms", >- 1, >- [ >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame001.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame002.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame003.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame004.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame005.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame006.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame007.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame008.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame009.cpp", >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1_frame010.cpp", >- ], >- [ "rise_of_kingdoms/rise_of_kingdoms_capture_context1.angledata.gz" ], >- "rise_of_kingdoms/rise_of_kingdoms_capture_context1", >- ], >- [ >- "romancing_saga", >- 1, >- [ >- "romancing_saga/romancing_saga_capture_context1_frame001.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame002.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame003.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame004.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame005.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame006.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame007.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame008.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame009.cpp", >- "romancing_saga/romancing_saga_capture_context1_frame010.cpp", >- ], >- [ "romancing_saga/romancing_saga_capture_context1.angledata.gz" ], >- "romancing_saga/romancing_saga_capture_context1", >- ], >- [ >- "rope_hero_vice_town", >- 1, >- [ >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame001.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame002.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame003.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame004.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame005.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame006.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame007.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame008.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame009.cpp", >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1_frame010.cpp", >- ], >- [ "rope_hero_vice_town/rope_hero_vice_town_capture_context1.angledata.gz" ], >- "rope_hero_vice_town/rope_hero_vice_town_capture_context1", >- ], >- [ >- "saint_seiya_awakening", >- 1, >- [ >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame001.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame002.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame003.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame004.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame005.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame006.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame007.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame008.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame009.cpp", >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1_frame010.cpp", >- ], >- [ "saint_seiya_awakening/saint_seiya_awakening_capture_context1.angledata.gz" ], >- "saint_seiya_awakening/saint_seiya_awakening_capture_context1", >- ], >- [ >- "sakura_school_simulator", >- 2, >- [ >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame001.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame002.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame003.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame004.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame005.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame006.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame007.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame008.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame009.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame010.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame011.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame012.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame013.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame014.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame015.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame016.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame017.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame018.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame019.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame020.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame021.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame022.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame023.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame024.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame025.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame026.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame027.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame028.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame029.cpp", >- "sakura_school_simulator/sakura_school_simulator_capture_context2_frame030.cpp", >- ], >- [ "sakura_school_simulator/sakura_school_simulator_capture_context2.angledata.gz" ], >- "sakura_school_simulator/sakura_school_simulator_capture_context2", >- ], >- [ >- "scrabble_go", >- 2, >- [ >- "scrabble_go/scrabble_go_capture_context2_frame001.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame002.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame003.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame004.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame005.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame006.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame007.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame008.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame009.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame010.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame011.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame012.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame013.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame014.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame015.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame016.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame017.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame018.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame019.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame020.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame021.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame022.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame023.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame024.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame025.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame026.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame027.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame028.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame029.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame030.cpp", >- "scrabble_go/scrabble_go_capture_context2_frame031.cpp", >- "scrabble_go/scrabble_go_capture_shared.cpp", >- ], >- [ "scrabble_go/scrabble_go.angledata.gz" ], >- "scrabble_go/scrabble_go_capture_context2", >- ], >- [ >- "shadow_fight_2", >- 1, >- [ >- "shadow_fight_2/shadow_fight_2_capture_context1_frame001.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame002.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame003.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame004.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame005.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame006.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame007.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame008.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame009.cpp", >- "shadow_fight_2/shadow_fight_2_capture_context1_frame010.cpp", >- ], >- [ "shadow_fight_2/shadow_fight_2_capture_context1.angledata.gz" ], >- "shadow_fight_2/shadow_fight_2_capture_context1", >- ], >- [ >- "slingshot_test1", >- 2, >- [ >- "slingshot_test1/slingshot_test1_capture_context2_frame001.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame002.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame003.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame004.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame005.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame006.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame007.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame008.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame009.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame010.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame011.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame012.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame013.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame014.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame015.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame016.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame017.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame018.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame019.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame020.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame021.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame022.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame023.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame024.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame025.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame026.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame027.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame028.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame029.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame030.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame031.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame032.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame033.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame034.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame035.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame036.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame037.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame038.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame039.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame040.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame041.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame042.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame043.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame044.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame045.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame046.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame047.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame048.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame049.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame050.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame051.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame052.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame053.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame054.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame055.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame056.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame057.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame058.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame059.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame060.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame061.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame062.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame063.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame064.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame065.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame066.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame067.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame068.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame069.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame070.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame071.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame072.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame073.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame074.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame075.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame076.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame077.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame078.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame079.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame080.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame081.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame082.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame083.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame084.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame085.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame086.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame087.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame088.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame089.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame090.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame091.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame092.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame093.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame094.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame095.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame096.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame097.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame098.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame099.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame100.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame101.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame102.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame103.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame104.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame105.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame106.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame107.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame108.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame109.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame110.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame111.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame112.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame113.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame114.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame115.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame116.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame117.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame118.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame119.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame120.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame121.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame122.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame123.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame124.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame125.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame126.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame127.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame128.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame129.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame130.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame131.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame132.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame133.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame134.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame135.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame136.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame137.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame138.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame139.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame140.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame141.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame142.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame143.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame144.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame145.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame146.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame147.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame148.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame149.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame150.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame151.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame152.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame153.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame154.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame155.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame156.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame157.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame158.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame159.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame160.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame161.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame162.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame163.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame164.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame165.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame166.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame167.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame168.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame169.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame170.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame171.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame172.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame173.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame174.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame175.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame176.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame177.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame178.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame179.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame180.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame181.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame182.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame183.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame184.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame185.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame186.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame187.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame188.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame189.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame190.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame191.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame192.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame193.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame194.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame195.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame196.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame197.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame198.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame199.cpp", >- "slingshot_test1/slingshot_test1_capture_context2_frame200.cpp", >- ], >- [ "slingshot_test1/slingshot_test1_capture_context2.angledata.gz" ], >- "slingshot_test1/slingshot_test1_capture_context2", >- ], >- [ >- "slingshot_test2", >- 2, >- [ >- "slingshot_test2/slingshot_test2_capture_context2_frame001.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame002.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame003.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame004.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame005.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame006.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame007.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame008.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame009.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame010.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame011.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame012.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame013.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame014.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame015.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame016.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame017.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame018.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame019.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame020.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame021.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame022.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame023.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame024.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame025.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame026.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame027.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame028.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame029.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame030.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame031.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame032.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame033.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame034.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame035.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame036.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame037.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame038.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame039.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame040.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame041.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame042.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame043.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame044.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame045.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame046.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame047.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame048.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame049.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame050.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame051.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame052.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame053.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame054.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame055.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame056.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame057.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame058.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame059.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame060.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame061.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame062.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame063.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame064.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame065.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame066.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame067.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame068.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame069.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame070.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame071.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame072.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame073.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame074.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame075.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame076.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame077.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame078.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame079.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame080.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame081.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame082.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame083.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame084.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame085.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame086.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame087.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame088.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame089.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame090.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame091.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame092.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame093.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame094.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame095.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame096.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame097.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame098.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame099.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame100.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame101.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame102.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame103.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame104.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame105.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame106.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame107.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame108.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame109.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame110.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame111.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame112.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame113.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame114.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame115.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame116.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame117.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame118.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame119.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame120.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame121.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame122.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame123.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame124.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame125.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame126.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame127.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame128.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame129.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame130.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame131.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame132.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame133.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame134.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame135.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame136.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame137.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame138.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame139.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame140.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame141.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame142.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame143.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame144.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame145.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame146.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame147.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame148.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame149.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame150.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame151.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame152.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame153.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame154.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame155.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame156.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame157.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame158.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame159.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame160.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame161.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame162.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame163.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame164.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame165.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame166.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame167.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame168.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame169.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame170.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame171.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame172.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame173.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame174.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame175.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame176.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame177.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame178.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame179.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame180.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame181.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame182.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame183.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame184.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame185.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame186.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame187.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame188.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame189.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame190.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame191.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame192.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame193.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame194.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame195.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame196.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame197.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame198.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame199.cpp", >- "slingshot_test2/slingshot_test2_capture_context2_frame200.cpp", >- ], >- [ "slingshot_test2/slingshot_test2_capture_context2.angledata.gz" ], >- "slingshot_test2/slingshot_test2_capture_context2", >- ], >- [ >- "sniper_3d", >- 1, >- [ >- "sniper_3d/sniper_3d_capture_context1_frame001.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame002.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame003.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame004.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame005.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame006.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame007.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame008.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame009.cpp", >- "sniper_3d/sniper_3d_capture_context1_frame010.cpp", >- ], >- [ "sniper_3d/sniper_3d_capture_context1.angledata.gz" ], >- "sniper_3d/sniper_3d_capture_context1", >- ], >- [ >- "sonic_the_hedgehog", >- 2, >- [ >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame001.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame002.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame003.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame004.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame005.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame006.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame007.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame008.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame009.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame010.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame011.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame012.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame013.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame014.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame015.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame016.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame017.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame018.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame019.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame020.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame021.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame022.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame023.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame024.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame025.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame026.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame027.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame028.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame029.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame030.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame031.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame032.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame033.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame034.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame035.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame036.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame037.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame038.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame039.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame040.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame041.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame042.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame043.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame044.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame045.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame046.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame047.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame048.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame049.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2_frame050.cpp", >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_shared.cpp", >- ], >- [ "sonic_the_hedgehog/sonic_the_hedgehog.angledata.gz" ], >- "sonic_the_hedgehog/sonic_the_hedgehog_capture_context2", >- ], >- [ >- "standoff_2", >- 1, >- [ >- "standoff_2/standoff_2_capture_context1_frame001.cpp", >- "standoff_2/standoff_2_capture_context1_frame002.cpp", >- "standoff_2/standoff_2_capture_context1_frame003.cpp", >- "standoff_2/standoff_2_capture_context1_frame004.cpp", >- "standoff_2/standoff_2_capture_context1_frame005.cpp", >- "standoff_2/standoff_2_capture_context1_frame006.cpp", >- "standoff_2/standoff_2_capture_context1_frame007.cpp", >- "standoff_2/standoff_2_capture_context1_frame008.cpp", >- "standoff_2/standoff_2_capture_context1_frame009.cpp", >- "standoff_2/standoff_2_capture_context1_frame010.cpp", >- ], >- [ "standoff_2/standoff_2_capture_context1.angledata.gz" ], >- "standoff_2/standoff_2_capture_context1", >- ], >- [ >- "subway_princess_runner", >- 2, >- [ >- "subway_princess_runner/subway_princess_runner_capture_context2_frame001.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame002.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame003.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame004.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame005.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame006.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame007.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame008.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame009.cpp", >- "subway_princess_runner/subway_princess_runner_capture_context2_frame010.cpp", >- ], >- [ "subway_princess_runner/subway_princess_runner_capture_context2.angledata.gz" ], >- "subway_princess_runner/subway_princess_runner_capture_context2", >- ], >- [ >- "subway_surfers", >- 1, >- [ >- "subway_surfers/subway_surfers_capture_context1_frame001.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame002.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame003.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame004.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame005.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame006.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame007.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame008.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame009.cpp", >- "subway_surfers/subway_surfers_capture_context1_frame010.cpp", >- ], >- [ "subway_surfers/subway_surfers_capture_context1.angledata.gz" ], >- "subway_surfers/subway_surfers_capture_context1", >- ], >- [ >- "summoners_war", >- 2, >- [ >- "summoners_war/summoners_war_capture_context2_frame001.cpp", >- "summoners_war/summoners_war_capture_context2_frame002.cpp", >- "summoners_war/summoners_war_capture_context2_frame003.cpp", >- "summoners_war/summoners_war_capture_context2_frame004.cpp", >- "summoners_war/summoners_war_capture_context2_frame005.cpp", >- "summoners_war/summoners_war_capture_context2_frame006.cpp", >- "summoners_war/summoners_war_capture_context2_frame007.cpp", >- "summoners_war/summoners_war_capture_context2_frame008.cpp", >- "summoners_war/summoners_war_capture_context2_frame009.cpp", >- "summoners_war/summoners_war_capture_context2_frame010.cpp", >- "summoners_war/summoners_war_capture_context2_frame011.cpp", >- "summoners_war/summoners_war_capture_context2_frame012.cpp", >- "summoners_war/summoners_war_capture_context2_frame013.cpp", >- "summoners_war/summoners_war_capture_context2_frame014.cpp", >- "summoners_war/summoners_war_capture_context2_frame015.cpp", >- "summoners_war/summoners_war_capture_context2_frame016.cpp", >- "summoners_war/summoners_war_capture_context2_frame017.cpp", >- "summoners_war/summoners_war_capture_context2_frame018.cpp", >- "summoners_war/summoners_war_capture_context2_frame019.cpp", >- "summoners_war/summoners_war_capture_context2_frame020.cpp", >- "summoners_war/summoners_war_capture_context2_frame021.cpp", >- "summoners_war/summoners_war_capture_context2_frame022.cpp", >- "summoners_war/summoners_war_capture_context2_frame023.cpp", >- "summoners_war/summoners_war_capture_context2_frame024.cpp", >- "summoners_war/summoners_war_capture_context2_frame025.cpp", >- "summoners_war/summoners_war_capture_context2_frame026.cpp", >- "summoners_war/summoners_war_capture_context2_frame027.cpp", >- "summoners_war/summoners_war_capture_context2_frame028.cpp", >- "summoners_war/summoners_war_capture_context2_frame029.cpp", >- "summoners_war/summoners_war_capture_context2_frame030.cpp", >- "summoners_war/summoners_war_capture_context2_frame031.cpp", >- "summoners_war/summoners_war_capture_context2_frame032.cpp", >- "summoners_war/summoners_war_capture_context2_frame033.cpp", >- "summoners_war/summoners_war_capture_context2_frame034.cpp", >- "summoners_war/summoners_war_capture_context2_frame035.cpp", >- "summoners_war/summoners_war_capture_context2_frame036.cpp", >- "summoners_war/summoners_war_capture_context2_frame037.cpp", >- "summoners_war/summoners_war_capture_context2_frame038.cpp", >- "summoners_war/summoners_war_capture_context2_frame039.cpp", >- "summoners_war/summoners_war_capture_context2_frame040.cpp", >- "summoners_war/summoners_war_capture_context2_frame041.cpp", >- "summoners_war/summoners_war_capture_context2_frame042.cpp", >- "summoners_war/summoners_war_capture_context2_frame043.cpp", >- "summoners_war/summoners_war_capture_context2_frame044.cpp", >- "summoners_war/summoners_war_capture_context2_frame045.cpp", >- "summoners_war/summoners_war_capture_context2_frame046.cpp", >- "summoners_war/summoners_war_capture_context2_frame047.cpp", >- "summoners_war/summoners_war_capture_context2_frame048.cpp", >- "summoners_war/summoners_war_capture_context2_frame049.cpp", >- "summoners_war/summoners_war_capture_context2_frame050.cpp", >- ], >- [ "summoners_war/summoners_war_capture_context2.angledata.gz" ], >- "summoners_war/summoners_war_capture_context2", >- ], >- [ >- "talking_tom_hero_dash", >- 1, >- [ >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame001.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame002.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame003.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame004.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame005.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame006.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame007.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame008.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame009.cpp", >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1_frame010.cpp", >- ], >- [ "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1.angledata.gz" ], >- "talking_tom_hero_dash/talking_tom_hero_dash_capture_context1", >- ], >- [ >- "temple_run_2", >- 1, >- [ >- "temple_run_2/temple_run_2_capture_context1_frame001.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame002.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame003.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame004.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame005.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame006.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame007.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame008.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame009.cpp", >- "temple_run_2/temple_run_2_capture_context1_frame010.cpp", >- ], >- [ "temple_run_2/temple_run_2_capture_context1.angledata.gz" ], >- "temple_run_2/temple_run_2_capture_context1", >- ], >- [ >- "temple_run_300", >- 1, >- [ >- "temple_run_300/temple_run_300_capture_context1_frame001.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame002.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame003.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame004.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame005.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame006.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame007.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame008.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame009.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame010.cpp", >- "temple_run_300/temple_run_300_capture_context1_frame011.cpp", >- ], >- [ "temple_run_300/temple_run_300_capture_context1.angledata.gz" ], >- "temple_run_300/temple_run_300_capture_context1", >- ], >- [ >- "toon_blast", >- 2, >- [ >- "toon_blast/toon_blast_capture_context2_frame001.cpp", >- "toon_blast/toon_blast_capture_context2_frame002.cpp", >- "toon_blast/toon_blast_capture_context2_frame003.cpp", >- "toon_blast/toon_blast_capture_context2_frame004.cpp", >- "toon_blast/toon_blast_capture_context2_frame005.cpp", >- "toon_blast/toon_blast_capture_context2_frame006.cpp", >- "toon_blast/toon_blast_capture_context2_frame007.cpp", >- "toon_blast/toon_blast_capture_context2_frame008.cpp", >- "toon_blast/toon_blast_capture_context2_frame009.cpp", >- "toon_blast/toon_blast_capture_context2_frame010.cpp", >- "toon_blast/toon_blast_capture_context2_frame011.cpp", >- "toon_blast/toon_blast_capture_context2_frame012.cpp", >- "toon_blast/toon_blast_capture_context2_frame013.cpp", >- "toon_blast/toon_blast_capture_context2_frame014.cpp", >- "toon_blast/toon_blast_capture_context2_frame015.cpp", >- "toon_blast/toon_blast_capture_context2_frame016.cpp", >- "toon_blast/toon_blast_capture_context2_frame017.cpp", >- "toon_blast/toon_blast_capture_context2_frame018.cpp", >- "toon_blast/toon_blast_capture_context2_frame019.cpp", >- "toon_blast/toon_blast_capture_context2_frame020.cpp", >- "toon_blast/toon_blast_capture_context2_frame021.cpp", >- "toon_blast/toon_blast_capture_context2_frame022.cpp", >- "toon_blast/toon_blast_capture_context2_frame023.cpp", >- "toon_blast/toon_blast_capture_context2_frame024.cpp", >- "toon_blast/toon_blast_capture_context2_frame025.cpp", >- "toon_blast/toon_blast_capture_context2_frame026.cpp", >- "toon_blast/toon_blast_capture_context2_frame027.cpp", >- "toon_blast/toon_blast_capture_context2_frame028.cpp", >- "toon_blast/toon_blast_capture_context2_frame029.cpp", >- "toon_blast/toon_blast_capture_context2_frame030.cpp", >- "toon_blast/toon_blast_capture_context2_frame031.cpp", >- "toon_blast/toon_blast_capture_context2_frame032.cpp", >- "toon_blast/toon_blast_capture_context2_frame033.cpp", >- "toon_blast/toon_blast_capture_context2_frame034.cpp", >- "toon_blast/toon_blast_capture_context2_frame035.cpp", >- "toon_blast/toon_blast_capture_context2_frame036.cpp", >- "toon_blast/toon_blast_capture_context2_frame037.cpp", >- "toon_blast/toon_blast_capture_context2_frame038.cpp", >- "toon_blast/toon_blast_capture_context2_frame039.cpp", >- "toon_blast/toon_blast_capture_context2_frame040.cpp", >- "toon_blast/toon_blast_capture_context2_frame041.cpp", >- "toon_blast/toon_blast_capture_context2_frame042.cpp", >- "toon_blast/toon_blast_capture_context2_frame043.cpp", >- "toon_blast/toon_blast_capture_context2_frame044.cpp", >- "toon_blast/toon_blast_capture_context2_frame045.cpp", >- "toon_blast/toon_blast_capture_context2_frame046.cpp", >- "toon_blast/toon_blast_capture_context2_frame047.cpp", >- "toon_blast/toon_blast_capture_context2_frame048.cpp", >- "toon_blast/toon_blast_capture_context2_frame049.cpp", >- "toon_blast/toon_blast_capture_context2_frame050.cpp", >- "toon_blast/toon_blast_capture_context2_frame051.cpp", >- "toon_blast/toon_blast_capture_context2_frame052.cpp", >- "toon_blast/toon_blast_capture_context2_frame053.cpp", >- "toon_blast/toon_blast_capture_context2_frame054.cpp", >- "toon_blast/toon_blast_capture_context2_frame055.cpp", >- "toon_blast/toon_blast_capture_context2_frame056.cpp", >- "toon_blast/toon_blast_capture_context2_frame057.cpp", >- "toon_blast/toon_blast_capture_context2_frame058.cpp", >- "toon_blast/toon_blast_capture_context2_frame059.cpp", >- "toon_blast/toon_blast_capture_context2_frame060.cpp", >- "toon_blast/toon_blast_capture_context2_frame061.cpp", >- "toon_blast/toon_blast_capture_context2_frame062.cpp", >- "toon_blast/toon_blast_capture_context2_frame063.cpp", >- "toon_blast/toon_blast_capture_context2_frame064.cpp", >- "toon_blast/toon_blast_capture_context2_frame065.cpp", >- "toon_blast/toon_blast_capture_context2_frame066.cpp", >- "toon_blast/toon_blast_capture_context2_frame067.cpp", >- "toon_blast/toon_blast_capture_context2_frame068.cpp", >- "toon_blast/toon_blast_capture_context2_frame069.cpp", >- "toon_blast/toon_blast_capture_context2_frame070.cpp", >- "toon_blast/toon_blast_capture_context2_frame071.cpp", >- "toon_blast/toon_blast_capture_context2_frame072.cpp", >- "toon_blast/toon_blast_capture_context2_frame073.cpp", >- "toon_blast/toon_blast_capture_context2_frame074.cpp", >- "toon_blast/toon_blast_capture_context2_frame075.cpp", >- "toon_blast/toon_blast_capture_context2_frame076.cpp", >- "toon_blast/toon_blast_capture_context2_frame077.cpp", >- "toon_blast/toon_blast_capture_context2_frame078.cpp", >- "toon_blast/toon_blast_capture_context2_frame079.cpp", >- "toon_blast/toon_blast_capture_context2_frame080.cpp", >- "toon_blast/toon_blast_capture_context2_frame081.cpp", >- "toon_blast/toon_blast_capture_context2_frame082.cpp", >- "toon_blast/toon_blast_capture_context2_frame083.cpp", >- "toon_blast/toon_blast_capture_context2_frame084.cpp", >- "toon_blast/toon_blast_capture_context2_frame085.cpp", >- "toon_blast/toon_blast_capture_context2_frame086.cpp", >- "toon_blast/toon_blast_capture_context2_frame087.cpp", >- "toon_blast/toon_blast_capture_context2_frame088.cpp", >- "toon_blast/toon_blast_capture_context2_frame089.cpp", >- "toon_blast/toon_blast_capture_context2_frame090.cpp", >- "toon_blast/toon_blast_capture_context2_frame091.cpp", >- "toon_blast/toon_blast_capture_context2_frame092.cpp", >- "toon_blast/toon_blast_capture_context2_frame093.cpp", >- "toon_blast/toon_blast_capture_context2_frame094.cpp", >- "toon_blast/toon_blast_capture_context2_frame095.cpp", >- "toon_blast/toon_blast_capture_context2_frame096.cpp", >- "toon_blast/toon_blast_capture_context2_frame097.cpp", >- "toon_blast/toon_blast_capture_context2_frame098.cpp", >- "toon_blast/toon_blast_capture_context2_frame099.cpp", >- "toon_blast/toon_blast_capture_context2_frame100.cpp", >- ], >- [ "toon_blast/toon_blast_capture_context2.angledata.gz" ], >- "toon_blast/toon_blast_capture_context2", >- ], >- [ >- "township", >- 2, >- [ >- "township/township_capture_context2_frame001.cpp", >- "township/township_capture_context2_frame002.cpp", >- "township/township_capture_context2_frame003.cpp", >- "township/township_capture_context2_frame004.cpp", >- "township/township_capture_context2_frame005.cpp", >- "township/township_capture_context2_frame006.cpp", >- "township/township_capture_context2_frame007.cpp", >- "township/township_capture_context2_frame008.cpp", >- "township/township_capture_context2_frame009.cpp", >- "township/township_capture_context2_frame010.cpp", >- ], >- [ "township/township_capture_context2.angledata.gz" ], >- "township/township_capture_context2", >- ], >- [ >- "trex_200", >- 1, >- [ >- "trex_200/trex_200_capture_context1_frame001.cpp", >- "trex_200/trex_200_capture_context1_frame002.cpp", >- "trex_200/trex_200_capture_context1_frame003.cpp", >- "trex_200/trex_200_capture_context1_frame004.cpp", >- "trex_200/trex_200_capture_context1_frame005.cpp", >- "trex_200/trex_200_capture_context1_frame006.cpp", >- "trex_200/trex_200_capture_context1_frame007.cpp", >- "trex_200/trex_200_capture_context1_frame008.cpp", >- "trex_200/trex_200_capture_context1_frame009.cpp", >- "trex_200/trex_200_capture_context1_frame010.cpp", >- "trex_200/trex_200_capture_context1_frame011.cpp", >- ], >- [ "trex_200/trex_200_capture_context1.angledata.gz" ], >- "trex_200/trex_200_capture_context1", >- ], >- [ >- "whatsapp", >- 1, >- [ >- "whatsapp/whatsapp_capture_context1_frame001.cpp", >- "whatsapp/whatsapp_capture_context1_frame002.cpp", >- "whatsapp/whatsapp_capture_context1_frame003.cpp", >- "whatsapp/whatsapp_capture_context1_frame004.cpp", >- "whatsapp/whatsapp_capture_context1_frame005.cpp", >- "whatsapp/whatsapp_capture_context1_frame006.cpp", >- "whatsapp/whatsapp_capture_context1_frame007.cpp", >- "whatsapp/whatsapp_capture_context1_frame008.cpp", >- "whatsapp/whatsapp_capture_context1_frame009.cpp", >- "whatsapp/whatsapp_capture_context1_frame010.cpp", >- "whatsapp/whatsapp_capture_context1_frame011.cpp", >- "whatsapp/whatsapp_capture_context1_frame012.cpp", >- "whatsapp/whatsapp_capture_context1_frame013.cpp", >- "whatsapp/whatsapp_capture_context1_frame014.cpp", >- "whatsapp/whatsapp_capture_context1_frame015.cpp", >- "whatsapp/whatsapp_capture_context1_frame016.cpp", >- "whatsapp/whatsapp_capture_context1_frame017.cpp", >- "whatsapp/whatsapp_capture_context1_frame018.cpp", >- "whatsapp/whatsapp_capture_context1_frame019.cpp", >- "whatsapp/whatsapp_capture_context1_frame020.cpp", >- "whatsapp/whatsapp_capture_context1_frame021.cpp", >- "whatsapp/whatsapp_capture_context1_frame022.cpp", >- "whatsapp/whatsapp_capture_context1_frame023.cpp", >- "whatsapp/whatsapp_capture_context1_frame024.cpp", >- "whatsapp/whatsapp_capture_context1_frame025.cpp", >- "whatsapp/whatsapp_capture_context1_frame026.cpp", >- "whatsapp/whatsapp_capture_context1_frame027.cpp", >- "whatsapp/whatsapp_capture_context1_frame028.cpp", >- "whatsapp/whatsapp_capture_context1_frame029.cpp", >- "whatsapp/whatsapp_capture_context1_frame030.cpp", >- "whatsapp/whatsapp_capture_context1_frame031.cpp", >- "whatsapp/whatsapp_capture_context1_frame032.cpp", >- "whatsapp/whatsapp_capture_context1_frame033.cpp", >- "whatsapp/whatsapp_capture_context1_frame034.cpp", >- "whatsapp/whatsapp_capture_context1_frame035.cpp", >- "whatsapp/whatsapp_capture_context1_frame036.cpp", >- "whatsapp/whatsapp_capture_context1_frame037.cpp", >- "whatsapp/whatsapp_capture_context1_frame038.cpp", >- "whatsapp/whatsapp_capture_context1_frame039.cpp", >- "whatsapp/whatsapp_capture_context1_frame040.cpp", >- "whatsapp/whatsapp_capture_context1_frame041.cpp", >- "whatsapp/whatsapp_capture_context1_frame042.cpp", >- "whatsapp/whatsapp_capture_context1_frame043.cpp", >- "whatsapp/whatsapp_capture_context1_frame044.cpp", >- "whatsapp/whatsapp_capture_context1_frame045.cpp", >- "whatsapp/whatsapp_capture_context1_frame046.cpp", >- "whatsapp/whatsapp_capture_context1_frame047.cpp", >- "whatsapp/whatsapp_capture_context1_frame048.cpp", >- "whatsapp/whatsapp_capture_context1_frame049.cpp", >- "whatsapp/whatsapp_capture_context1_frame050.cpp", >- "whatsapp/whatsapp_capture_context1_frame051.cpp", >- "whatsapp/whatsapp_capture_context1_frame052.cpp", >- "whatsapp/whatsapp_capture_context1_frame053.cpp", >- "whatsapp/whatsapp_capture_context1_frame054.cpp", >- "whatsapp/whatsapp_capture_context1_frame055.cpp", >- "whatsapp/whatsapp_capture_context1_frame056.cpp", >- "whatsapp/whatsapp_capture_context1_frame057.cpp", >- "whatsapp/whatsapp_capture_context1_frame058.cpp", >- "whatsapp/whatsapp_capture_context1_frame059.cpp", >- "whatsapp/whatsapp_capture_context1_frame060.cpp", >- "whatsapp/whatsapp_capture_context1_frame061.cpp", >- "whatsapp/whatsapp_capture_context1_frame062.cpp", >- "whatsapp/whatsapp_capture_context1_frame063.cpp", >- "whatsapp/whatsapp_capture_context1_frame064.cpp", >- "whatsapp/whatsapp_capture_context1_frame065.cpp", >- "whatsapp/whatsapp_capture_context1_frame066.cpp", >- "whatsapp/whatsapp_capture_context1_frame067.cpp", >- "whatsapp/whatsapp_capture_context1_frame068.cpp", >- "whatsapp/whatsapp_capture_context1_frame069.cpp", >- "whatsapp/whatsapp_capture_context1_frame070.cpp", >- "whatsapp/whatsapp_capture_context1_frame071.cpp", >- "whatsapp/whatsapp_capture_context1_frame072.cpp", >- "whatsapp/whatsapp_capture_context1_frame073.cpp", >- "whatsapp/whatsapp_capture_context1_frame074.cpp", >- "whatsapp/whatsapp_capture_context1_frame075.cpp", >- "whatsapp/whatsapp_capture_context1_frame076.cpp", >- "whatsapp/whatsapp_capture_context1_frame077.cpp", >- "whatsapp/whatsapp_capture_context1_frame078.cpp", >- "whatsapp/whatsapp_capture_context1_frame079.cpp", >- "whatsapp/whatsapp_capture_context1_frame080.cpp", >- "whatsapp/whatsapp_capture_context1_frame081.cpp", >- "whatsapp/whatsapp_capture_context1_frame082.cpp", >- "whatsapp/whatsapp_capture_context1_frame083.cpp", >- "whatsapp/whatsapp_capture_context1_frame084.cpp", >- "whatsapp/whatsapp_capture_context1_frame085.cpp", >- "whatsapp/whatsapp_capture_context1_frame086.cpp", >- "whatsapp/whatsapp_capture_context1_frame087.cpp", >- "whatsapp/whatsapp_capture_context1_frame088.cpp", >- "whatsapp/whatsapp_capture_context1_frame089.cpp", >- "whatsapp/whatsapp_capture_context1_frame090.cpp", >- "whatsapp/whatsapp_capture_context1_frame091.cpp", >- "whatsapp/whatsapp_capture_context1_frame092.cpp", >- "whatsapp/whatsapp_capture_context1_frame093.cpp", >- "whatsapp/whatsapp_capture_context1_frame094.cpp", >- "whatsapp/whatsapp_capture_context1_frame095.cpp", >- "whatsapp/whatsapp_capture_context1_frame096.cpp", >- "whatsapp/whatsapp_capture_context1_frame097.cpp", >- "whatsapp/whatsapp_capture_context1_frame098.cpp", >- "whatsapp/whatsapp_capture_context1_frame099.cpp", >- "whatsapp/whatsapp_capture_context1_frame100.cpp", >- "whatsapp/whatsapp_capture_context1_frame101.cpp", >- "whatsapp/whatsapp_capture_context1_frame102.cpp", >- "whatsapp/whatsapp_capture_context1_frame103.cpp", >- "whatsapp/whatsapp_capture_context1_frame104.cpp", >- "whatsapp/whatsapp_capture_context1_frame105.cpp", >- "whatsapp/whatsapp_capture_context1_frame106.cpp", >- "whatsapp/whatsapp_capture_context1_frame107.cpp", >- "whatsapp/whatsapp_capture_context1_frame108.cpp", >- "whatsapp/whatsapp_capture_context1_frame109.cpp", >- "whatsapp/whatsapp_capture_context1_frame110.cpp", >- "whatsapp/whatsapp_capture_context1_frame111.cpp", >- "whatsapp/whatsapp_capture_context1_frame112.cpp", >- "whatsapp/whatsapp_capture_context1_frame113.cpp", >- "whatsapp/whatsapp_capture_context1_frame114.cpp", >- "whatsapp/whatsapp_capture_context1_frame115.cpp", >- "whatsapp/whatsapp_capture_context1_frame116.cpp", >- "whatsapp/whatsapp_capture_context1_frame117.cpp", >- "whatsapp/whatsapp_capture_context1_frame118.cpp", >- "whatsapp/whatsapp_capture_context1_frame119.cpp", >- "whatsapp/whatsapp_capture_context1_frame120.cpp", >- "whatsapp/whatsapp_capture_context1_frame121.cpp", >- "whatsapp/whatsapp_capture_context1_frame122.cpp", >- "whatsapp/whatsapp_capture_context1_frame123.cpp", >- "whatsapp/whatsapp_capture_context1_frame124.cpp", >- "whatsapp/whatsapp_capture_context1_frame125.cpp", >- "whatsapp/whatsapp_capture_context1_frame126.cpp", >- "whatsapp/whatsapp_capture_context1_frame127.cpp", >- "whatsapp/whatsapp_capture_context1_frame128.cpp", >- "whatsapp/whatsapp_capture_context1_frame129.cpp", >- "whatsapp/whatsapp_capture_context1_frame130.cpp", >- "whatsapp/whatsapp_capture_context1_frame131.cpp", >- "whatsapp/whatsapp_capture_context1_frame132.cpp", >- "whatsapp/whatsapp_capture_context1_frame133.cpp", >- "whatsapp/whatsapp_capture_context1_frame134.cpp", >- "whatsapp/whatsapp_capture_context1_frame135.cpp", >- "whatsapp/whatsapp_capture_context1_frame136.cpp", >- "whatsapp/whatsapp_capture_context1_frame137.cpp", >- "whatsapp/whatsapp_capture_context1_frame138.cpp", >- "whatsapp/whatsapp_capture_context1_frame139.cpp", >- "whatsapp/whatsapp_capture_context1_frame140.cpp", >- "whatsapp/whatsapp_capture_context1_frame141.cpp", >- "whatsapp/whatsapp_capture_context1_frame142.cpp", >- "whatsapp/whatsapp_capture_context1_frame143.cpp", >- "whatsapp/whatsapp_capture_context1_frame144.cpp", >- "whatsapp/whatsapp_capture_context1_frame145.cpp", >- "whatsapp/whatsapp_capture_context1_frame146.cpp", >- "whatsapp/whatsapp_capture_context1_frame147.cpp", >- "whatsapp/whatsapp_capture_context1_frame148.cpp", >- "whatsapp/whatsapp_capture_context1_frame149.cpp", >- "whatsapp/whatsapp_capture_context1_frame150.cpp", >- "whatsapp/whatsapp_capture_context1_frame151.cpp", >- "whatsapp/whatsapp_capture_context1_frame152.cpp", >- "whatsapp/whatsapp_capture_context1_frame153.cpp", >- "whatsapp/whatsapp_capture_context1_frame154.cpp", >- "whatsapp/whatsapp_capture_context1_frame155.cpp", >- "whatsapp/whatsapp_capture_context1_frame156.cpp", >- "whatsapp/whatsapp_capture_context1_frame157.cpp", >- "whatsapp/whatsapp_capture_context1_frame158.cpp", >- "whatsapp/whatsapp_capture_context1_frame159.cpp", >- "whatsapp/whatsapp_capture_context1_frame160.cpp", >- "whatsapp/whatsapp_capture_context1_frame161.cpp", >- "whatsapp/whatsapp_capture_context1_frame162.cpp", >- "whatsapp/whatsapp_capture_context1_frame163.cpp", >- "whatsapp/whatsapp_capture_context1_frame164.cpp", >- "whatsapp/whatsapp_capture_context1_frame165.cpp", >- "whatsapp/whatsapp_capture_context1_frame166.cpp", >- "whatsapp/whatsapp_capture_context1_frame167.cpp", >- "whatsapp/whatsapp_capture_context1_frame168.cpp", >- "whatsapp/whatsapp_capture_context1_frame169.cpp", >- "whatsapp/whatsapp_capture_context1_frame170.cpp", >- "whatsapp/whatsapp_capture_context1_frame171.cpp", >- "whatsapp/whatsapp_capture_context1_frame172.cpp", >- "whatsapp/whatsapp_capture_context1_frame173.cpp", >- "whatsapp/whatsapp_capture_context1_frame174.cpp", >- "whatsapp/whatsapp_capture_context1_frame175.cpp", >- "whatsapp/whatsapp_capture_context1_frame176.cpp", >- "whatsapp/whatsapp_capture_context1_frame177.cpp", >- "whatsapp/whatsapp_capture_context1_frame178.cpp", >- "whatsapp/whatsapp_capture_context1_frame179.cpp", >- "whatsapp/whatsapp_capture_context1_frame180.cpp", >- ], >- [ "whatsapp/whatsapp_capture_context1.angledata.gz" ], >- "whatsapp/whatsapp_capture_context1", >- ], >- [ >- "words_with_friends_2", >- 1, >- [ >- "words_with_friends_2/words_with_friends_2_capture_context1_frame001.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame002.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame003.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame004.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame005.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame006.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame007.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame008.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame009.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame010.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame011.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame012.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame013.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame014.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame015.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame016.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame017.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame018.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame019.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame020.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame021.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame022.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame023.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame024.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame025.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame026.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame027.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame028.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame029.cpp", >- "words_with_friends_2/words_with_friends_2_capture_context1_frame030.cpp", >- "words_with_friends_2/words_with_friends_2_capture_shared.cpp", >- ], >- [ "words_with_friends_2/words_with_friends_2.angledata.gz" ], >- "words_with_friends_2/words_with_friends_2_capture_context1", >- ], >- [ >- "wordscapes", >- 3, >- [ >- "wordscapes/wordscapes_capture_context3_frame001.cpp", >- "wordscapes/wordscapes_capture_context3_frame002.cpp", >- "wordscapes/wordscapes_capture_context3_frame003.cpp", >- "wordscapes/wordscapes_capture_context3_frame004.cpp", >- "wordscapes/wordscapes_capture_context3_frame005.cpp", >- "wordscapes/wordscapes_capture_context3_frame006.cpp", >- "wordscapes/wordscapes_capture_context3_frame007.cpp", >- "wordscapes/wordscapes_capture_context3_frame008.cpp", >- "wordscapes/wordscapes_capture_context3_frame009.cpp", >- "wordscapes/wordscapes_capture_context3_frame010.cpp", >- "wordscapes/wordscapes_capture_context3_frame011.cpp", >- "wordscapes/wordscapes_capture_context3_frame012.cpp", >- "wordscapes/wordscapes_capture_context3_frame013.cpp", >- "wordscapes/wordscapes_capture_context3_frame014.cpp", >- "wordscapes/wordscapes_capture_context3_frame015.cpp", >- "wordscapes/wordscapes_capture_context3_frame016.cpp", >- "wordscapes/wordscapes_capture_context3_frame017.cpp", >- "wordscapes/wordscapes_capture_context3_frame018.cpp", >- "wordscapes/wordscapes_capture_context3_frame019.cpp", >- "wordscapes/wordscapes_capture_context3_frame020.cpp", >- "wordscapes/wordscapes_capture_context3_frame021.cpp", >- "wordscapes/wordscapes_capture_context3_frame022.cpp", >- "wordscapes/wordscapes_capture_context3_frame023.cpp", >- "wordscapes/wordscapes_capture_context3_frame024.cpp", >- "wordscapes/wordscapes_capture_context3_frame025.cpp", >- "wordscapes/wordscapes_capture_context3_frame026.cpp", >- "wordscapes/wordscapes_capture_context3_frame027.cpp", >- "wordscapes/wordscapes_capture_context3_frame028.cpp", >- "wordscapes/wordscapes_capture_context3_frame029.cpp", >- "wordscapes/wordscapes_capture_context3_frame030.cpp", >- "wordscapes/wordscapes_capture_shared.cpp", >- ], >- [ "wordscapes/wordscapes.angledata.gz" ], >- "wordscapes/wordscapes_capture_context3", >- ], >- [ >- "world_cricket_championship_2", >- 1, >- [ >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame001.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame002.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame003.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame004.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame005.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame006.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame007.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame008.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame009.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame010.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame011.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame012.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame013.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame014.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame015.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame016.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame017.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame018.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame019.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame020.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame021.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame022.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame023.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame024.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame025.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame026.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame027.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame028.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame029.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_context1_frame030.cpp", >- "world_cricket_championship_2/world_cricket_championship_2_shared.cpp", >- ], >- [ >- "world_cricket_championship_2/world_cricket_championship_2.angledata.gz", >- "world_cricket_championship_2/world_cricket_championship_2.json", >- ], >- "world_cricket_championship_2/world_cricket_championship_2_context1", >- ], >- [ >- "world_of_kings", >- 3, >- [ >- "world_of_kings/world_of_kings_capture_context3_frame001.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame002.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame003.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame004.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame005.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame006.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame007.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame008.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame009.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame010.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame011.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame012.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame013.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame014.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame015.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame016.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame017.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame018.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame019.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame020.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame021.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame022.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame023.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame024.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame025.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame026.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame027.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame028.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame029.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame030.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame031.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame032.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame033.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame034.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame035.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame036.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame037.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame038.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame039.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame040.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame041.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame042.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame043.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame044.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame045.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame046.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame047.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame048.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame049.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame050.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame051.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame052.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame053.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame054.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame055.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame056.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame057.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame058.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame059.cpp", >- "world_of_kings/world_of_kings_capture_context3_frame060.cpp", >- "world_of_kings/world_of_kings_capture_shared.cpp", >- ], >- [ "world_of_kings/world_of_kings.angledata.gz" ], >- "world_of_kings/world_of_kings_capture_context3", >- ], >- [ >- "world_of_tanks_blitz", >- 1, >- [ >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame001.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame002.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame003.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame004.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame005.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame006.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame007.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame008.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame009.cpp", >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1_frame010.cpp", >- ], >- [ "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1.angledata.gz" ], >- "world_of_tanks_blitz/world_of_tanks_blitz_capture_context1", >- ], >- [ >- "world_war_doh", >- 1, >- [ >- "world_war_doh/world_war_doh_capture_context1_frame001.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame002.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame003.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame004.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame005.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame006.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame007.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame008.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame009.cpp", >- "world_war_doh/world_war_doh_capture_context1_frame010.cpp", >- ], >- [ "world_war_doh/world_war_doh_capture_context1.angledata.gz" ], >- "world_war_doh/world_war_doh_capture_context1", >- ], >- [ >- "worms_zone_io", >- 1, >- [ >- "worms_zone_io/worms_zone_io_capture_context1_frame001.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame002.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame003.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame004.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame005.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame006.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame007.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame008.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame009.cpp", >- "worms_zone_io/worms_zone_io_capture_context1_frame010.cpp", >- ], >- [ "worms_zone_io/worms_zone_io_capture_context1.angledata.gz" ], >- "worms_zone_io/worms_zone_io_capture_context1", >- ], >- [ >- "zillow", >- 1, >- [ >- "zillow/zillow_context1_frame001.cpp", >- "zillow/zillow_context1_frame002.cpp", >- "zillow/zillow_context1_frame003.cpp", >- "zillow/zillow_context1_frame004.cpp", >- "zillow/zillow_context1_frame005.cpp", >- "zillow/zillow_context1_frame006.cpp", >- "zillow/zillow_context1_frame007.cpp", >- "zillow/zillow_context1_frame008.cpp", >- "zillow/zillow_context1_frame009.cpp", >- "zillow/zillow_context1_frame010.cpp", >- "zillow/zillow_context1_frame011.cpp", >- "zillow/zillow_context1_frame012.cpp", >- "zillow/zillow_context1_frame013.cpp", >- "zillow/zillow_context1_frame014.cpp", >- "zillow/zillow_context1_frame015.cpp", >- "zillow/zillow_context1_frame016.cpp", >- "zillow/zillow_context1_frame017.cpp", >- "zillow/zillow_context1_frame018.cpp", >- "zillow/zillow_context1_frame019.cpp", >- "zillow/zillow_context1_frame020.cpp", >- "zillow/zillow_context1_frame021.cpp", >- "zillow/zillow_context1_frame022.cpp", >- "zillow/zillow_context1_frame023.cpp", >- "zillow/zillow_context1_frame024.cpp", >- "zillow/zillow_context1_frame025.cpp", >- "zillow/zillow_context1_frame026.cpp", >- "zillow/zillow_context1_frame027.cpp", >- "zillow/zillow_context1_frame028.cpp", >- "zillow/zillow_context1_frame029.cpp", >- "zillow/zillow_context1_frame030.cpp", >- "zillow/zillow_context1_frame031.cpp", >- "zillow/zillow_context1_frame032.cpp", >- "zillow/zillow_context1_frame033.cpp", >- "zillow/zillow_context1_frame034.cpp", >- "zillow/zillow_context1_frame035.cpp", >- "zillow/zillow_context1_frame036.cpp", >- "zillow/zillow_context1_frame037.cpp", >- "zillow/zillow_context1_frame038.cpp", >- "zillow/zillow_context1_frame039.cpp", >- "zillow/zillow_context1_frame040.cpp", >- "zillow/zillow_context1_frame041.cpp", >- "zillow/zillow_context1_frame042.cpp", >- "zillow/zillow_context1_frame043.cpp", >- "zillow/zillow_context1_frame044.cpp", >- "zillow/zillow_context1_frame045.cpp", >- "zillow/zillow_context1_frame046.cpp", >- "zillow/zillow_context1_frame047.cpp", >- "zillow/zillow_context1_frame048.cpp", >- "zillow/zillow_context1_frame049.cpp", >- "zillow/zillow_context1_frame050.cpp", >- "zillow/zillow_context1_frame051.cpp", >- "zillow/zillow_context1_frame052.cpp", >- "zillow/zillow_context1_frame053.cpp", >- "zillow/zillow_context1_frame054.cpp", >- "zillow/zillow_context1_frame055.cpp", >- "zillow/zillow_context1_frame056.cpp", >- "zillow/zillow_context1_frame057.cpp", >- "zillow/zillow_context1_frame058.cpp", >- "zillow/zillow_context1_frame059.cpp", >- "zillow/zillow_context1_frame060.cpp", >- "zillow/zillow_context1_frame061.cpp", >- "zillow/zillow_context1_frame062.cpp", >- "zillow/zillow_context1_frame063.cpp", >- "zillow/zillow_context1_frame064.cpp", >- "zillow/zillow_context1_frame065.cpp", >- "zillow/zillow_context1_frame066.cpp", >- "zillow/zillow_context1_frame067.cpp", >- "zillow/zillow_context1_frame068.cpp", >- "zillow/zillow_context1_frame069.cpp", >- "zillow/zillow_context1_frame070.cpp", >- "zillow/zillow_context1_frame071.cpp", >- "zillow/zillow_context1_frame072.cpp", >- "zillow/zillow_context1_frame073.cpp", >- "zillow/zillow_context1_frame074.cpp", >- "zillow/zillow_context1_frame075.cpp", >- "zillow/zillow_context1_frame076.cpp", >- "zillow/zillow_context1_frame077.cpp", >- "zillow/zillow_context1_frame078.cpp", >- "zillow/zillow_context1_frame079.cpp", >- "zillow/zillow_context1_frame080.cpp", >- "zillow/zillow_context1_frame081.cpp", >- "zillow/zillow_context1_frame082.cpp", >- "zillow/zillow_context1_frame083.cpp", >- "zillow/zillow_context1_frame084.cpp", >- "zillow/zillow_context1_frame085.cpp", >- "zillow/zillow_context1_frame086.cpp", >- "zillow/zillow_context1_frame087.cpp", >- "zillow/zillow_context1_frame088.cpp", >- "zillow/zillow_context1_frame089.cpp", >- "zillow/zillow_context1_frame090.cpp", >- "zillow/zillow_context1_frame091.cpp", >- "zillow/zillow_context1_frame092.cpp", >- "zillow/zillow_context1_frame093.cpp", >- "zillow/zillow_context1_frame094.cpp", >- "zillow/zillow_context1_frame095.cpp", >- "zillow/zillow_context1_frame096.cpp", >- "zillow/zillow_context1_frame097.cpp", >- "zillow/zillow_context1_frame098.cpp", >- "zillow/zillow_context1_frame099.cpp", >- "zillow/zillow_context1_frame100.cpp", >- "zillow/zillow_shared.cpp", >- ], >- [ >- "zillow/zillow.angledata.gz", >- "zillow/zillow.json", >- ], >- "zillow/zillow_context1", >- ], >-] >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.h b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.h >deleted file mode 100644 >index 90fc217d9c564c1dc9b5254fba42c66a8470587f..0000000000000000000000000000000000000000 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_autogen.h >+++ /dev/null >@@ -1,61 +0,0 @@ >-// GENERATED FILE - DO NOT EDIT. >-// Generated by gen_restricted_traces.py using data from restricted_traces.json >-// >-// Copyright 2020 The ANGLE Project Authors. All rights reserved. >-// Use of this source code is governed by a BSD-style license that can be >-// found in the LICENSE file. >-// >-// restricted_traces_autogen: Types and enumerations for trace tests. >- >-#ifndef ANGLE_RESTRICTED_TRACES_AUTOGEN_H_ >-#define ANGLE_RESTRICTED_TRACES_AUTOGEN_H_ >- >-#include <EGL/egl.h> >-#include <KHR/khrplatform.h> >-#include <cstdint> >-#include <vector> >- >-#include "restricted_traces_export.h" >- >-namespace trace_angle >-{ >-using GenericProc = void (*)(); >-using LoadProc = GenericProc(KHRONOS_APIENTRY *)(const char *); >-ANGLE_TRACE_LOADER_EXPORT void LoadEGL(LoadProc loadProc); >-ANGLE_TRACE_LOADER_EXPORT void LoadGLES(LoadProc loadProc); >- >-static constexpr size_t kTraceInfoMaxNameLen = 128; >- >-static constexpr uint32_t kDefaultReplayContextClientMajorVersion = 3; >-static constexpr uint32_t kDefaultReplayContextClientMinorVersion = 1; >-static constexpr uint32_t kDefaultReplayDrawSurfaceColorSpace = EGL_COLORSPACE_LINEAR; >- >-struct TraceInfo >-{ >- char name[kTraceInfoMaxNameLen]; >- uint32_t contextClientMajorVersion; >- uint32_t contextClientMinorVersion; >- uint32_t frameEnd; >- uint32_t frameStart; >- uint32_t drawSurfaceWidth; >- uint32_t drawSurfaceHeight; >- uint32_t drawSurfaceColorSpace; >- uint32_t displayPlatformType; >- uint32_t displayDeviceType; >- int configRedBits; >- int configBlueBits; >- int configGreenBits; >- int configAlphaBits; >- int configDepthBits; >- int configStencilBits; >- bool isBinaryDataCompressed; >- bool areClientArraysEnabled; >- bool isBindGeneratesResourcesEnabled; >- bool isWebGLCompatibilityEnabled; >- bool isRobustResourceInitEnabled; >-}; >- >-ANGLE_TRACE_EXPORT const TraceInfo &GetTraceInfo(const char *traceName); >-} // namespace trace_angle >- >-#endif // ANGLE_RESTRICTED_TRACES_AUTOGEN_H_ >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_export.h b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_export.h >index 7f47ac8159230b65c9d38a38935e9abd7c195842..d2703768308c019b2c29a107b13e3d8a921ff40d 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_export.h >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/restricted_traces_export.h >@@ -37,4 +37,12 @@ > # endif > #endif // !defined(ANGLE_TRACE_LOADER_EXPORT) > >+namespace trace_angle >+{ >+using GenericProc = void (*)(); >+using LoadProc = GenericProc(KHRONOS_APIENTRY *)(const char *); >+ANGLE_TRACE_LOADER_EXPORT void LoadEGL(LoadProc loadProc); >+ANGLE_TRACE_LOADER_EXPORT void LoadGLES(LoadProc loadProc); >+} // namespace trace_angle >+ > #endif // ANGLE_RESTRICTED_TRACES_EXPORT_H_ >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/retrace_restricted_traces.py b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/retrace_restricted_traces.py >index 5f0800d795289688be9a6ca4d1db736473bc7dcb..b4e2680d08e3daebf6caecee2634fe2611ad4653 100755 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/retrace_restricted_traces.py >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/retrace_restricted_traces.py >@@ -20,29 +20,36 @@ import stat > import subprocess > import sys > >-from gen_restricted_traces import get_context as get_context >+from gen_restricted_traces import read_json as read_json > > DEFAULT_TEST_SUITE = 'angle_perftests' > DEFAULT_TEST_JSON = 'restricted_traces.json' > DEFAULT_LOG_LEVEL = 'info' > DEFAULT_BACKUP_FOLDER = 'retrace-backups' > >-# We preserve select metadata in the trace header that can't be re-captured properly. >-# Currently this is just the set of default framebuffer surface config bits. >-METADATA_KEYWORDS = ['kDefaultFramebuffer'] >- > EXIT_SUCCESS = 0 > EXIT_FAILURE = 1 > > >+def load_trace_json(trace): >+ json_file_name = os.path.join(get_script_dir(), '%s', '%s.json') % (trace, trace) >+ return read_json(json_file_name) >+ >+ >+def get_context(trace, trace_path): >+ """Returns the trace context number.""" >+ json_data = load_trace_json(trace) >+ return str(json_data['WindowSurfaceContextID']) >+ >+ > def get_script_dir(): > return os.path.dirname(sys.argv[0]) > > >-# TODO(jmadill): Remove after retrace. http://anglebug.com/5133 >-def json_metadata_exists(trace): >- json_file_name = os.path.join(get_script_dir(), '%s/%s.json') % (trace, trace) >- return os.path.isfile(json_file_name) >+def context_header(trace, trace_path): >+ context_id = get_context(trace, trace_path) >+ header = '%s_context%s.h' % (trace, context_id) >+ return os.path.join(trace_path, header) > > > def load_json_metadata(trace): >@@ -55,41 +62,6 @@ def src_trace_path(trace): > return os.path.join(get_script_dir(), trace) > > >-def context_header(trace, trace_path): >- context_id = get_context(trace_path) >- # TODO(jmadill): Remove after retrace. http://anglebug.com/5133 >- for try_path_expr in ['%s_capture_context%s.h', '%s_context%s.h']: >- header = try_path_expr % (trace, context_id) >- try_path = os.path.join(trace_path, header) >- if os.path.isfile(try_path): >- return try_path >- logging.fatal('Could not find context header for %s' % trace) >- return None >- >- >-def get_num_frames(trace): >- if json_metadata_exists(trace): >- json_metadata = load_json_metadata(trace) >- if 'FrameEnd' in json_metadata: >- return int(json_metadata['FrameEnd']) >- >- trace_path = src_trace_path(trace) >- >- lo = 99999999 >- hi = 0 >- >- for file in os.listdir(trace_path): >- match = re.match(r'.+_context\d_frame(\d+)\.cpp', file) >- if match: >- frame = int(match.group(1)) >- if frame < lo: >- lo = frame >- if frame > hi: >- hi = frame >- >- return hi - lo + 1 >- >- > def get_trace_metadata(trace): > trace_path = src_trace_path(trace) > header_file = context_header(trace, trace_path) >@@ -124,6 +96,11 @@ def replace_metadata(header_file, metadata): > f.writelines(lines) > > >+def get_num_frames(json_data): >+ metadata = json_data['TraceMetadata'] >+ return metadata['FrameEnd'] - metadata['FrameStart'] + 1 >+ >+ > def path_contains_header(path): > for file in os.listdir(path): > if fnmatch.fnmatch(file, '*.h'): >@@ -157,14 +134,6 @@ def backup_traces(args, traces): > copy_trace_folder(trace_path, trace_backup_path) > > >-# TODO(jmadill): Remove this once migrated. http://anglebug.com/5133 >-def run_code_generation(): >- python_binary = 'py.exe' if os.name == 'nt' else 'python3' >- angle_dir = os.path.join(get_script_dir(), '..', '..', '..') >- gen_path = os.path.join(angle_dir, 'scripts', 'run_code_generation.py') >- subprocess.check_call([python_binary, gen_path]) >- >- > def restore_traces(args, traces): > for trace in fnmatch.filter(traces, args.traces): > trace_path = src_trace_path(trace) >@@ -173,13 +142,6 @@ def restore_traces(args, traces): > logging.error('Trace folder not found at %s' % trace_backup_path) > else: > copy_trace_folder(trace_backup_path, trace_path) >- # TODO(jmadill): Remove this once migrated. http://anglebug.com/5133 >- angle_dir = os.path.join(get_script_dir(), '..', '..', '..') >- json_path = os.path.join(angle_dir, 'scripts', 'code_generation_hashes', >- 'restricted_traces.json') >- if os.path.exists(json_path): >- os.unlink(json_path) >- run_code_generation() > > > def run_autoninja(args): >@@ -232,16 +194,12 @@ def upgrade_traces(args, traces): > logging.info('Skipping "%s" because the out folder already exists' % trace) > continue > >- num_frames = get_num_frames(trace) >- metadata = get_trace_metadata(trace) >+ json_data = load_trace_json(trace) >+ num_frames = get_num_frames(json_data) > >+ metadata = json_data['TraceMetadata'] > logging.debug('Read metadata: %s' % str(metadata)) > >- if json_metadata_exists(trace): >- json_metadata = load_json_metadata(trace) >- else: >- json_metadata = {} >- > max_steps = min(args.limit, num_frames) if args.limit else num_frames > > # We start tracing from frame 2. --retrace-mode issues a Swap() after Setup() so we can >@@ -276,8 +234,6 @@ def upgrade_traces(args, traces): > logging.error('There was a problem tracing "%s", could not find header file: %s' % > (trace, header_file)) > failures += [trace] >- else: >- replace_metadata(header_file, metadata) > except: > logging.exception('There was an exception running "%s":' % trace) > failures += [trace] >@@ -302,7 +258,8 @@ def validate_traces(args, traces): > failures = [] > > for trace in fnmatch.filter(traces, args.traces): >- num_frames = get_num_frames(trace) >+ json_data = load_trace_json(trace) >+ num_frames = get_num_frames(json_data) > max_steps = min(args.limit, num_frames) if args.limit else num_frames > try: > run_test_suite(args, trace, max_steps, additional_args, additional_env) >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py >old mode 100644 >new mode 100755 >index c62388bd7af6f9a2786af9d883d339d743a07e78..d714b146aeddfd4764a9ed89b45b64038745810d >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/sync_restricted_traces_to_cipd.py >@@ -90,10 +90,11 @@ def main(args): > retval = pool.map_async(sync_trace, zipped_args).get(LONG_TIMEOUT) > except KeyboardInterrupt: > pool.terminate() >+ pool.join() > except Exception as e: > print('got exception: %r, terminating the pool' % (e,)) > pool.terminate() >- pool.join() >+ pool.join() > else: > retval = map(sync_trace, zipped_args) > >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.cpp b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.cpp >index f8ff8e8ccde797465ed06f9558f81eb9e745b21c..3a69d9364f4328c038ad7ba26f2cdc30e94c6466 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.cpp >@@ -75,6 +75,7 @@ ANGLE_TRACE_LOADER_EXPORT PFNEGLQUERYSTRINGIANGLEPROC t_eglQueryStringiANGLE; > ANGLE_TRACE_LOADER_EXPORT PFNEGLHANDLEGPUSWITCHANGLEPROC t_eglHandleGPUSwitchANGLE; > ANGLE_TRACE_LOADER_EXPORT PFNEGLREACQUIREHIGHPOWERGPUANGLEPROC t_eglReacquireHighPowerGPUANGLE; > ANGLE_TRACE_LOADER_EXPORT PFNEGLRELEASEHIGHPOWERGPUANGLEPROC t_eglReleaseHighPowerGPUANGLE; >+ANGLE_TRACE_LOADER_EXPORT PFNEGLPREPARESWAPBUFFERSANGLEPROC t_eglPrepareSwapBuffersANGLE; > ANGLE_TRACE_LOADER_EXPORT PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC t_eglProgramCacheGetAttribANGLE; > ANGLE_TRACE_LOADER_EXPORT PFNEGLPROGRAMCACHEPOPULATEANGLEPROC t_eglProgramCachePopulateANGLE; > ANGLE_TRACE_LOADER_EXPORT PFNEGLPROGRAMCACHEQUERYANGLEPROC t_eglProgramCacheQueryANGLE; >@@ -221,6 +222,8 @@ void LoadEGL(LoadProc loadProc) > loadProc("eglReacquireHighPowerGPUANGLE")); > t_eglReleaseHighPowerGPUANGLE = reinterpret_cast<PFNEGLRELEASEHIGHPOWERGPUANGLEPROC>( > loadProc("eglReleaseHighPowerGPUANGLE")); >+ t_eglPrepareSwapBuffersANGLE = >+ reinterpret_cast<PFNEGLPREPARESWAPBUFFERSANGLEPROC>(loadProc("eglPrepareSwapBuffersANGLE")); > t_eglProgramCacheGetAttribANGLE = reinterpret_cast<PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC>( > loadProc("eglProgramCacheGetAttribANGLE")); > t_eglProgramCachePopulateANGLE = reinterpret_cast<PFNEGLPROGRAMCACHEPOPULATEANGLEPROC>( >diff --git a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.h b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.h >index 88ff4c4e5dbdf0bec38584426f819db19733b726..3b3f92acc4690bc080478f78b38dfc3c66d56ada 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.h >+++ b/Source/ThirdParty/ANGLE/src/tests/restricted_traces/trace_egl_loader_autogen.h >@@ -77,6 +77,7 @@ > #define eglHandleGPUSwitchANGLE t_eglHandleGPUSwitchANGLE > #define eglReacquireHighPowerGPUANGLE t_eglReacquireHighPowerGPUANGLE > #define eglReleaseHighPowerGPUANGLE t_eglReleaseHighPowerGPUANGLE >+#define eglPrepareSwapBuffersANGLE t_eglPrepareSwapBuffersANGLE > #define eglProgramCacheGetAttribANGLE t_eglProgramCacheGetAttribANGLE > #define eglProgramCachePopulateANGLE t_eglProgramCachePopulateANGLE > #define eglProgramCacheQueryANGLE t_eglProgramCacheQueryANGLE >@@ -189,6 +190,7 @@ ANGLE_TRACE_LOADER_EXPORT extern PFNEGLHANDLEGPUSWITCHANGLEPROC t_eglHandleGPUSw > ANGLE_TRACE_LOADER_EXPORT extern PFNEGLREACQUIREHIGHPOWERGPUANGLEPROC > t_eglReacquireHighPowerGPUANGLE; > ANGLE_TRACE_LOADER_EXPORT extern PFNEGLRELEASEHIGHPOWERGPUANGLEPROC t_eglReleaseHighPowerGPUANGLE; >+ANGLE_TRACE_LOADER_EXPORT extern PFNEGLPREPARESWAPBUFFERSANGLEPROC t_eglPrepareSwapBuffersANGLE; > ANGLE_TRACE_LOADER_EXPORT extern PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC > t_eglProgramCacheGetAttribANGLE; > ANGLE_TRACE_LOADER_EXPORT extern PFNEGLPROGRAMCACHEPOPULATEANGLEPROC t_eglProgramCachePopulateANGLE; >diff --git a/Source/ThirdParty/ANGLE/src/tests/run_perf_tests.py b/Source/ThirdParty/ANGLE/src/tests/run_perf_tests.py >index cb0aacea2937ccbdd263d487c16bed067ad847b4..415d74208672403fa937c9b111359f14298592ad 100755 >--- a/Source/ThirdParty/ANGLE/src/tests/run_perf_tests.py >+++ b/Source/ThirdParty/ANGLE/src/tests/run_perf_tests.py >@@ -77,13 +77,18 @@ def _popen(*args, **kwargs): > > def run_command_with_output(argv, stdoutfile, env=None, cwd=None, log=True): > assert stdoutfile >- with io.open(stdoutfile, 'wb') as writer: >+ with io.open(stdoutfile, 'wb') as writer, \ >+ io.open(stdoutfile, 'rb', 1) as reader: > process = _popen(argv, env=env, cwd=cwd, stdout=writer, stderr=subprocess.STDOUT) > test_env.forward_signals([process]) > while process.poll() is None: >+ if log: >+ sys.stdout.write(reader.read().decode('utf-8')) > # This sleep is needed for signal propagation. See the > # wait_with_signals() docstring. > time.sleep(0.1) >+ if log: >+ sys.stdout.write(reader.read().decode('utf-8')) > return process.returncode > > >@@ -94,7 +99,7 @@ def _run_and_get_output(args, cmd, env): > if args.xvfb: > exit_code = xvfb.run_executable(cmd, env, stdoutfile=tempfile_path) > else: >- exit_code = run_command_with_output(cmd, env=env, stdoutfile=tempfile_path, log=False) >+ exit_code = run_command_with_output(cmd, env=env, stdoutfile=tempfile_path, log=True) > with open(tempfile_path) as f: > for line in f: > lines.append(line.strip()) >diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp >index 229663b3a35907b8b658dd8614a1bbf7fc0c367e..afb255c4dd2e480efacbee1f4f05abc8e395a6a9 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.cpp >@@ -439,6 +439,11 @@ inline bool IsPixel4XL() > return IsAndroidDevice("Pixel 4 XL"); > } > >+inline bool IsPixel6() >+{ >+ return IsAndroidDevice("Pixel 6"); >+} >+ > // Check whether the active GPU is a specific device based on the string device ID. > inline bool IsDeviceIdGPU(const std::string &gpuDeviceId) > { >@@ -554,6 +559,7 @@ GPUTestConfig::GPUTestConfig(bool isSwiftShader) > mConditions[kConditionNexus5X] = !isSwiftShader && IsNexus5X(); > mConditions[kConditionPixel2OrXL] = !isSwiftShader && (IsPixel2() || IsPixel2XL()); > mConditions[kConditionPixel4OrXL] = !isSwiftShader && (IsPixel4() || IsPixel4XL()); >+ mConditions[kConditionPixel6] = !isSwiftShader && (IsPixel6()); > mConditions[kConditionNVIDIAQuadroP400] = !isSwiftShader && IsNVIDIAQuadroP400(); > mConditions[kConditionNVIDIAGTX1660] = !isSwiftShader && IsNVIDIAGTX1660(); > >diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h >index 6f3b944bbdf0b09d6b64802b3c40f96dc04fa24b..e408d67f437d3217c16df44009a2ea8e6d294bd1 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h >+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestConfig.h >@@ -66,6 +66,7 @@ struct GPUTestConfig > kConditionNexus5X, > kConditionPixel2OrXL, > kConditionPixel4OrXL, >+ kConditionPixel6, > kConditionNVIDIAQuadroP400, > kConditionNVIDIAGTX1660, > kConditionSwiftShader, >diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp >index 186004ff55d4505ab1536eb462156337151584f4..4c91384977e93215d8876ea79d14aef8872c5367 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser.cpp >@@ -76,6 +76,7 @@ enum Token > kConfigNexus5X, > kConfigPixel2, > kConfigPixel4, >+ kConfigPixel6, > // GPU devices > kConfigNVIDIAQuadroP400, > kConfigNVIDIAGTX1660, >@@ -182,6 +183,7 @@ constexpr TokenInfo kTokenData[kNumberOfTokens] = { > {"nexus5x", GPUTestConfig::kConditionNexus5X}, > {"pixel2orxl", GPUTestConfig::kConditionPixel2OrXL}, > {"pixel4orxl", GPUTestConfig::kConditionPixel4OrXL}, >+ {"pixel6", GPUTestConfig::kConditionPixel6}, > {"quadrop400", GPUTestConfig::kConditionNVIDIAQuadroP400}, > {"gtx1660", GPUTestConfig::kConditionNVIDIAGTX1660}, > {"prerotation", GPUTestConfig::kConditionPreRotation}, >@@ -385,14 +387,10 @@ bool GPUTestExpectationsParser::loadAllTestExpectationsFromFile(const std::strin > int32_t GPUTestExpectationsParser::getTestExpectationImpl(const GPUTestConfig *config, > const std::string &testName) > { >- size_t maxExpectationLen = 0; >- GPUTestExpectationEntry *foundEntry = nullptr; > for (GPUTestExpectationEntry &entry : mEntries) > { > if (NamesMatchWithWildcard(entry.testName.c_str(), testName.c_str())) > { >- size_t expectationLen = entry.testName.length(); >- > // Filter by condition first. > bool satisfiesConditions = true; > if (config) >@@ -407,19 +405,14 @@ int32_t GPUTestExpectationsParser::getTestExpectationImpl(const GPUTestConfig *c > } > } > >- // The longest/most specific matching expectation overrides any others. >- if (satisfiesConditions && expectationLen > maxExpectationLen) >+ // Use the first matching expectation in the file as the matching expression. >+ if (satisfiesConditions) > { >- maxExpectationLen = expectationLen; >- foundEntry = &entry; >+ entry.used = true; >+ return entry.testExpectation; > } > } > } >- if (foundEntry != nullptr) >- { >- foundEntry->used = true; >- return foundEntry->testExpectation; >- } > return kGpuTestPass; > } > >@@ -510,6 +503,7 @@ bool GPUTestExpectationsParser::parseLine(const GPUTestConfig *config, > case kConfigNexus5X: > case kConfigPixel2: > case kConfigPixel4: >+ case kConfigPixel6: > case kConfigNVIDIAQuadroP400: > case kConfigNVIDIAGTX1660: > case kConfigPreRotation: >diff --git a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp >index ffa3aaed1113e1357c135ab6986ae3df5500c91c..15e0dcadf4528ddd2e3da6e736f0e2c10fd12517 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/test_expectations/GPUTestExpectationsParser_unittest.cpp >@@ -362,7 +362,6 @@ TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserMisspelledExpecta > } > } > >-// Wild characters that match groups of expectations can be overridden with more specific lines. > // The parse should still compute correctly which lines were used and which were unused. > TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserOverrideExpectation) > { >@@ -370,20 +369,17 @@ TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserOverrideExpectati > std::string line = R"(100 : dEQP-GLES31.functional.layout_binding.* = FAIL > 100 : dEQP-GLES31.functional.layout_binding.ubo.* = SKIP)"; > EXPECT_TRUE(load(line)); >- EXPECT_TRUE(parser.getErrorMessages().empty()); > // Default behavior is to let missing tests pass > EXPECT_EQ(get("dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_max"), >- GPUTestExpectationsParser::kGpuTestSkip); >+ GPUTestExpectationsParser::kGpuTestFail); > // The FAIL expectation was unused because it was overridden. >- EXPECT_EQ(parser.getUnusedExpectationsMessages().size(), 1u); >- if (parser.getUnusedExpectationsMessages().size() >= 1) >- { >- EXPECT_EQ(parser.getUnusedExpectationsMessages()[0], "Line 1: expectation was unused."); >- } >+ ASSERT_EQ(parser.getUnusedExpectationsMessages().size(), 1u); >+ EXPECT_EQ(parser.getUnusedExpectationsMessages()[0], "Line 2: expectation was unused."); > // Now try a test that doesn't match the override criteria > EXPECT_EQ(get("dEQP-GLES31.functional.layout_binding.image.test"), > GPUTestExpectationsParser::kGpuTestFail); >- EXPECT_TRUE(parser.getUnusedExpectationsMessages().empty()); >+ ASSERT_EQ(parser.getUnusedExpectationsMessages().size(), 1u); >+ EXPECT_EQ(parser.getUnusedExpectationsMessages()[0], "Line 2: expectation was unused."); > } > > // This test is the same as GPUTestExpectationsParserOverrideExpectation, but verifying the order >@@ -394,7 +390,6 @@ TEST_P(GPUTestExpectationsParserTest, GPUTestExpectationsParserOverrideExpectati > std::string line = R"(100 : dEQP-GLES31.functional.layout_binding.ubo.* = SKIP > 100 : dEQP-GLES31.functional.layout_binding.* = FAIL)"; > EXPECT_TRUE(load(line)); >- EXPECT_TRUE(parser.getErrorMessages().empty()); > // Default behavior is to let missing tests pass > EXPECT_EQ(get("dEQP-GLES31.functional.layout_binding.ubo.vertex_binding_max"), > GPUTestExpectationsParser::kGpuTestSkip); >diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp b/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp >index f61405c8896e9a8e8a7b2865265faf199b159f2a..8fd8fa72d6cc1033027293b7281e452187eab9e7 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/ANGLETest.cpp >@@ -1053,7 +1053,7 @@ void ANGLETestBase::drawIndexedQuad(GLuint program, > GLfloat positionAttribZ, > GLfloat positionAttribXYScale) > { >- ASSERT(!mFixture->configParams.webGLCompatibility.valid() || >+ ASSERT(!mFixture || !mFixture->configParams.webGLCompatibility.valid() || > !mFixture->configParams.webGLCompatibility.value()); > drawIndexedQuad(program, positionAttribName, positionAttribZ, positionAttribXYScale, false); > } >diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h >index 9437d17ff66c943f946725e6017d9c53e078be23..abf8f5aa9e54b52adca0a62566947600e41708ed 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h >+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/angle_test_instantiate.h >@@ -256,6 +256,14 @@ struct CombinedPrintToStringParamName > testing::Combine(ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ > combine1, combine2, combine3, combine4, combine5), \ > print) >+#define ANGLE_INSTANTIATE_TEST_COMBINE_6(testName, print, combine1, combine2, combine3, combine4, \ >+ combine5, combine6, first, ...) \ >+ const decltype(first) testName##params[] = {first, ##__VA_ARGS__}; \ >+ INSTANTIATE_TEST_SUITE_P( \ >+ , testName, \ >+ testing::Combine(ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), combine1, combine2, combine3, \ >+ combine4, combine5, combine6), \ >+ print) > > // Checks if a config is expected to be supported by checking a system-based allow list. > bool IsConfigAllowlisted(const SystemInfo &systemInfo, const PlatformParameters ¶m); >diff --git a/Source/ThirdParty/ANGLE/src/tests/test_utils/runner/TestSuite.cpp b/Source/ThirdParty/ANGLE/src/tests/test_utils/runner/TestSuite.cpp >index 022c6dbc3fc67010342cb82854db85ac541f151b..f183e7db2e628cdaf6411634bf62311d22dabcbc 100644 >--- a/Source/ThirdParty/ANGLE/src/tests/test_utils/runner/TestSuite.cpp >+++ b/Source/ThirdParty/ANGLE/src/tests/test_utils/runner/TestSuite.cpp >@@ -964,6 +964,17 @@ void GTestListTests(const std::map<TestIdentifier, TestResult> &resultsMap) > } > } > } >+ >+// On Android, batching is done on the host, i.e. externally. >+// TestSuite executes on the device and should just passthrough all args to GTest. >+bool UsesExternalBatching() >+{ >+#if defined(ANGLE_PLATFORM_ANDROID) >+ return true; >+#else >+ return false; >+#endif >+} > } // namespace > > // static >@@ -1095,6 +1106,12 @@ TestSuite::TestSuite(int *argc, char **argv) > ++argIndex; > } > >+ if (UsesExternalBatching() && mBotMode) >+ { >+ printf("Bot mode is mutually exclusive with external batching.\n"); >+ exit(EXIT_FAILURE); >+ } >+ > mTestResults.currentTestTimeout = mTestTimeout; > > #if defined(ANGLE_PLATFORM_ANDROID) >@@ -1242,38 +1259,26 @@ TestSuite::TestSuite(int *argc, char **argv) > // If there's only one shard, we can use the testSet as defined above. > if (mShardCount > 1) > { >- testSet = GetShardTests(testSet, mShardIndex, mShardCount, &mTestFileLines, >- alsoRunDisabledTests); >- >- if (!mBotMode) >+ if (!mBotMode && !UsesExternalBatching()) > { >- mFilterString = GetTestFilter(testSet); >- >- if (filterArgIndex.valid()) >- { >- argv[filterArgIndex.value()] = const_cast<char *>(mFilterString.c_str()); >- } >- else >- { >- // Note that we only add a filter string if we previously deleted a shard >- // index/count argument. So we will have space for the new filter string in >- // argv. >- AddArg(argc, argv, mFilterString.c_str()); >- } >- >- // Force-re-initialize GoogleTest flags to load the shard filter. >- testing::internal::ParseGoogleTestFlagsOnly(argc, argv); >+ printf("Sharding is only supported in bot mode or external batching.\n"); >+ exit(EXIT_FAILURE); >+ } >+ // With external batching, we must use exactly the testSet as defined externally. >+ // But when listing tests, we do need to apply sharding ourselves, >+ // since we use our own implementation for listing tests and not GTest directly. >+ if (!UsesExternalBatching() || mGTestListTests || mListTests) >+ { >+ testSet = GetShardTests(testSet, mShardIndex, mShardCount, &mTestFileLines, >+ alsoRunDisabledTests); > } > } > } > >+ if (!testSet.empty()) > { > std::stringstream fakeTestName; >- fakeTestName << kArtifactsFakeTestName; >- if (mShardIndex != -1) >- { >- fakeTestName << "-Shard" << std::setfill('0') << std::setw(2) << mShardIndex; >- } >+ fakeTestName << kArtifactsFakeTestName << '-' << testSet[0].testName; > mTestResults.testArtifactsFakeTestName = fakeTestName.str(); > } > >diff --git a/Source/ThirdParty/ANGLE/util/capture/frame_capture_test_utils.cpp b/Source/ThirdParty/ANGLE/util/capture/frame_capture_test_utils.cpp >index f213132d3adba628519509ecf86512fc05745aa7..399cc68f43dd7794ae2331c0806be1d06fff71e7 100644 >--- a/Source/ThirdParty/ANGLE/util/capture/frame_capture_test_utils.cpp >+++ b/Source/ThirdParty/ANGLE/util/capture/frame_capture_test_utils.cpp >@@ -93,22 +93,11 @@ bool LoadTraceInfoFromJSON(const std::string &traceName, > traceInfoOut->drawSurfaceHeight = meta["DrawSurfaceHeight"].GetInt(); > traceInfoOut->drawSurfaceWidth = meta["DrawSurfaceWidth"].GetInt(); > >- // TODO(http://anglebug.com/5133): Drop the GetInt versions after trace update >- if (meta["DrawSurfaceColorSpace"].IsString()) >- { >- angle::HexStringToUInt(meta["DrawSurfaceColorSpace"].GetString(), >- &traceInfoOut->drawSurfaceColorSpace); >- angle::HexStringToUInt(meta["DisplayPlatformType"].GetString(), >- &traceInfoOut->displayPlatformType); >- angle::HexStringToUInt(meta["DisplayDeviceType"].GetString(), >- &traceInfoOut->displayDeviceType); >- } >- else >- { >- traceInfoOut->drawSurfaceColorSpace = meta["DrawSurfaceColorSpace"].GetInt(); >- traceInfoOut->displayPlatformType = meta["DisplayPlatformType"].GetInt(); >- traceInfoOut->displayDeviceType = meta["DisplayDeviceType"].GetInt(); >- } >+ angle::HexStringToUInt(meta["DrawSurfaceColorSpace"].GetString(), >+ &traceInfoOut->drawSurfaceColorSpace); >+ angle::HexStringToUInt(meta["DisplayPlatformType"].GetString(), >+ &traceInfoOut->displayPlatformType); >+ angle::HexStringToUInt(meta["DisplayDeviceType"].GetString(), &traceInfoOut->displayDeviceType); > > traceInfoOut->configRedBits = meta["ConfigRedBits"].GetInt(); > traceInfoOut->configGreenBits = meta["ConfigGreenBits"].GetInt(); >diff --git a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp >index ad5d4f29f0c916f0c2a3145d1103937bdb5f294a..3c7dd99fc393a8b1dc44585115689f8786b1a7c0 100644 >--- a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp >+++ b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.cpp >@@ -73,6 +73,7 @@ ANGLE_UTIL_EXPORT PFNEGLQUERYSTRINGIANGLEPROC l_eglQueryStringiANGLE; > ANGLE_UTIL_EXPORT PFNEGLHANDLEGPUSWITCHANGLEPROC l_eglHandleGPUSwitchANGLE; > ANGLE_UTIL_EXPORT PFNEGLREACQUIREHIGHPOWERGPUANGLEPROC l_eglReacquireHighPowerGPUANGLE; > ANGLE_UTIL_EXPORT PFNEGLRELEASEHIGHPOWERGPUANGLEPROC l_eglReleaseHighPowerGPUANGLE; >+ANGLE_UTIL_EXPORT PFNEGLPREPARESWAPBUFFERSANGLEPROC l_eglPrepareSwapBuffersANGLE; > ANGLE_UTIL_EXPORT PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC l_eglProgramCacheGetAttribANGLE; > ANGLE_UTIL_EXPORT PFNEGLPROGRAMCACHEPOPULATEANGLEPROC l_eglProgramCachePopulateANGLE; > ANGLE_UTIL_EXPORT PFNEGLPROGRAMCACHEQUERYANGLEPROC l_eglProgramCacheQueryANGLE; >@@ -216,6 +217,8 @@ void LoadEGL(LoadProc loadProc) > loadProc("eglReacquireHighPowerGPUANGLE")); > l_eglReleaseHighPowerGPUANGLE = reinterpret_cast<PFNEGLRELEASEHIGHPOWERGPUANGLEPROC>( > loadProc("eglReleaseHighPowerGPUANGLE")); >+ l_eglPrepareSwapBuffersANGLE = >+ reinterpret_cast<PFNEGLPREPARESWAPBUFFERSANGLEPROC>(loadProc("eglPrepareSwapBuffersANGLE")); > l_eglProgramCacheGetAttribANGLE = reinterpret_cast<PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC>( > loadProc("eglProgramCacheGetAttribANGLE")); > l_eglProgramCachePopulateANGLE = reinterpret_cast<PFNEGLPROGRAMCACHEPOPULATEANGLEPROC>( >diff --git a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h >index 325100cffab62c96e3e10492161d847fe250729c..5b2ef0781ad9119211bf7e0f8c0aa262ee80608f 100644 >--- a/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h >+++ b/Source/ThirdParty/ANGLE/util/egl_loader_autogen.h >@@ -77,6 +77,7 @@ > #define eglHandleGPUSwitchANGLE l_eglHandleGPUSwitchANGLE > #define eglReacquireHighPowerGPUANGLE l_eglReacquireHighPowerGPUANGLE > #define eglReleaseHighPowerGPUANGLE l_eglReleaseHighPowerGPUANGLE >+#define eglPrepareSwapBuffersANGLE l_eglPrepareSwapBuffersANGLE > #define eglProgramCacheGetAttribANGLE l_eglProgramCacheGetAttribANGLE > #define eglProgramCachePopulateANGLE l_eglProgramCachePopulateANGLE > #define eglProgramCacheQueryANGLE l_eglProgramCacheQueryANGLE >@@ -183,6 +184,7 @@ ANGLE_UTIL_EXPORT extern PFNEGLQUERYSTRINGIANGLEPROC l_eglQueryStringiANGLE; > ANGLE_UTIL_EXPORT extern PFNEGLHANDLEGPUSWITCHANGLEPROC l_eglHandleGPUSwitchANGLE; > ANGLE_UTIL_EXPORT extern PFNEGLREACQUIREHIGHPOWERGPUANGLEPROC l_eglReacquireHighPowerGPUANGLE; > ANGLE_UTIL_EXPORT extern PFNEGLRELEASEHIGHPOWERGPUANGLEPROC l_eglReleaseHighPowerGPUANGLE; >+ANGLE_UTIL_EXPORT extern PFNEGLPREPARESWAPBUFFERSANGLEPROC l_eglPrepareSwapBuffersANGLE; > ANGLE_UTIL_EXPORT extern PFNEGLPROGRAMCACHEGETATTRIBANGLEPROC l_eglProgramCacheGetAttribANGLE; > ANGLE_UTIL_EXPORT extern PFNEGLPROGRAMCACHEPOPULATEANGLEPROC l_eglProgramCachePopulateANGLE; > ANGLE_UTIL_EXPORT extern PFNEGLPROGRAMCACHEQUERYANGLEPROC l_eglProgramCacheQueryANGLE;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 236427
:
451486
|
451719
|
451726
|
451732