summaryrefslogtreecommitdiff
path: root/chromium/third_party/angle
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-05-24 11:40:17 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-05-24 12:42:11 +0000
commit5d87695f37678f96492b258bbab36486c59866b4 (patch)
treebe9783bbaf04fb930c4d74ca9c00b5e7954c8bc6 /chromium/third_party/angle
parent6c11fb357ec39bf087b8b632e2b1e375aef1b38b (diff)
downloadqtwebengine-chromium-5d87695f37678f96492b258bbab36486c59866b4.tar.gz
BASELINE: Update Chromium to 75.0.3770.56
Change-Id: I86d2007fd27a45d5797eee06f4c9369b8b50ac4f Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/third_party/angle')
-rw-r--r--chromium/third_party/angle/.gn3
-rw-r--r--chromium/third_party/angle/AUTHORS1
-rw-r--r--chromium/third_party/angle/BUILD.gn34
-rw-r--r--chromium/third_party/angle/CONTRIBUTORS5
-rw-r--r--chromium/third_party/angle/DEPS108
-rw-r--r--chromium/third_party/angle/OWNERS2
-rw-r--r--chromium/third_party/angle/PRESUBMIT.py13
-rw-r--r--chromium/third_party/angle/build_overrides/build.gni27
-rw-r--r--chromium/third_party/angle/doc/CodingStandard.md21
-rw-r--r--chromium/third_party/angle/doc/ContributingCode.md21
-rw-r--r--chromium/third_party/angle/doc/DebuggingTips.md203
-rw-r--r--chromium/third_party/angle/extensions/ANGLE_multiview.txt541
-rw-r--r--chromium/third_party/angle/extensions/ANGLE_multiview_multisample.txt4
-rw-r--r--chromium/third_party/angle/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt10
-rw-r--r--chromium/third_party/angle/extensions/EGL_ANGLE_iosurface_client_buffer.txt10
-rw-r--r--chromium/third_party/angle/gni/angle.gni3
-rw-r--r--chromium/third_party/angle/include/GLES2/gl2ext_angle.h29
-rw-r--r--chromium/third_party/angle/include/GLES2/gl2ext_explicit_context_autogen.inc50
-rw-r--r--chromium/third_party/angle/include/GLSLANG/ShaderLang.h11
-rw-r--r--chromium/third_party/angle/include/platform/FeaturesVk.h12
-rw-r--r--chromium/third_party/angle/include/platform/WorkaroundsD3D.h9
-rw-r--r--chromium/third_party/angle/infra/ANGLEWrangling.md75
-rw-r--r--chromium/third_party/angle/infra/config/global/commit-queue.cfg8
-rw-r--r--chromium/third_party/angle/infra/config/global/cr-buildbucket.cfg10
-rw-r--r--chromium/third_party/angle/infra/config/global/luci-milo.cfg3
-rw-r--r--chromium/third_party/angle/samples/multiview/Multiview.cpp20
-rw-r--r--chromium/third_party/angle/samples/sample_util/SampleApplication.cpp23
-rw-r--r--chromium/third_party/angle/samples/shader_translator/shader_translator.cpp616
-rw-r--r--chromium/third_party/angle/scripts/entry_point_packed_gl_enums.json43
-rw-r--r--chromium/third_party/angle/scripts/file_exists.py18
-rwxr-xr-xchromium/third_party/angle/scripts/generate_deqp_stats.py167
-rwxr-xr-xchromium/third_party/angle/scripts/generate_entry_points.py440
-rwxr-xr-xchromium/third_party/angle/scripts/generate_loader.py44
-rw-r--r--chromium/third_party/angle/scripts/gl_angle_ext.xml37
-rw-r--r--chromium/third_party/angle/scripts/registry_xml.py8
-rwxr-xr-xchromium/third_party/angle/scripts/run_code_generation.py217
-rw-r--r--chromium/third_party/angle/scripts/run_code_generation_hashes.json332
-rw-r--r--chromium/third_party/angle/scripts/trigger.bat1
-rw-r--r--chromium/third_party/angle/scripts/trigger.py71
-rw-r--r--chromium/third_party/angle/src/common/PackedEnums.cpp2
-rw-r--r--chromium/third_party/angle/src/common/PackedGLEnums_autogen.cpp60
-rw-r--r--chromium/third_party/angle/src/common/PackedGLEnums_autogen.h27
-rw-r--r--chromium/third_party/angle/src/common/PoolAlloc.cpp80
-rw-r--r--chromium/third_party/angle/src/common/PoolAlloc.h34
-rw-r--r--chromium/third_party/angle/src/common/angleutils.h6
-rw-r--r--chromium/third_party/angle/src/common/bitset_utils.h10
-rw-r--r--chromium/third_party/angle/src/common/bitset_utils_unittest.cpp142
-rw-r--r--chromium/third_party/angle/src/common/debug.cpp34
-rw-r--r--chromium/third_party/angle/src/common/debug.h33
-rw-r--r--chromium/third_party/angle/src/common/gen_packed_gl_enums.py32
-rw-r--r--chromium/third_party/angle/src/common/gen_uniform_type_table.py47
-rw-r--r--chromium/third_party/angle/src/common/packed_gl_enums.json11
-rw-r--r--chromium/third_party/angle/src/common/uniform_type_info_autogen.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/preprocessor/DiagnosticsBase.h2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp36
-rw-r--r--chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.h3
-rw-r--r--chromium/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp3
-rw-r--r--chromium/third_party/angle/src/compiler/translator/CallDAG.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/CollectVariables.cpp4
-rw-r--r--chromium/third_party/angle/src/compiler/translator/Common.h9
-rw-r--r--chromium/third_party/angle/src/compiler/translator/Compiler.cpp12
-rw-r--r--chromium/third_party/angle/src/compiler/translator/DirectiveHandler.cpp3
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.h2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/InfoSink.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/InfoSink.h4
-rw-r--r--chromium/third_party/angle/src/compiler/translator/Initialize.cpp4
-rw-r--r--chromium/third_party/angle/src/compiler/translator/OutputHLSL.cpp48
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ParseContext.cpp66
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ParseContext.h2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp5
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ShaderLang.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp5
-rw-r--r--chromium/third_party/angle/src/compiler/translator/Symbol.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp8
-rw-r--r--chromium/third_party/angle/src/compiler/translator/TranslatorESSL.cpp4
-rw-r--r--chromium/third_party/angle/src/compiler/translator/TranslatorGLSL.cpp4
-rw-r--r--chromium/third_party/angle/src/compiler/translator/Types.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ValidateOutputs.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ValidateVaryingLocations.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/blocklayout.cpp5
-rw-r--r--chromium/third_party/angle/src/compiler/translator/builtin_symbols_hash_autogen.txt2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/builtin_variables.json6
-rw-r--r--chromium/third_party/angle/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/gen_builtin_symbols.py455
-rw-r--r--chromium/third_party/angle/src/compiler/translator/gen_emulated_builtin_function_tables.py54
-rw-r--r--chromium/third_party/angle/src/compiler/translator/glslang_lex.cpp2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/glslang_tab.cpp8
-rw-r--r--chromium/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp12
-rw-r--r--chromium/third_party/angle/src/gpu_info_util/SystemInfo.cpp131
-rw-r--r--chromium/third_party/angle/src/gpu_info_util/SystemInfo.h18
-rw-r--r--chromium/third_party/angle/src/gpu_info_util/SystemInfo_android.cpp26
-rw-r--r--chromium/third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp4
-rw-r--r--chromium/third_party/angle/src/image_util/loadimage.cpp88
-rw-r--r--chromium/third_party/angle/src/image_util/loadimage.h30
-rw-r--r--chromium/third_party/angle/src/libANGLE/Caps.cpp17
-rw-r--r--chromium/third_party/angle/src/libANGLE/Caps.h21
-rw-r--r--chromium/third_party/angle/src/libANGLE/Compiler.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/Config.cpp19
-rw-r--r--chromium/third_party/angle/src/libANGLE/Context.cpp389
-rw-r--r--chromium/third_party/angle/src/libANGLE/Context.h122
-rw-r--r--chromium/third_party/angle/src/libANGLE/Display.cpp49
-rw-r--r--chromium/third_party/angle/src/libANGLE/Display.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/EGLSync.cpp16
-rw-r--r--chromium/third_party/angle/src/libANGLE/EGLSync.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/ErrorStrings.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/Framebuffer.cpp296
-rw-r--r--chromium/third_party/angle/src/libANGLE/Framebuffer.h42
-rw-r--r--chromium/third_party/angle/src/libANGLE/FramebufferAttachment.cpp80
-rw-r--r--chromium/third_party/angle/src/libANGLE/FramebufferAttachment.h12
-rw-r--r--chromium/third_party/angle/src/libANGLE/Image.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/LoggingAnnotator.cpp1
-rw-r--r--chromium/third_party/angle/src/libANGLE/MemoryObject.cpp36
-rw-r--r--chromium/third_party/angle/src/libANGLE/MemoryObject.h45
-rw-r--r--chromium/third_party/angle/src/libANGLE/Program.cpp23
-rw-r--r--chromium/third_party/angle/src/libANGLE/Program.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/ResourceManager.cpp50
-rw-r--r--chromium/third_party/angle/src/libANGLE/ResourceManager.h19
-rw-r--r--chromium/third_party/angle/src/libANGLE/Sampler.cpp36
-rw-r--r--chromium/third_party/angle/src/libANGLE/Sampler.h24
-rw-r--r--chromium/third_party/angle/src/libANGLE/Shader.cpp115
-rw-r--r--chromium/third_party/angle/src/libANGLE/Shader.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/State.cpp24
-rw-r--r--chromium/third_party/angle/src/libANGLE/State.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/Surface.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/Texture.cpp55
-rw-r--r--chromium/third_party/angle/src/libANGLE/Texture.h24
-rw-r--r--chromium/third_party/angle/src/libANGLE/Thread.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/Thread.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/WorkerThread.cpp20
-rw-r--r--chromium/third_party/angle/src/libANGLE/WorkerThread.h25
-rw-r--r--chromium/third_party/angle/src/libANGLE/WorkerThread_unittest.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/angletypes.cpp10
-rw-r--r--chromium/third_party/angle/src/libANGLE/angletypes.h4
-rw-r--r--chromium/third_party/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/format_map_autogen.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/formatutils.cpp142
-rw-r--r--chromium/third_party/angle/src/libANGLE/gen_copy_conversion_table.py62
-rw-r--r--chromium/third_party/angle/src/libANGLE/gen_format_map.py121
-rw-r--r--chromium/third_party/angle/src/libANGLE/queryutils.cpp43
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.cpp1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/EGLSyncImpl.h14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/GLImplFactory.h4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/MemoryObjectImpl.h40
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.cpp94
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.h48
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/copyvertex.h36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/copyvertex.inc.h (renamed from chromium/third_party/angle/src/libANGLE/renderer/copyvertex.inc)247
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp124
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp256
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.h11
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp39
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp113
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp82
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp81
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp175
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp (renamed from chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp)0
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py59
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py123
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py58
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py49
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp30
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py96
-rwxr-xr-xchromium/third_party/angle/src/libANGLE/renderer/gen_load_functions_table.py42
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.cpp39
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h7
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp30
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h1297
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp24
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp52
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp40
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp342
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp185
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.h6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.mm63
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.cpp9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_enums.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_typedefs.h14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py485
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/gl_bindings_data.json17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.cpp12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.h8
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp33
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h1
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/load_functions_data.json364
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp1160
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp10
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h5
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.cpp15
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp43
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h30
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp28
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h3
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.cpp236
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.h126
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp94
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp6
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp626
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h49
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp29
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp130
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.h48
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp11
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/README.md230
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h17
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp32
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp275
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h54
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp1025
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h883
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.cpp16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.h9
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp351
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h42
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.cpp41
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.h14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp204
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h12
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.cpp154
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.h38
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp14
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp18
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterComparison.gifbin0 -> 5426 bytes
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterPixelExample.pngbin0 -> 8323 bytes
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/VulkanShaderTranslation.svg43
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_format_table.py207
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py418
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py81
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc48
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc4
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc35
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag36
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag.json24
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp218
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.h25
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_map.json38
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp956
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.cpp52
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.h34
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp273
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h115
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp46
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni23
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h26
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp43
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.h16
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_wrapper.h282
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationEGL.cpp8
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationES.cpp102
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationES.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationES2.cpp471
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationES2.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationES3.cpp111
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationES31.cpp56
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationES3_autogen.h10
-rw-r--r--chromium/third_party/angle/src/libANGLE/validationESEXT_autogen.h136
-rw-r--r--chromium/third_party/angle/src/libGLESv2.gni10
-rw-r--r--chromium/third_party/angle/src/libGLESv2/entry_points_egl.cpp28
-rw-r--r--chromium/third_party/angle/src/libGLESv2/entry_points_egl_ext.cpp16
-rw-r--r--chromium/third_party/angle/src/libGLESv2/entry_points_enum_autogen.h25
-rw-r--r--chromium/third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp10
-rw-r--r--chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp1172
-rw-r--r--chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.h239
-rw-r--r--chromium/third_party/angle/src/libGLESv2/gen_proc_table.py70
-rw-r--r--chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.cpp432
-rw-r--r--chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.def66
-rw-r--r--chromium/third_party/angle/src/libGLESv2/proc_table_autogen.cpp60
-rw-r--r--chromium/third_party/angle/src/libGLESv2/proc_table_data.json45
-rw-r--r--chromium/third_party/angle/src/tests/BUILD.gn83
-rw-r--r--chromium/third_party/angle/src/tests/angle_end2end_tests.gni10
-rw-r--r--chromium/third_party/angle/src/tests/angle_perftests.gni8
-rw-r--r--chromium/third_party/angle/src/tests/angle_unittests.gni3
-rw-r--r--chromium/third_party/angle/src/tests/deqp.gni12
-rw-r--r--chromium/third_party/angle/third_party/glmark2/BUILD.gn28
-rw-r--r--chromium/third_party/angle/third_party/vulkan-headers/BUILD.gn13
-rw-r--r--chromium/third_party/angle/third_party/vulkan-validation-layers/BUILD.gn7
-rw-r--r--chromium/third_party/angle/tools/empty1
-rw-r--r--chromium/third_party/angle/tools/glslang/README.md20
-rw-r--r--chromium/third_party/angle/tools/glslang/glslang_validator.exe.sha11
-rw-r--r--chromium/third_party/angle/tools/glslang/glslang_validator.sha11
-rwxr-xr-xchromium/third_party/angle/tools/glslang/update_glslang_binary.py118
-rw-r--r--chromium/third_party/angle/util/EGLWindow.cpp234
-rw-r--r--chromium/third_party/angle/util/EGLWindow.h159
-rw-r--r--chromium/third_party/angle/util/fuchsia/ScenicWindow.cpp13
-rw-r--r--chromium/third_party/angle/util/gles_loader_autogen.cpp177
-rw-r--r--chromium/third_party/angle/util/gles_loader_autogen.h65
-rw-r--r--chromium/third_party/angle/util/windows/WGLWindow.cpp11
-rw-r--r--chromium/third_party/angle/util/windows/WGLWindow.h4
-rw-r--r--chromium/third_party/angle/util/windows/win32/Win32Window.cpp2
426 files changed, 17793 insertions, 8408 deletions
diff --git a/chromium/third_party/angle/.gn b/chromium/third_party/angle/.gn
index db75197f7a8..dd2aacc7e05 100644
--- a/chromium/third_party/angle/.gn
+++ b/chromium/third_party/angle/.gn
@@ -7,8 +7,8 @@
# As a result this file will only affect stand-alone ANGLE builds,
# not chromium builds.
-import("//dotfile_settings.gni")
import("//build/dotfile_settings.gni")
+import("//dotfile_settings.gni")
# Location of the build configuration file.
buildconfig = "//build/config/BUILDCONFIG.gn"
@@ -34,6 +34,7 @@ exec_script_whitelist = angle_dotfile_settings.exec_script_whitelist +
"//build/config/win/BUILD.gn",
"//build/config/win/visual_studio_version.gni",
"//build/gn_helpers.py",
+ "//build_overrides/build.gni",
]
default_args = {
diff --git a/chromium/third_party/angle/AUTHORS b/chromium/third_party/angle/AUTHORS
index 38b6db424ad..082c6f4566e 100644
--- a/chromium/third_party/angle/AUTHORS
+++ b/chromium/third_party/angle/AUTHORS
@@ -29,6 +29,7 @@ The Qt Company Ltd.
Advanced Micro Devices, Inc.
LG Electronics, Inc.
IBM Inc.
+AdaptVis GmbH
Jacek Caban
Mark Callow
diff --git a/chromium/third_party/angle/BUILD.gn b/chromium/third_party/angle/BUILD.gn
index f992b570105..1b0cdd7a535 100644
--- a/chromium/third_party/angle/BUILD.gn
+++ b/chromium/third_party/angle/BUILD.gn
@@ -120,24 +120,16 @@ config("extra_warnings") {
"/we4244", # Conversion: possible loss of data.
"/we4456", # Variable shadowing.
"/we4458", # declaration hides class member.
+ "/we4715", # not all control paths return a value
"/we4800", # forcing value to bool.
"/we4838", # narrowing conversion.
]
}
if (is_clang) {
- if (!is_fuchsia) {
- cflags += [
- # Remove when crbug.com/926235 is resolved.
- "-Wextra-semi",
- ]
- }
-
cflags += [
# Enable after anglebug.com/3128 is fixed.
# "-Wextra-semi-stmt",
- # Remove when crbug.com/428099 is resolved.
- "-Winconsistent-missing-override",
"-Wnon-virtual-dtor",
"-Wunneeded-internal-declaration",
]
@@ -455,8 +447,10 @@ config("libANGLE_config") {
cflags = []
defines = []
libs = []
+ ldflags = []
if (angle_enable_d3d9) {
defines += [ "ANGLE_ENABLE_D3D9" ]
+ ldflags += [ "/DELAYLOAD:d3d9.dll" ]
}
if (angle_enable_d3d11) {
defines += [ "ANGLE_ENABLE_D3D11" ]
@@ -472,6 +466,9 @@ config("libANGLE_config") {
}
if (angle_enable_vulkan) {
defines += [ "ANGLE_ENABLE_VULKAN" ]
+ if (angle_enable_custom_vulkan_cmd_buffers) {
+ defines += [ "ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS=1" ]
+ }
}
if (angle_enable_null) {
defines += [ "ANGLE_ENABLE_NULL" ]
@@ -495,28 +492,9 @@ config("libANGLE_config") {
if (angle_enable_vulkan) {
config("vulkan_config") {
- if (is_win) {
- defines = [
- "VK_USE_PLATFORM_WIN32_KHR",
- "VK_USE_PLATFORM_WIN32_KHX",
- ]
- }
- if (is_linux) {
- defines = [
- "VK_USE_PLATFORM_XCB_KHR",
- "VK_USE_PLATFORM_XCB_KHX",
- ]
- }
if (is_android) {
- defines = [
- "VK_USE_PLATFORM_ANDROID_KHR",
- "VK_USE_PLATFORM_ANDROID_KHX",
- ]
libs = [ "vulkan" ]
}
- if (is_fuchsia) {
- defines = [ "VK_USE_PLATFORM_FUCHSIA" ]
- }
}
# Use this target to include everything ANGLE needs for Vulkan.
diff --git a/chromium/third_party/angle/CONTRIBUTORS b/chromium/third_party/angle/CONTRIBUTORS
index 4ec82435432..4c3baa352cf 100644
--- a/chromium/third_party/angle/CONTRIBUTORS
+++ b/chromium/third_party/angle/CONTRIBUTORS
@@ -108,6 +108,7 @@ Till Rathmann
Microsoft Corporation
Cooper Partin
Austin Kinross
+ Mingyu Hu
Minmin Gong
Shawn Hargreaves
Rafael Cintron
@@ -140,3 +141,7 @@ LG Electronics, Inc.
IBM Inc.
Junliang Yan
+
+AdaptVis GmbH
+ Sascha Kolodzey
+
diff --git a/chromium/third_party/angle/DEPS b/chromium/third_party/angle/DEPS
index 4adf6e73aa8..2a3828775fa 100644
--- a/chromium/third_party/angle/DEPS
+++ b/chromium/third_party/angle/DEPS
@@ -12,41 +12,41 @@ vars = {
'deqp_revision': '66a49e0a43f7af654ee1de8a3b1bcaf6c0d14aa4',
# Current revision of glslang, the Khronos SPIRV compiler.
- 'glslang_revision': 'f6e7c4d2de0d59724ea07739df70c466d169a2cd',
+ 'glslang_revision': '805b09f9220300ff94f9e710921b3dc51173a4d4',
# Current revision fo the SPIRV-Headers Vulkan support library.
- 'spirv_headers_revision': '8bea0a266ac9b718aa0818d9e3a47c0b77c2cb23',
+ 'spirv_headers_revision': '2434b89345a50c018c84f42a310b0fad4f3fd94f',
# Current revision of SPIRV-Tools for Vulkan.
- 'spirv_tools_revision': 'fde69dcd80cc1ca548300702adf01eeb25441f3e',
+ 'spirv_tools_revision': 'ac878fcbdd644d5feecd7efe404d362081f5575b',
# Current revision of Khronos Vulkan-Headers.
- 'vulkan_headers_revision': 'c200cb25db0f47364d3318d92c1d8e9dfff2fef1',
+ 'vulkan_headers_revision': '982f0f84dccf6f281b48318c77261a9028000126',
# Current revision of Khronos Vulkan-Loader.
- 'vulkan_loader_revision': 'e1eafa18e17d00374253bcd37d015befa89fcc43',
+ 'vulkan_loader_revision': '2f0abfcf9eb04018e6e92125a70bc28665aa17fe',
# Current revision of Khronos Vulkan-Tools.
- 'vulkan_tools_revision': '91b17fd866b2e9cfb875bf516b05536d059416b1',
+ 'vulkan_tools_revision': 'f392e71b994036c92b896c2a62cc63d042b7f9b1',
# Current revision of Khronos Vulkan-ValidationLayers.
- 'vulkan_validation_revision': '4eee269ae976567ef78db9c9feaafc3364578c87',
+ 'vulkan_validation_revision': 'ff80a937c8a505abbdddb95d8ffaa446820c8391',
}
deps = {
'{angle_root}/build': {
- 'url': '{chromium_git}/chromium/src/build.git@9a53be87ebb636c35f2ed9772e5deaeb350d790b',
+ 'url': '{chromium_git}/chromium/src/build.git@a660b0b9174e3a808f620222017566e8d1b2669b',
'condition': 'not build_with_chromium',
},
'{angle_root}/buildtools': {
- 'url': '{chromium_git}/chromium/buildtools.git@6fbda1b24c1893a893b17aa219b765b9e7c801d8',
+ 'url': '{chromium_git}/chromium/src/buildtools.git@459baaf66bee809f6eb288e0215cf524f4d2429a',
'condition': 'not build_with_chromium',
},
'{angle_root}/testing': {
- 'url': '{chromium_git}/chromium/src/testing@7bdda3c6577f21fd0ec986a0383ecfce28f5d761',
+ 'url': '{chromium_git}/chromium/src/testing@083d633e752e7a57cbe62a468a06e51e28c49ee9',
'condition': 'not build_with_chromium',
},
@@ -60,6 +60,11 @@ deps = {
'url': '{chromium_git}/external/deqp@{deqp_revision}',
},
+ '{angle_root}/third_party/fuchsia-sdk': {
+ 'url': '{chromium_git}/chromium/src/third_party/fuchsia-sdk.git@8e8db13b538ecb251e5ce9d5c781fc142f9752fd',
+ 'condition': 'checkout_fuchsia and not build_with_chromium',
+ },
+
# glmark2 is a GPL3-licensed OpenGL ES 2.0 benchmark. We use it for testing.
'{angle_root}/third_party/glmark2/src': {
'url': '{chromium_git}/external/github.com/glmark2/glmark2@c4b3ff5a481348e8bdc2b71ee275864db91e40b1',
@@ -101,6 +106,11 @@ deps = {
'condition': 'not build_with_chromium',
},
+ '{angle_root}/third_party/Python-Markdown': {
+ 'url': '{chromium_git}/chromium/src/third_party/Python-Markdown@b08af21eb795e522e1b972cb85bff59edb1ae209',
+ 'condition': 'not build_with_chromium',
+ },
+
'{angle_root}/third_party/qemu-linux-x64': {
'packages': [
{
@@ -173,9 +183,9 @@ deps = {
'condition': 'not build_with_chromium',
},
- '{angle_root}/third_party/fuchsia-sdk': {
- 'url': '{chromium_git}/chromium/src/third_party/fuchsia-sdk.git@8e8db13b538ecb251e5ce9d5c781fc142f9752fd',
- 'condition': 'checkout_fuchsia and not build_with_chromium',
+ '{angle_root}/tools/md_browser': {
+ 'url': '{chromium_git}/chromium/src/tools/md_browser@e9462696241f3ca832890473173e03e7bcfe6adc',
+ 'condition': 'not build_with_chromium',
},
}
@@ -217,43 +227,6 @@ hooks = [
'-s', '{angle_root}/buildtools/linux64/clang-format.sha1',
],
},
- # Pull GN binaries using checked-in hashes.
- {
- 'name': 'gn_win',
- 'pattern': '.',
- 'condition': 'host_os == "win" and not build_with_chromium',
- 'action': [ 'download_from_google_storage',
- '--no_resume',
- '--platform=win32',
- '--no_auth',
- '--bucket', 'chromium-gn',
- '-s', '{angle_root}/buildtools/win/gn.exe.sha1',
- ],
- },
- {
- 'name': 'gn_mac',
- 'pattern': '.',
- 'condition': 'host_os == "mac" and not build_with_chromium',
- 'action': [ 'download_from_google_storage',
- '--no_resume',
- '--platform=darwin',
- '--no_auth',
- '--bucket', 'chromium-gn',
- '-s', '{angle_root}/buildtools/mac/gn.sha1',
- ],
- },
- {
- 'name': 'gn_linux64',
- 'pattern': '.',
- 'condition': 'host_os == "linux" and not build_with_chromium',
- 'action': [ 'download_from_google_storage',
- '--no_resume',
- '--platform=linux*',
- '--no_auth',
- '--bucket', 'chromium-gn',
- '-s', '{angle_root}/buildtools/linux64/gn.sha1',
- ],
- },
{
'name': 'sysroot_x86',
'pattern': '.',
@@ -275,6 +248,13 @@ hooks = [
'condition': 'checkout_win and not build_with_chromium',
'action': ['python', '{angle_root}/build/vs_toolchain.py', 'update', '--force'],
},
+ {
+ # Update the Mac toolchain if necessary.
+ 'name': 'mac_toolchain',
+ 'pattern': '.',
+ 'condition': 'checkout_mac and not build_with_chromium',
+ 'action': ['python', '{angle_root}/build/mac_toolchain.py'],
+ },
{
# Note: On Win, this should run after win_toolchain, as it may use it.
@@ -315,6 +295,34 @@ hooks = [
'{angle_root}/build/fuchsia/update_sdk.py',
],
},
+
+ # Download glslang validator binary for Linux.
+ {
+ 'name': 'linux_glslang_validator',
+ 'pattern': '.',
+ 'condition': 'checkout_linux and not build_with_chromium',
+ 'action': [ 'download_from_google_storage',
+ '--no_resume',
+ '--platform=linux*',
+ '--no_auth',
+ '--bucket', 'angle-glslang-validator',
+ '-s', '{angle_root}/tools/glslang/glslang_validator.sha1',
+ ],
+ },
+
+ # Download glslang validator binary for Windows.
+ {
+ 'name': 'win_glslang_validator',
+ 'pattern': '.',
+ 'condition': 'checkout_win and not build_with_chromium',
+ 'action': [ 'download_from_google_storage',
+ '--no_resume',
+ '--platform=win32*',
+ '--no_auth',
+ '--bucket', 'angle-glslang-validator',
+ '-s', '{angle_root}/tools/glslang/glslang_validator.exe.sha1',
+ ],
+ },
]
recursedeps = [
diff --git a/chromium/third_party/angle/OWNERS b/chromium/third_party/angle/OWNERS
index b292b5f4b8f..b700861dabe 100644
--- a/chromium/third_party/angle/OWNERS
+++ b/chromium/third_party/angle/OWNERS
@@ -4,3 +4,5 @@ geofflang@chromium.org
jmadill@chromium.org
syoussefi@chromium.org
ynovikov@chromium.org
+
+# COMPONENT: Internals>GPU>Angle
diff --git a/chromium/third_party/angle/PRESUBMIT.py b/chromium/third_party/angle/PRESUBMIT.py
index 8a9d8747d8e..501fecdb681 100644
--- a/chromium/third_party/angle/PRESUBMIT.py
+++ b/chromium/third_party/angle/PRESUBMIT.py
@@ -20,6 +20,16 @@ _HEADER_EXTENSIONS = r'\.(h|hpp|hxx)$'
def _CheckCodeGeneration(input_api, output_api):
+
+ class Msg(output_api.PresubmitError):
+ """Specialized error message"""
+ def __init__(self, message):
+ super(output_api.PresubmitError, self).__init__(message,
+ long_text='Please ensure your ANGLE repositiory is synced to tip-of-tree\n'
+ 'and you have an up-to-date checkout of all ANGLE dependencies.\n'
+ 'If you are using ANGLE inside Chromium you may need to bootstrap ANGLE \n'
+ 'and run gclient sync. See the DevSetup documentation for details.\n')
+
code_gen_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
'scripts/run_code_generation.py')
cmd_name = 'run_code_generation'
@@ -28,7 +38,7 @@ def _CheckCodeGeneration(input_api, output_api):
name=cmd_name,
cmd=cmd,
kwargs={},
- message=output_api.PresubmitError)
+ message=Msg)
if input_api.verbose:
print('Running ' + cmd_name)
return input_api.RunTests([test_cmd])
@@ -90,6 +100,7 @@ def CheckChangeOnUpload(input_api, output_api):
def CheckChangeOnCommit(input_api, output_api):
results = []
+ results.extend(_CheckCodeGeneration(input_api, output_api))
results.extend(
input_api.canned_checks.CheckPatchFormatted(input_api, output_api))
results.extend(input_api.canned_checks.CheckChangeHasBugField(
diff --git a/chromium/third_party/angle/build_overrides/build.gni b/chromium/third_party/angle/build_overrides/build.gni
index 1a5608e8de0..e82a3fe5cdd 100644
--- a/chromium/third_party/angle/build_overrides/build.gni
+++ b/chromium/third_party/angle/build_overrides/build.gni
@@ -1,7 +1,26 @@
# Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-build_with_chromium = false
-ignore_elf32_limitations = true
-linux_use_bundled_binutils_override = false
-use_system_xcode = true
+
+declare_args() {
+ build_with_chromium = false
+ ignore_elf32_limitations = true
+ linux_use_bundled_binutils_override = false
+
+ use_system_xcode = ""
+}
+
+if (host_os == "mac" && use_system_xcode == "") {
+ _result = exec_script("//build/mac/should_use_hermetic_xcode.py",
+ [ target_os ],
+ "value")
+
+ assert(_result != 2,
+ "Do not allow building targets with the default" +
+ "hermetic toolchain if the minimum OS version is not met.")
+ assert(_result != 3,
+ "iOS does not support building with a hermetic toolchain. " +
+ "Please install Xcode.")
+
+ use_system_xcode = _result != 1
+}
diff --git a/chromium/third_party/angle/doc/CodingStandard.md b/chromium/third_party/angle/doc/CodingStandard.md
index 93bff8fc925..b5b78e2876f 100644
--- a/chromium/third_party/angle/doc/CodingStandard.md
+++ b/chromium/third_party/angle/doc/CodingStandard.md
@@ -154,3 +154,24 @@ const string &str;
* If modifying pre-existing code that does not match the standard, the altered
portions of the code should be changed to match the standard.
+
+### Generated Source Files
+
+Prefer storing generated sources as baked files in the repository. Avoid using
+GN actions to run Python scripts.
+
+**Definition:**
+
+Sometimes helper scripts can create compilable sources more easily from XML or
+JSON data sources than maintaining source files by hand. These scripts are often
+written in Python and output generated sources.
+
+**Decision**
+
+Storing generated sources in the repository makes integration easier for non-GN
+users. Python scripts can be expensive and slow to run at compile-time.
+Generated sources can be a pain point for messing up builds.
+
+It could be possible to solve the build clobbering problem. And we could replace
+Python with something faster. But to allow for easier integration with our tools
+and customers we should bake generated files into the repository.
diff --git a/chromium/third_party/angle/doc/ContributingCode.md b/chromium/third_party/angle/doc/ContributingCode.md
index 6c4d2101f8c..c0eecb242c1 100644
--- a/chromium/third_party/angle/doc/ContributingCode.md
+++ b/chromium/third_party/angle/doc/ContributingCode.md
@@ -96,22 +96,11 @@
* `git pull --rebase`
### Selecting reviewers
-ANGLE has a loose owners structure but the following mapping can be useful for choosing initial reviewers:
- * Compiler/preprocessor `src/compiler`
- * `cwallez at chromium dot org`
- * OpenGL ES/EGL frontend `src/libANGLE`
- * `geofflang at chromium dot org`
- * `jmadill at chromium dot org`
- * Direct3D backends `src/libANGLE/renderer/d3d`
- * `jmadill at chromium dot org`
- * OpenGL backend `src/libANGLE/renderer/gl`
- * `geofflang at chromium dot org`
- * Vulkan backend `src/libANGLE/renderer/vulkan`
- * `jmadill at chromium dot org`
- * Android integration `src/libANGLE/renderer/*/android`
- * `ynovikov at chromium dot org`
- * ChromeOS integration `src/libANGLE/renderer/*/ozone`
- * `fjhenigman at chromium dot org`
+When your CL is ready to review, add any of the following reviewers. They will be able to route your CL to additional reviewers as neccssary and answer any questions you may have about the process.
+ * `geofflang at chromium dot org`
+ * `jmadill at chromium dot org`
+ * `syoussefi at chromium dot org`
+ * `ynovikov at chromium dot org`
### Committer status
Similar to [Chromium's committer status](https://dev.chromium.org/getting-involved/become-a-committer), long-term contributors to the ANGLE project may request to join the `angle-committers` group. This allows you to give `+2` on code reviews and land patches without assistance. After about 6 months of regular contributions, you may request committer status from a core ANGLE team member via email or code review. Chromium committers may ask at any time.
diff --git a/chromium/third_party/angle/doc/DebuggingTips.md b/chromium/third_party/angle/doc/DebuggingTips.md
index 0afced8cd8a..fdae9174312 100644
--- a/chromium/third_party/angle/doc/DebuggingTips.md
+++ b/chromium/third_party/angle/doc/DebuggingTips.md
@@ -1,18 +1,31 @@
# Debugging Tips
-There are many ways to debug ANGLE using generic or platform-dependent tools. Here is a list of tips on how to use them.
+There are many ways to debug ANGLE using generic or platform-dependent tools. Here is a list of tips
+on how to use them.
## Running ANGLE under apitrace on Linux
-[Apitrace](http://apitrace.github.io/) captures traces of OpenGL commands for later analysis, allowing us to see how ANGLE translates OpenGL ES commands. In order to capture the trace, it inserts a driver shim using `LD_PRELOAD` that records the command and then forwards it to the OpenGL driver.
+[Apitrace](http://apitrace.github.io/) captures traces of OpenGL commands for later analysis,
+allowing us to see how ANGLE translates OpenGL ES commands. In order to capture the trace, it
+inserts a driver shim using `LD_PRELOAD` that records the command and then forwards it to the OpenGL
+driver.
-The problem with ANGLE is that it exposes the same symbols as the OpenGL driver so apitrace captures the entry point calls intended for ANGLE and reroutes them to the OpenGL driver. In order to avoid this problem, use the following:
+The problem with ANGLE is that it exposes the same symbols as the OpenGL driver so apitrace captures
+the entry point calls intended for ANGLE and reroutes them to the OpenGL driver. In order to avoid
+this problem, use the following:
-1. Link your application against the static ANGLE libraries (libGLESv2_static and libEGL_static) so they don't get shadowed by apitrace's shim.
-2. Ask apitrace to explicitly load the driver instead of using a dlsym on the current module. Otherwise apitrace will use ANGLE's symbols as the OpenGL driver entrypoint (causing infinite recursion). To do this you must point an environment variable to your GL driver. For example: `export TRACE_LIBGL=/usr/lib/libGL.so.1`. You can find your libGL with `ldconfig -p | grep libGL`.
-3. Link ANGLE against libGL instead of dlsyming the symbols at runtime; otherwise ANGLE won't use the replaced driver entry points. This is done with the gn arg `angle_link_glx = true`.
+1. Link your application against the static ANGLE libraries (libGLESv2_static and libEGL_static) so
+ they don't get shadowed by apitrace's shim.
+2. Ask apitrace to explicitly load the driver instead of using a dlsym on the current module.
+ Otherwise apitrace will use ANGLE's symbols as the OpenGL driver entrypoint (causing infinite
+ recursion). To do this you must point an environment variable to your GL driver. For example:
+ `export TRACE_LIBGL=/usr/lib/libGL.so.1`. You can find your libGL with
+ `ldconfig -p | grep libGL`.
+3. Link ANGLE against libGL instead of dlsyming the symbols at runtime; otherwise ANGLE won't use
+ the replaced driver entry points. This is done with the gn arg `angle_link_glx = true`.
-If you follow these steps, apitrace will work correctly aside from a few minor bugs like not being able to figure out what the default framebuffer size is if there is no glViewport command.
+If you follow these steps, apitrace will work correctly aside from a few minor bugs like not being
+able to figure out what the default framebuffer size is if there is no glViewport command.
For example, to trace a run of `hello_triangle`, assuming the apitrace executables are in `$PATH`:
@@ -28,36 +41,190 @@ qapitrace mytrace
## Running ANGLE under GAPID on Linux
[GAPID](https://github.com/google/gapid) can be used to capture trace of Vulkan commands on Linux.
-For it to work, libvulkan has to be a shared library, instead of being statically linked into ANGLE, which is the default behavior.
-This is done with the gn arg:
+For it to work, libvulkan has to be a shared library, instead of being statically linked into ANGLE,
+which is the default behavior. This is done with the gn arg:
+
```
angle_shared_libvulkan = true
```
-When capturing traces of gtest based tests built inside Chromium checkout, make sure to run the tests with `--single-process-tests` argument.
+When capturing traces of gtest based tests built inside Chromium checkout, make sure to run the
+tests with `--single-process-tests` argument.
## Running ANGLE under GAPID on Android
-[GAPID](https://github.com/google/gapid) can be used to capture a trace of the Vulkan or OpenGL ES command stream on Android.
-For it to work, ANGLE's libraries must have different names from the system OpenGL libraries.
-This is done with the gn arg:
+[GAPID](https://github.com/google/gapid) can be used to capture a trace of the Vulkan or OpenGL ES
+command stream on Android. For it to work, ANGLE's libraries must have different names from the
+system OpenGL libraries. This is done with the gn arg:
+
```
-angle_libs_suffix = "_ANGLE"
+angle_libs_suffix = "_ANGLE_DEV"
```
-All [NativeTest](https://chromium.googlesource.com/chromium/src/+/master/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java) based tests share the same activity name, `org.chromium.native_test.NativeUnitTestNativeActivity`. Thus, prior to capturing your test trace, the specific test APK must be installed on the device. When you build the test, a test launcher is generated, for example, `./out/Release/bin/run_angle_end2end_tests`. The best way to install the APK is to run this test launcher once.
+All
+[NativeTest](https://chromium.googlesource.com/chromium/src/+/master/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java)
+based tests share the same activity name, `org.chromium.native_test.NativeUnitTestNativeActivity`.
+Thus, prior to capturing your test trace, the specific test APK must be installed on the device.
+When you build the test, a test launcher is generated, for example,
+`./out/Release/bin/run_angle_end2end_tests`. The best way to install the APK is to run this test
+launcher once.
+
+In GAPID's "Capture Trace" dialog, "Package / Action:" should be:
-In GAPID's "Capture Trace" dialog, "Package / Action:" should be
```
android.intent.action.MAIN:org.chromium.native_test/org.chromium.native_test.NativeUnitTestNativeActivity
```
-The mandatory [extra intent argument](https://developer.android.com/studio/command-line/adb.html#IntentSpec) for starting the activity is `org.chromium.native_test.NativeTest.StdoutFile`. Without it the test APK crashes. Test filters can be specified via either the `org.chromium.native_test.NativeTest.CommandLineFlags` or the `org.chromium.native_test.NativeTest.Shard` argument.
-Example "Intent Arguments:" values in GAPID's "Capture Trace" dialog:
+The mandatory [extra intent
+argument](https://developer.android.com/studio/command-line/adb.html#IntentSpec) for starting the
+activity is `org.chromium.native_test.NativeTest.StdoutFile`. Without it the test APK crashes. Test
+filters can be specified via either the `org.chromium.native_test.NativeTest.CommandLineFlags` or
+the `org.chromium.native_test.NativeTest.Shard` argument. Example "Intent Arguments:" values in
+GAPID's "Capture Trace" dialog:
+
```
-e org.chromium.native_test.NativeTest.StdoutFile /sdcard/chromium_tests_root/out.txt -e org.chromium.native_test.NativeTest.CommandLineFlags "--gtest_filter=*ES2_VULKAN"
```
+
or
+
```
-e org.chromium.native_test.NativeTest.StdoutFile /sdcard/chromium_tests_root/out.txt --esal org.chromium.native_test.NativeTest.Shard RendererTest.SimpleOperation/ES2_VULKAN,SimpleOperationTest.DrawWithTexture/ES2_VULKAN
```
+
+## Running ANGLE under RenderDoc
+
+An application running through ANGLE can confuse [RenderDoc](https://github.com/baldurk/renderdoc),
+as RenderDoc [hooks to EGL](https://github.com/baldurk/renderdoc/issues/1045) and ends up tracing
+the calls the application makes, instead of the calls ANGLE makes to its backend. As ANGLE is a
+special case, there's little support for it by RenderDoc, though there are workarounds.
+
+### Windows
+
+On Windows, RenderDoc supports setting the environment variable `RENDERDOC_HOOK_EGL` to 0 to avoid
+this issue.
+### Linux
+
+On Linux, there is no supported workaround by RenderDoc. See [this
+issue](https://github.com/baldurk/renderdoc/issues/1045#issuecomment-463999869). To capture Vulkan
+traces, the workaround is to build RenderDoc without GL(ES) support.
+
+Building RenderDoc is straightforward. However, here are a few instructions to keep in mind.
+
+```
+# Install dependencies based on RenderDoc document. Here are some packages that are unlikely to be already installed:
+$ sudo apt install libxcb-keysyms1-dev python3-dev qt5-qmake libqt5svg5-dev libqt5x11extras5-dev
+
+# Inside the RenderDoc directory:
+$ cmake -DCMAKE_BUILD_TYPE=Release -Bbuild -H. -DENABLE_GLES=OFF -DENABLE_GL=OFF
+
+# QT_SELECT=5 is necessary if your distribution doesn't default to Qt5
+$ QT_SELECT=5 make -j -C build
+
+# Run RenderDoc from the build directory:
+$ ./build/bin/qrenderdoc
+```
+
+Additionally, libvulkan has to be a shared library, instead of being statically linked into ANGLE,
+which is the default behavior. This is done with the gn arg:
+
+```
+angle_shared_libvulkan = true
+```
+
+If your distribution does not provide a recent Vulkan SDK package, you would need to manually
+install that. This script tries to perform this installation as safely as possible. It would
+overwrite the system package's files, so follow at your own risk. Place this script just above the
+extracted SDK directory.
+
+```
+#! /bin/bash
+
+if [ $# -lt 1 ]; then
+ echo "Usage: $0 <version>"
+ exit 1
+fi
+
+ver=$1
+
+if [ ! -d "$ver" ]; then
+ echo "$ver is not a directory"
+fi
+
+# Verify everything first
+echo "Verifying files..."
+echo "$ver"/x86_64/bin/vulkaninfo
+test -f "$ver"/x86_64/bin/vulkaninfo || exit 1
+echo "$ver"/x86_64/etc/explicit_layer.d/
+test -d "$ver"/x86_64/etc/explicit_layer.d || exit 1
+echo "$ver"/x86_64/lib/
+test -d "$ver"/x86_64/lib || exit 1
+
+echo "Verified. Performing copy..."
+
+echo sudo cp "$ver"/x86_64/bin/vulkaninfo /usr/bin/vulkaninfo
+sudo cp "$ver"/x86_64/bin/vulkaninfo /usr/bin/vulkaninfo
+echo sudo cp "$ver"/x86_64/etc/explicit_layer.d/* /etc/explicit_layer.d/
+sudo cp "$ver"/x86_64/etc/explicit_layer.d/* /etc/explicit_layer.d/
+echo sudo rm /usr/lib/x86_64-linux-gnu/libvulkan.so*
+sudo rm /usr/lib/x86_64-linux-gnu/libvulkan.so*
+echo sudo cp -P "$ver"/x86_64/lib/lib* /usr/lib/x86_64-linux-gnu/
+sudo cp -P "$ver"/x86_64/lib/lib* /usr/lib/x86_64-linux-gnu/
+
+echo "Done."
+```
+
+### Android
+
+If you are on Linux, make sure not to use the build done in the previous section. The GL renderer
+disabled in the previous section is actually needed in this section.
+
+Define the following environment variables, for example in `.bashrc` (values are examples):
+
+```
+export JAVA_HOME=/usr/local/buildtools/java/jdk
+export ANDROID_SDK=$HOME/chromium/src/third_party/android_sdk/public
+export ANDROID_NDK=$HOME/chromium/src/third_party/android_ndk
+export ANDROID_NDK_HOME=$HOME/chromium/src/third_party/android_ndk
+```
+
+In the renderdoc directory, create Android builds of RenderDoc:
+
+```
+mkdir build-android-arm32
+cd build-android-arm32/
+cmake -DBUILD_ANDROID=On -DANDROID_ABI=armeabi-v7a ..
+make -j
+cd ../
+
+mkdir build-android-arm64
+cd build-android-arm64/
+cmake -DBUILD_ANDROID=On -DANDROID_ABI=arm64-v8a ..
+make -j
+cd ../
+```
+
+Note that you need both arm32 and arm64 builds even if working with an arm64 device. See
+[RenderDoc's documentation](https://github.com/baldurk/renderdoc/blob/v1.x/docs/CONTRIBUTING/Compiling.md#android)
+for more information.
+
+When you run RenderDoc, choose the "Replay Context" from the bottom-left part of the UI (defaults to
+Local). When selecting the device, you should see the RenderDoc application running.
+
+In ANGLE itself, make sure you add a suffix for its names to be different from the system's. Add
+this to gn args:
+
+```
+angle_libs_suffix = "_ANGLE_DEV"
+```
+
+Next, you need to install an ANGLE test apk. When you build the test, a test launcher is generated,
+for example, `./out/Release/bin/run_angle_end2end_tests`. The best way to install the APK is to run
+this test launcher once.
+
+In RenderDoc, use `org.chromium.native_test` as the Executable Path, and provide the following
+arguments:
+
+```
+-e org.chromium.native_test.NativeTest.StdoutFile /sdcard/chromium_tests_root/out.txt -e org.chromium.native_test.NativeTest.CommandLineFlags "--gtest_filter=*ES2_VULKAN"
+```
diff --git a/chromium/third_party/angle/extensions/ANGLE_multiview.txt b/chromium/third_party/angle/extensions/ANGLE_multiview.txt
deleted file mode 100644
index be60939fe3a..00000000000
--- a/chromium/third_party/angle/extensions/ANGLE_multiview.txt
+++ /dev/null
@@ -1,541 +0,0 @@
-Name
-
- ANGLE_multiview
-
-Name Strings
-
- GL_ANGLE_multiview
-
-Contributors
-
- Martin Radev, NVIDIA Corporation
- Olli Etuaho, NVIDIA Corporation
- Corentin Wallez, Google
- Geoff Lang, Google
- Jamie Madill, Google
-
-Contact
-
- Olli Etuaho (oetuaho 'at' nvidia.com)
-
-Status
-
- Incomplete
-
-Version
-
- Last Modified Date: December 8, 2018
- Author Revision: 1
-
-Number
-
- OpenGL ES Extension XX
-
-Dependencies
-
- OpenGL ES 3.0 is required.
-
-Overview
-
- Multi-view rendering, achieved through the functionality exposed by
- ANGLE, expects the user to issue for each view almost the same
- drawing commands and state changes sequentially. This rendering
- method scales with the number of views and can be detrimental for
- performance in scenes with many draw calls.
-
- This extension addresses the issue by adding means for multi-view
- side-by-side rendering onto a single 2D texture and layered
- rendering onto the many layers of a 2D texture array. The new vertex
- and fragment shader built-in - ViewID_OVR - is added which signifies
- the view for which the current vertex or fragment is being
- processed, so that per-view transformations can be applied.
-
-IP Status
-
- No known IP claims.
-
-New Tokens
-
- Accepted by the <pname> parameter of GetFramebufferAttachmentParameteriv:
-
- FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE 0x9630
- FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE 0x969B
- FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE 0x9632
- FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE 0x969C
-
- Returned in <params> by GetFramebufferAttachmentParameteriv:
-
- FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE 0x969D
- FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE 0x969E
-
- Accepted by the <pname> parameter of GetIntegerv:
-
- MAX_VIEWS_ANGLE 0x9631
-
- Returned by CheckFramebufferStatus:
-
- FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE 0x9633
-
-New Procedures and Functions
-
- void FramebufferTextureMultiviewLayeredANGLE(enum target,
- enum attachment,
- uint texture,
- int level,
- int baseViewIndex,
- sizei numViews);
- void FramebufferTextureMultiviewSideBySideANGLE(enum target,
- enum attachment,
- uint texture,
- int level,
- sizei numViews,
- const int *viewportOffsets);
-
-Additions to Chapter 2 of the OpenGL ES 3.0 Specification (OpenGL ES Operation)
-
- Modify section 2.9.3 Drawing commands, p. 28
-
- Append to the end of the section:
-
- "
- If any drawing command is called the number of views specified in the
- program must match the number of views in the draw framebuffer. If
- there is a mismatch, an INVALID_OPERATION error is generated.
-
- If the active draw framebuffer has a side-by-side multi-view layout
- and the scissor test is not enabled, the result of any draw command
- is undefined, but is not followed by program termination.
- "
-
- Modify section 2.15.2 Transform Feedback Primitive Capture, p. 91
-
- In the list just after "The error INVALID_OPERATION is generated:"
- do the following:
-
- - Add another bullet point:
- "
- * by any Draw* command if the number of views in the draw
- framebuffer is greater than 1 and there is an active and not
- paused transform feedback object.
- "
-
-Additions to Chapter 3 of the OpenGL ES 3.0 Specification (Rasterization)
-
- Modify section 3.8.5 (Alternate Texture Image Specification Commands),
- p. 145
-
- Add at the end of the section:
-
- "Calling CopyTexSubImage3D, CopyTexImage2D, or CopyTexSubImage2D will
- result in an INVALID_FRAMEBUFFER_OPERATION error if the multi-view
- layout of the current read framebuffer is
- FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE or the number of views in the
- current read framebuffer is more than one."
-
-Additions to Chapter 4 of the OpenGL ES 3.0 Specification
-(Per-Fragment Operations and the Framebuffer)
-
- Modify section 4.1.6 (Occlusion queries), p. 177
-
- Replace the first sentence with:
-
- "Occlusion queries use query objects to track whether any fragments
- or samples pass the depth test for any of the views."
-
- Append to the sentence
-
- "While that occlusion query is active, the samples-boolean state is
- set to TRUE if any fragment or sample passes the depth test"
-
- the text
-
- " for any of the views."
-
- Modify section 4.2.3 (Clearing the Buffers), p. 190
-
- Add a new subsection at the end:
-
- "4.2.3.2 Clearing Multi-view Buffers
-
- Clearing commands are applied to each view in the current multi-view
- framebuffer object and have the same constraints as described
- in section 4.2.3 Clearing the Buffers.
-
- If the active draw framebuffer has a side-by-side multi-view layout
- and the scissor test is not enabled, the clearing command clears
- the whole content of the specified buffers.
- "
-
- Modify section 4.3.2 (Reading pixels), p. 193
-
- Add to the end of the section:
-
- " ReadPixels generates an INVALID_FRAMEBUFFER_OPERATION error if
- the multi-view layout of the current read framebuffer is
- FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE or the number of views in the
- current read framebuffer is more than one."
-
- Modify section 4.3.3 (Copying pixels), p. 198
-
- After the paragraph
-
- "Calling BlitFramebuffer will result in an INVALID_OPERATION error
- if filter is LINEAR and read buffer contains integer data."
-
- add a new paragraph:
-
- "Calling BlitFramebuffer will result in an INVALID_FRAMEBUFFER_OPERATION
- error if the multi-view layout of the current draw framebuffer is not NONE,
- or the multi-view layout of the current read framebuffer is
- FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, or the number of views in the
- current read framebuffer is more than one."
-
-
- Modify section 4.4.2 (Attaching Images to Framebuffer Objects), p. 202
-
- Add the following bullet point:
-
- "* Layers of a two-dimensional array texture which can be used for
- multi-view rendering."
-
- Modify section 4.4.2.4 (Attaching Texture Images to a Framebuffer), p. 207
-
- Add just before the sentence "Effects of Attaching a Texture Image":
-
- "
- The command
-
- SelectView( id );
-
- does not exist in the GL, but it is used to describe the multi-view
- functionality in the rest of this section. The effect of this function
- is to select the view specified by <id> and set the value to the vertex
- and fragment shader built-in gl_ViewID_OVR.
-
- The command
-
- void FramebufferTextureMultiviewLayeredANGLE(enum target,
- enum attachment,
- uint texture,
- int level,
- int baseViewIndex,
- sizei numViews);
-
- can be used to attach a 2D texture array object as one of the logical
- buffers of a framebuffer object which is to be used for layered
- multi-view rendering.
-
- basicViewIndex specifies the View-id offset.
- numViews specifies the number of views associated with the attachment.
-
- Any <Draw> command, while a layered multi-view framebuffer is bound,
- has the same effect as:
-
- for( int id = 0; i < numViews; id++ ) {
- for ( framebufferAttachment : framebuffer.getAllAttachments() )
- {
- attachment = framebufferAttachment.attachment
- texture = framebufferAttachment.texture
- level = framebufferAttachment.level
- baseViewIndex = framebufferAttachment.baseViewIndex
- FramebufferTextureLayer( target, attachment, texture, level,
- baseViewIndex + id );
- }
- SelectView( id );
- <Draw>
- }
-
- Errors:
- An INVALID_ENUM error is generated if target is not DRAW_FRAMEBUFFER,
- READ_FRAMEBUFFER, or FRAMEBUFFER.
- An INVALID_OPERATION error is generated if attachment is
- COLOR_ATTACHMENTm where m is greater than or equal to the value
- of MAX_COLOR_ATTACHMENTS.
- An INVALID_ENUM error is generated if attachment is not one of
- the attachments in table 4.6, and attachment is not
- COLOR_ATTACHMENTm where m is greater than or equal to the value
- of MAX_COLOR_ATTACHMENTS.
- An INVALID_OPERATION error is generated if zero is bound to target.
- An INVALID_VALUE error is generated if texture is not zero, and
- level is less than zero or greater than log2 of the value of
- MAX_TEXTURE_SIZE.
- An INVALID_OPERATION error is generated if texture is not zero,
- and does not name an existing texture object of type TEXTURE_2D_ARRAY.
- An INVALID_OPERATION error is generated if texture is not zero,
- and names a texture with a compressed texture format.
- An INVALID_VALUE error is generated if texture is not zero, and
- baseViewIndex+numViews is greater than GL_MAX_ARRAY_TEXTURE_LAYERS.
- An INVALID_VALUE error is generated if texture is not zero, and
- numViews is less than 1 or greater than MAX_VIEWS_ANGLE.
- An INVALID_VALUE error is generated if texture is not zero, and
- baseViewIndex is less than 0.
-
- The command
-
- void FramebufferTextureMultiviewSideBySideANGLE(enum target,
- enum attachment,
- uint texture,
- int level,
- sizei numViews,
- const int *viewportOffsets);
-
- can be used to attach a 2D texture object as one of the logical buffers
- of a framebuffer object which is to be used for side-by-side multi-view
- rendering.
-
- numViews specifies the number of views associated with the attachment.
- viewportOffsets specifies the address of an array of integers containing
- the x and y viewport offset of each view.
-
- Any <Draw> command, while a side-by-side multi-view framebuffer is bound,
- has the same effect as:
-
- // Retrieve viewport and scissor state.
- Rectangle viewport
- GetIntegerv(VIEWPORT, viewport)
- Rectangle scissor
- GetIntegerv(SCISSOR_BOX, scissor)
- for ( int id = 0; id < numViews; id++ )
- {
- // Setup view state.
- for ( framebufferAttachment : framebuffer.getAllAttachments() )
- {
- attachment = framebufferAttachment.attachment
- texture = framebufferAttachment.texture
- level = framebufferAttachment.level
- FramebufferTexture2D( target, attachment, TEXTURE_2D, texture,
- level )
- }
- Viewport(viewport.x + viewportOffsets[id].x,
- viewport.y + viewportOffsets[id].y,
- viewport.width, viewport.height)
- Scissor(scissor.x + viewportOffsets[id].x,
- scissor.y + viewportOffsets[id].y,
- scissor.width, scissor.height)
- SelectView(id)
- // Draw.
- <Draw>
- }
- // Restore viewport and scissor state.
- Viewport(viewport.x, viewport.y, viewport.width, viewport.height)
- Scissor(scissor.x, scissor.y, scissor.width, scissor.height)
-
- Errors:
- An INVALID_ENUM error is generated if target is not DRAW_FRAMEBUFFER,
- READ_FRAMEBUFFER, or FRAMEBUFFER.
- An INVALID_OPERATION error is generated if attachment is
- COLOR_ATTACHMENTm where m is greater than or equal to the value
- of MAX_COLOR_ATTACHMENTS.
- An INVALID_ENUM error is generated if attachment is not one of
- the attachments in table 4.6, and attachment is not
- COLOR_ATTACHMENTm where m is greater than or equal to the value
- of MAX_COLOR_ATTACHMENTS.
- An INVALID_OPERATION error is generated if zero is bound to target.
- An INVALID_VALUE error is generated if texture is not zero and
- level is less than zero or greater than log2 of the value of
- MAX_TEXTURE_SIZE.
- An INVALID_OPERATION error is generated if texture is not zero,
- and does not name an existing texture object of type TEXTURE_2D.
- An INVALID_OPERATION error is generated if texture is not zero,
- and names a texture with a compressed texture format.
- An INVALID_VALUE error is generated if texture is not zero, and
- numViews is less than 1 or greater than MAX_VIEWS_ANGLE.
- An INVALID_VALUE error is generated if texture is not zero, and
- any of the first numViews * 2 values in viewportOffsets is negative.
-
- Having overlapping scissor rectangles after viewport offsets are
- applied causes undefined behavior.
- "
-
- Add the following bullet points in the list after
- "Effects of Attaching a Texture Image":
-
- " * The value of FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE is
- set to <numViews>.
- * The value of FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE
- is set to:
- ** FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE if the texture
- is attached via a call to
- FramebufferTextureMultiviewSideBySideANGLE.
- ** FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE if the texture is
- attached via a call to FramebufferTextureMultiviewLayeredANGLE.
- ** NONE otherwise.
- * The value of FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE
- is set to <baseViewIndex> if FramebufferTextureMultiviewLayeredANGLE
- is called. Otherwise, the default value remains.
- * The value of FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE
- is set to <viewportOffsets>.
- "
-
- Modify section 4.4.4.1 (Framebuffer Attachment Completeness), p. 213
-
- Add a bullet point to the end of the list:
-
- "If the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE is TEXTURE and
- the value of FRAMEBUFFER_ATTACHMENT_OBJECT_NAME names a two-dimensional
- array texture, then the sum of FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE
- and FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE must be less
- than the number of layers in the texture."
-
- Modify section 4.4.4.2 (Whole Framebuffer Completeness), p. 214
-
- Add a bullet point after "{ FRAMEBUFFER_INCOMPLETE_MULTISAMPLE }":
-
- "
- * All populated framebuffer attachments have the same number of views,
- same multi-view layout and same viewport offsets.
- { FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE }
- "
-
-Additions to Chapter 5 of the OpenGL ES 3.0 Specification (Special Functions)
-
- None
-
-Additions to Chapter 6 of the OpenGL ES 3.0 Specification
-(State and State Requests)
-
- Modify section 6.1.13 (Framebuffer Object Queries), p. 242
-
- Add a bullet point to the first list:
-
- " * If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE,
- then <params> will contain the number of views for the specified
- attachment.
- * If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE,
- then <params> will contain the viewport offsets for the specified
- attachment. It is undefined behavior to provide an array with size
- less than 2 x <num views>.
- * If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE,
- then <params> will contain FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE,
- FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE or NONE.
- * If <pname> is FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE,
- then <params> will contain the base view index offset for the
- specified attachment."
-
- Changes to table 6.14, p. 259 (Framebuffer (state per attachment point))
-
- Get Value Type Get Command Value Description Sec.
- --------- ----- ----------- ------- ----------- ----
- FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE Z+ GetFramebuffer-
- Attachment- 1 Number of views 4.4.2.4
- Parameteriv
-
- FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE n x Z^{2} GetFramebuffer- 0,0 Viewport offset 4.4.2.4
- Attachment- of each view
- Parameteriv
-
- FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE Z+ GetFramebuffer- NONE Layout type - 4.4.2.4
- Attachment- non-multiview,
- Parameteriv layered or
- side-by-side
-
- FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE Z GetFramebuffer- 0 Base view offset 4.4.2.4
- Attachment-
- Parameteriv
-
- Changes to table 6.28, p. 273 (Implementation Dependent Values):
-
- Add the following entry after MAX_VIEWPORT_DIMS:
-
- Get Value Type Get Command Value Description Sec.
- --------- ----- ----------- ------- ----------- ----
- MAX_VIEWS_ANGLE Z+ GetIntegerv 4 Maximum number of 4.4
- views
-
-Additions to the OpenGL ES 3.0 Shading Language Specification
-
- Including the following line in a shader can be used to control the
- language features described in this extension:
-
- #extension GL_OVR_multiview : <behavior>
-
- where <behavior> is as specified in section 3.5.
-
- New preprocessor #defines are added to the OpenGL Shading Language:
-
- #define GL_OVR_multiview 1
-
- Modify section 4.3.8.1 (Input Layout Qualifiers)
-
- Replace the first sentence by:
-
- "Input variable declarations in the vertex shader can have input
- layout qualifiers."
-
- Add the following text just before the sentence "Fragment shaders
- cannot ...":
-
- "The number of views to which to the program must render to is
- specified through the num_views layout qualifier:
-
- layout-qualifier-id
- num_views = integer-constant
-
- For example, the following declaration in a vertex shader
-
- layout (num_views=4) in;
-
- is used to specify that the program renders to 4 views.
-
- If num_views is less than 1 or greater than the maximum number of
- supported views, a compile-time error is generated.
- If the layout qualifier is declared multiple times and not all
- declarations specify the same number of views, a compile-time error
- is generated."
-
- Modify section 7.1 (Vertex Shader Special Variables)
-
- Add to the list of built-ins just after the entry for gl_InstanceID:
-
- " in highp uint gl_ViewID_OVR;"
-
- Add a description for gl_ViewID_OVR just after the paragraph for
- gl_InstanceID:
-
- "The variable gl_ViewID_OVR is a vertex shader input variable that
- holds the view id which designates the view which the current
- vertex is being processed for."
-
- Modify section 7.2 (Fragment Shader Special Variables)
-
- Add to the list of built-ins just after the entry for gl_InstanceID:
-
- " in highp uint gl_ViewID_OVR;"
-
- Add a description for gl_ViewID_OVR just after the paragraph for
- gl_PointCoord:
-
- "The variable gl_ViewID_OVR is a fragment shader input variable that
- holds the view id which designates the view which the current
- fragment is being processed for."
-
-Additions to Chapter 10 of the OpenGL ES 3.1 Specification
-(Vertex Specification and Drawing Commands)
-
- Modify section 10.5 (Drawing Commands Using Vertex Arrays), p. 254
-
- Append to the list of errors for the command DrawArraysIndirect:
-
- "* An INVALID_OPERATION if the number of views in the draw framebuffer
- is greater than 1."
-
- Append to the list of errors for the command DrawElementsIndirect:
-
- "* An INVALID_OPERATION if the number of views in the draw framebuffer
- is greater than 1."
-
-Additions to the AGL/EGL/GLX/WGL Specifications
-
- None
-
-Interactions with EXT_disjoint_timer_query
-
- An INVALID_OPERATION error is generated by any Draw* command and the Clear
- command if there is an active query object for target TIME_ELAPSED_EXT and
- the number of views in the draw framebuffer is greater than 1.
-
-Errors
-
- None
-
-Issues \ No newline at end of file
diff --git a/chromium/third_party/angle/extensions/ANGLE_multiview_multisample.txt b/chromium/third_party/angle/extensions/ANGLE_multiview_multisample.txt
index 0012ce41b42..6b3d4ab5682 100644
--- a/chromium/third_party/angle/extensions/ANGLE_multiview_multisample.txt
+++ b/chromium/third_party/angle/extensions/ANGLE_multiview_multisample.txt
@@ -29,7 +29,7 @@ Number
Dependencies
- OpenGL ES 3.0 and the extensions ANGLE_texture_multisample, ANGLE_multiview
+ OpenGL ES 3.0 and the extensions ANGLE_texture_multisample, OVR_multiview2
and OES_texture_storage_multisample_2d_array are required.
With OpenGL ES 3.1, only the extensions ANGLE_multiview and
@@ -63,7 +63,7 @@ Additions to Chapter 4 of the OpenGL ES 3.0 Specification
"* Layers of a two-dimensional multisample array texture which can be used
for multi-view rendering."
- Modify the error list of FramebufferTextureMultiviewLayeredANGLE:
+ Modify the error list of FramebufferTextureMultiviewOVR:
Change
diff --git a/chromium/third_party/angle/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt b/chromium/third_party/angle/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt
index 9ac9d4c59ff..ba102b22480 100644
--- a/chromium/third_party/angle/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt
+++ b/chromium/third_party/angle/extensions/EGL_ANGLE_d3d_texture_client_buffer.txt
@@ -10,6 +10,7 @@ Contributors
Geoff Lang
Olli Etuaho
+ Sunny Sachanandani
Contacts
@@ -90,8 +91,9 @@ Additions to Chapter 3 of the EGL 1.5 Specification (EGL Functions and Errors)
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB (support is optional),
DXGI_FORMAT_R8G8B8A8_TYPELESS (support is optional),
DXGI_FORMAT_B8G8R8A8_TYPELESS (support is optional),
- DXGI_FORMAT_R16G16B16A16_FLOAT or
- DXGI_FORMAT_R32G32B32A32_FLOAT.
+ DXGI_FORMAT_R16G16B16A16_FLOAT,
+ DXGI_FORMAT_R32G32B32A32_FLOAT or
+ DXGI_FORMAT_R10G10B10A2_UNORM.
--------------------------------------------------------------------------
Table egl.restrictions - Restrictions on D3D resources that can be used
as a <buffer>.
@@ -135,8 +137,10 @@ Issues
Revision History
+ Version 4, 2019/04/15 - added support for DXGI_FORMAT_R10G10B10A2_UNORM.
+
Version 3, 2018/01/23 - added support for typeless textures.
Version 2, 2018/01/15 - clarified SRGB conversion handling.
- Version 1, 2016/10/05 - first draft. \ No newline at end of file
+ Version 1, 2016/10/05 - first draft.
diff --git a/chromium/third_party/angle/extensions/EGL_ANGLE_iosurface_client_buffer.txt b/chromium/third_party/angle/extensions/EGL_ANGLE_iosurface_client_buffer.txt
index 692f721e82f..0ec5beae05f 100644
--- a/chromium/third_party/angle/extensions/EGL_ANGLE_iosurface_client_buffer.txt
+++ b/chromium/third_party/angle/extensions/EGL_ANGLE_iosurface_client_buffer.txt
@@ -10,6 +10,7 @@ Contributors
Corentin Wallez
Geoff Lang
+ James Darpinian
Contacts
@@ -20,8 +21,7 @@ Status
Draft
Version
-
- Version 1, Dec 6, 2017
+ Version 2, Apr 1, 2019
Number
@@ -108,11 +108,6 @@ Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors)
of the associcated IOSurface object are undefined while the pbuffer is
bound to a client texture."
- Append to the list of errors generated by eglMakeCurrent in Section 3.7.3:
- " - If either draw or read are pbuffers created with
- eglCreatePbufferFromClientBuffer with <buftype> set to EGL_IOSURFACE_ANGLE,
- an EGL_BAD_SURFACE is generated."
-
Issues
There are no issues, please move on.
@@ -120,3 +115,4 @@ Issues
Revision History
Version 1, 2017/12/06 - first draft.
+ Version 2, 2019/04/01 - Allow MakeCurrent.
diff --git a/chromium/third_party/angle/gni/angle.gni b/chromium/third_party/angle/gni/angle.gni
index 42d6c0466d7..9e76b75e319 100644
--- a/chromium/third_party/angle/gni/angle.gni
+++ b/chromium/third_party/angle/gni/angle.gni
@@ -84,6 +84,9 @@ declare_args() {
# Disallow non-conformant configurations in official builds.
angle_vulkan_conformant_configs_only = is_official_build
+
+ # Enable custom (cpu-side) secondary command buffers
+ angle_enable_custom_vulkan_cmd_buffers = true
}
}
diff --git a/chromium/third_party/angle/include/GLES2/gl2ext_angle.h b/chromium/third_party/angle/include/GLES2/gl2ext_angle.h
index e8c051978cc..d0cbaa425e2 100644
--- a/chromium/third_party/angle/include/GLES2/gl2ext_angle.h
+++ b/chromium/third_party/angle/include/GLES2/gl2ext_angle.h
@@ -595,26 +595,6 @@ GL_APICALL void GL_APIENTRY glGetQueryObjectui64vRobustANGLE(GLuint id, GLenum p
#define GL_PROGRAM_CACHE_ENABLED_ANGLE 0x93AC
#endif /* GL_ANGLE_program_cache_control */
-#ifndef GL_ANGLE_multiview
-#define GL_ANGLE_multiview 1
-// The next four enums coincide with the enums introduced by the GL_OVR_multiview extension and use the values reserved by that extension.
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE 0x9630
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE 0x9632
-#define GL_MAX_VIEWS_ANGLE 0x9631
-#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE 0x9633
-// The next four enums are reserved specifically for ANGLE.
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE 0x969B
-#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE 0x969C
-#define GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE 0x969D
-#define GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE 0x969E
-typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLEPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
-typedef void(GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLEPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint *viewportOffsets);
-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewLayeredANGLE(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
-GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewSideBySideANGLE(GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint *viewportOffsets);
-#endif
-#endif /* GL_ANGLE_multiview */
-
#ifndef GL_ANGLE_texture_rectangle
#define GL_ANGLE_texture_rectangle 1
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE 0x84F8
@@ -680,6 +660,15 @@ GL_APICALL void GL_APIENTRY glBindUniformLocationCHROMIUM(GLuint program, GLint
#endif
#endif /* GL_CHROMIUM_bind_uniform_location */
+/* GL_CHROMIUM_lose_context */
+#ifndef GL_CHROMIUM_lose_context
+#define GL_CHROMIUM_lose_context 1
+#ifdef GL_GLEXT_PROTOTYPES
+GL_APICALL void GL_APIENTRY glLoseContextCHROMIUM(GLenum current, GLenum other);
+#endif
+typedef void (GL_APIENTRYP PFNGLLOSECONTEXTCHROMIUMPROC) (GLenum current, GLenum other);
+#endif /* GL_CHROMIUM_lose_context */
+
// clang-format on
#endif // INCLUDE_GLES2_GL2EXT_ANGLE_H_
diff --git a/chromium/third_party/angle/include/GLES2/gl2ext_explicit_context_autogen.inc b/chromium/third_party/angle/include/GLES2/gl2ext_explicit_context_autogen.inc
index 8d4ca29379f..749224d58b0 100644
--- a/chromium/third_party/angle/include/GLES2/gl2ext_explicit_context_autogen.inc
+++ b/chromium/third_party/angle/include/GLES2/gl2ext_explicit_context_autogen.inc
@@ -155,11 +155,15 @@ typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTCONTEXTANGLEPROC)(GLeglCo
typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint array);
typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEMEMEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset);
+typedef void (GL_APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *memoryObjects);
typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLDEBUGPROCKHR callback, const void *userParam);
typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *fences);
+typedef void (GL_APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *memoryObjects);
typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLDELETESEMAPHORESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *semaphores);
typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, const GLuint *arrays);
typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments);
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
@@ -173,14 +177,17 @@ typedef void (GL_APIENTRYP PFNGLENDQUERYEXTCONTEXTANGLEPROC)(GLeglContext ctx, G
typedef void (GL_APIENTRYP PFNGLFINISHFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence);
typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level);
+typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
typedef void (GL_APIENTRYP PFNGLGENFENCESNVCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *fences);
typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *ids);
+typedef void (GL_APIENTRYP PFNGLGENSEMAPHORESEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *semaphores);
typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei n, GLuint *arrays);
typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, void **params);
typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence, GLenum pname, GLint *params);
typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATAINDEXEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, const GLchar *name);
typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTCONTEXTANGLEPROC)(GLeglContext ctx);
+typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memoryObject, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, void **params);
@@ -193,18 +200,26 @@ typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTCONTEXTANGLEPROC)(GLeglConte
typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, GLuint *params);
+typedef void (GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLenum pname, GLuint64 *params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, GLuint *params);
typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
+typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLubyte *data);
+typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLuint index, GLubyte *data);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYFDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memory, GLuint64 size, GLenum handleType, GLint fd);
+typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLenum handleType, GLint fd);
typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLsizei length, const GLchar *marker);
typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence);
+typedef GLboolean (GL_APIENTRYP PFNGLISMEMORYOBJECTEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memoryObject);
typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint id);
+typedef GLboolean (GL_APIENTRYP PFNGLISSEMAPHOREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore);
typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint array);
typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum access);
typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
typedef void (GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLuint count);
+typedef void (GL_APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint memoryObject, GLenum pname, const GLint *params);
typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRCONTEXTANGLEPROC)(GLeglContext ctx, const void *ptr, GLsizei length, const GLchar *label);
typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRCONTEXTANGLEPROC)(GLeglContext ctx);
@@ -217,7 +232,9 @@ typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTCONTEXTANGLEPROC)(GLeglContext ctx
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param);
typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLuint sampler, GLenum pname, const GLuint *param);
+typedef void (GL_APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLenum pname, const GLuint64 *params);
typedef void (GL_APIENTRYP PFNGLSETFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence, GLenum condition);
+typedef void (GL_APIENTRYP PFNGLSIGNALSEMAPHOREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts);
typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVCONTEXTANGLEPROC)(GLeglContext ctx, GLuint fence);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum pname, const GLuint *params);
@@ -225,9 +242,14 @@ typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTCONTEXTANGLEPROC)(GLeglContext ct
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEOESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset);
+typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset);
typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESCONTEXTANGLEPROC)(GLeglContext ctx, GLenum target);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLuint divisor);
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint index, GLuint divisor);
+typedef void (GL_APIENTRYP PFNGLWAITSEMAPHOREEXTCONTEXTANGLEPROC)(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts);
typedef void (GL_APIENTRYP PFNGLBINDUNIFORMLOCATIONCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLuint program, GLint location, const GLchar* name);
typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum components);
typedef void (GL_APIENTRYP PFNGLMATRIXLOADFCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum matrixMode, const GLfloat * matrix);
@@ -323,8 +345,6 @@ typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVROBUSTANGLECONTEXTANGLEPR
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params);
typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VROBUSTANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint64 * params);
-typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
-typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint * viewportOffsets);
typedef void (GL_APIENTRYP PFNGLCOPYTEXTURE3DANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
typedef void (GL_APIENTRYP PFNGLCOPYSUBTEXTURE3DANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLint z, GLint width, GLint height, GLint depth, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
@@ -337,6 +357,7 @@ typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC)
typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum pname, GLuint index, GLfloat * val);
typedef void (GL_APIENTRYP PFNGLSAMPLEMASKIANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLuint maskNumber, GLbitfield mask);
typedef void (GL_APIENTRYP PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC)(GLeglContext ctx, GLenum mode);
+typedef void (GL_APIENTRYP PFNGLLOSECONTEXTCHROMIUMCONTEXTANGLEPROC)(GLeglContext ctx, GLenum current, GLenum other);
#ifdef GL_GLEXT_PROTOTYPES
GL_APICALL void GL_APIENTRY glActiveTextureContextANGLE(GLeglContext ctx, GLenum texture);
GL_APICALL void GL_APIENTRY glAttachShaderContextANGLE(GLeglContext ctx, GLuint program, GLuint shader);
@@ -485,11 +506,15 @@ GL_APICALL void GL_APIENTRY glBindFragDataLocationEXTContextANGLE(GLeglContext c
GL_APICALL void GL_APIENTRY glBindFragDataLocationIndexedEXTContextANGLE(GLeglContext ctx, GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
GL_APICALL void GL_APIENTRY glBindVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array);
GL_APICALL void GL_APIENTRY glBlitFramebufferANGLEContextANGLE(GLeglContext ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GL_APICALL void GL_APIENTRY glBufferStorageMemEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset);
+GL_APICALL void GL_APIENTRY glCreateMemoryObjectsEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *memoryObjects);
GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHRContextANGLE(GLeglContext ctx, GLDEBUGPROCKHR callback, const void *userParam);
GL_APICALL void GL_APIENTRY glDebugMessageControlKHRContextANGLE(GLeglContext ctx, GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled);
GL_APICALL void GL_APIENTRY glDebugMessageInsertKHRContextANGLE(GLeglContext ctx, GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf);
GL_APICALL void GL_APIENTRY glDeleteFencesNVContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *fences);
+GL_APICALL void GL_APIENTRY glDeleteMemoryObjectsEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *memoryObjects);
GL_APICALL void GL_APIENTRY glDeleteQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *ids);
+GL_APICALL void GL_APIENTRY glDeleteSemaphoresEXTContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *semaphores);
GL_APICALL void GL_APIENTRY glDeleteVertexArraysOESContextANGLE(GLeglContext ctx, GLsizei n, const GLuint *arrays);
GL_APICALL void GL_APIENTRY glDiscardFramebufferEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei numAttachments, const GLenum *attachments);
GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLEContextANGLE(GLeglContext ctx, GLenum mode, GLint first, GLsizei count, GLsizei primcount);
@@ -503,14 +528,17 @@ GL_APICALL void GL_APIENTRY glEndQueryEXTContextANGLE(GLeglContext ctx, GLenum t
GL_APICALL void GL_APIENTRY glFinishFenceNVContextANGLE(GLeglContext ctx, GLuint fence);
GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXTContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length);
GL_APICALL void GL_APIENTRY glFramebufferTextureEXTContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level);
+GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewOVRContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
GL_APICALL void GL_APIENTRY glGenFencesNVContextANGLE(GLeglContext ctx, GLsizei n, GLuint *fences);
GL_APICALL void GL_APIENTRY glGenQueriesEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *ids);
+GL_APICALL void GL_APIENTRY glGenSemaphoresEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *semaphores);
GL_APICALL void GL_APIENTRY glGenVertexArraysOESContextANGLE(GLeglContext ctx, GLsizei n, GLuint *arrays);
GL_APICALL void GL_APIENTRY glGetBufferPointervOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, void **params);
GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHRContextANGLE(GLeglContext ctx, GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog);
GL_APICALL void GL_APIENTRY glGetFenceivNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum pname, GLint *params);
GL_APICALL GLint GL_APIENTRY glGetFragDataIndexEXTContextANGLE(GLeglContext ctx, GLuint program, const GLchar *name);
GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXTContextANGLE(GLeglContext ctx);
+GL_APICALL void GL_APIENTRY glGetMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx, GLuint memoryObject, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetObjectLabelKHRContextANGLE(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label);
GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHRContextANGLE(GLeglContext ctx, const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label);
GL_APICALL void GL_APIENTRY glGetPointervKHRContextANGLE(GLeglContext ctx, GLenum pname, void **params);
@@ -523,18 +551,26 @@ GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXTContextANGLE(GLeglContext ctx,
GL_APICALL void GL_APIENTRY glGetQueryivEXTContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetSamplerParameterIivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, GLuint *params);
+GL_APICALL void GL_APIENTRY glGetSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLenum pname, GLuint64 *params);
GL_APICALL void GL_APIENTRY glGetTexParameterIivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLint *params);
GL_APICALL void GL_APIENTRY glGetTexParameterIuivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, GLuint *params);
GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLEContextANGLE(GLeglContext ctx, GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *source);
+GL_APICALL void GL_APIENTRY glGetUnsignedBytevEXTContextANGLE(GLeglContext ctx, GLenum pname, GLubyte *data);
+GL_APICALL void GL_APIENTRY glGetUnsignedBytei_vEXTContextANGLE(GLeglContext ctx, GLenum target, GLuint index, GLubyte *data);
GL_APICALL void GL_APIENTRY glGetnUniformfvEXTContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetnUniformivEXTContextANGLE(GLeglContext ctx, GLuint program, GLint location, GLsizei bufSize, GLint *params);
+GL_APICALL void GL_APIENTRY glImportMemoryFdEXTContextANGLE(GLeglContext ctx, GLuint memory, GLuint64 size, GLenum handleType, GLint fd);
+GL_APICALL void GL_APIENTRY glImportSemaphoreFdEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLenum handleType, GLint fd);
GL_APICALL void GL_APIENTRY glInsertEventMarkerEXTContextANGLE(GLeglContext ctx, GLsizei length, const GLchar *marker);
GL_APICALL GLboolean GL_APIENTRY glIsFenceNVContextANGLE(GLeglContext ctx, GLuint fence);
+GL_APICALL GLboolean GL_APIENTRY glIsMemoryObjectEXTContextANGLE(GLeglContext ctx, GLuint memoryObject);
GL_APICALL GLboolean GL_APIENTRY glIsQueryEXTContextANGLE(GLeglContext ctx, GLuint id);
+GL_APICALL GLboolean GL_APIENTRY glIsSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore);
GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOESContextANGLE(GLeglContext ctx, GLuint array);
GL_APICALL void *GL_APIENTRY glMapBufferOESContextANGLE(GLeglContext ctx, GLenum target, GLenum access);
GL_APICALL void *GL_APIENTRY glMapBufferRangeEXTContextANGLE(GLeglContext ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHRContextANGLE(GLeglContext ctx, GLuint count);
+GL_APICALL void GL_APIENTRY glMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx, GLuint memoryObject, GLenum pname, const GLint *params);
GL_APICALL void GL_APIENTRY glObjectLabelKHRContextANGLE(GLeglContext ctx, GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
GL_APICALL void GL_APIENTRY glObjectPtrLabelKHRContextANGLE(GLeglContext ctx, const void *ptr, GLsizei length, const GLchar *label);
GL_APICALL void GL_APIENTRY glPopDebugGroupKHRContextANGLE(GLeglContext ctx);
@@ -547,7 +583,9 @@ GL_APICALL void GL_APIENTRY glReadnPixelsEXTContextANGLE(GLeglContext ctx, GLint
GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLEContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glSamplerParameterIivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLint *param);
GL_APICALL void GL_APIENTRY glSamplerParameterIuivOESContextANGLE(GLeglContext ctx, GLuint sampler, GLenum pname, const GLuint *param);
+GL_APICALL void GL_APIENTRY glSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLenum pname, const GLuint64 *params);
GL_APICALL void GL_APIENTRY glSetFenceNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum condition);
+GL_APICALL void GL_APIENTRY glSignalSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts);
GL_APICALL GLboolean GL_APIENTRY glTestFenceNVContextANGLE(GLeglContext ctx, GLuint fence);
GL_APICALL void GL_APIENTRY glTexParameterIivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLint *params);
GL_APICALL void GL_APIENTRY glTexParameterIuivOESContextANGLE(GLeglContext ctx, GLenum target, GLenum pname, const GLuint *params);
@@ -555,9 +593,14 @@ GL_APICALL void GL_APIENTRY glTexStorage1DEXTContextANGLE(GLeglContext ctx, GLen
GL_APICALL void GL_APIENTRY glTexStorage2DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
GL_APICALL void GL_APIENTRY glTexStorage3DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
GL_APICALL void GL_APIENTRY glTexStorage3DMultisampleOESContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+GL_APICALL void GL_APIENTRY glTexStorageMem2DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset);
+GL_APICALL void GL_APIENTRY glTexStorageMem2DMultisampleEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset);
+GL_APICALL void GL_APIENTRY glTexStorageMem3DEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset);
+GL_APICALL void GL_APIENTRY glTexStorageMem3DMultisampleEXTContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset);
GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOESContextANGLE(GLeglContext ctx, GLenum target);
GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLEContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor);
GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXTContextANGLE(GLeglContext ctx, GLuint index, GLuint divisor);
+GL_APICALL void GL_APIENTRY glWaitSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts);
GL_APICALL void GL_APIENTRY glBindUniformLocationCHROMIUMContextANGLE(GLeglContext ctx, GLuint program, GLint location, const GLchar* name);
GL_APICALL void GL_APIENTRY glCoverageModulationCHROMIUMContextANGLE(GLeglContext ctx, GLenum components);
GL_APICALL void GL_APIENTRY glMatrixLoadfCHROMIUMContextANGLE(GLeglContext ctx, GLenum matrixMode, const GLfloat * matrix);
@@ -653,8 +696,6 @@ GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivRobustANGLEContextANGLE(GLe
GL_APICALL void GL_APIENTRY glGetQueryObjectivRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint * params);
GL_APICALL void GL_APIENTRY glGetQueryObjecti64vRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLint64 * params);
GL_APICALL void GL_APIENTRY glGetQueryObjectui64vRobustANGLEContextANGLE(GLeglContext ctx, GLuint id, GLenum pname, GLsizei bufSize, GLsizei * length, GLuint64 * params);
-GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewLayeredANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews);
-GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewSideBySideANGLEContextANGLE(GLeglContext ctx, GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei numViews, const GLint * viewportOffsets);
GL_APICALL void GL_APIENTRY glCopyTexture3DANGLEContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint internalFormat, GLenum destType, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
GL_APICALL void GL_APIENTRY glCopySubTexture3DANGLEContextANGLE(GLeglContext ctx, GLuint sourceId, GLint sourceLevel, GLenum destTarget, GLuint destId, GLint destLevel, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLint z, GLint width, GLint height, GLint depth, GLboolean unpackFlipY, GLboolean unpackPremultiplyAlpha, GLboolean unpackUnmultiplyAlpha);
GL_APICALL void GL_APIENTRY glTexStorage2DMultisampleANGLEContextANGLE(GLeglContext ctx, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
@@ -667,4 +708,5 @@ GL_APICALL void GL_APIENTRY glMultiDrawElementsInstancedANGLEContextANGLE(GLeglC
GL_APICALL void GL_APIENTRY glGetMultisamplefvANGLEContextANGLE(GLeglContext ctx, GLenum pname, GLuint index, GLfloat * val);
GL_APICALL void GL_APIENTRY glSampleMaskiANGLEContextANGLE(GLeglContext ctx, GLuint maskNumber, GLbitfield mask);
GL_APICALL void GL_APIENTRY glProvokingVertexANGLEContextANGLE(GLeglContext ctx, GLenum mode);
+GL_APICALL void GL_APIENTRY glLoseContextCHROMIUMContextANGLE(GLeglContext ctx, GLenum current, GLenum other);
#endif
diff --git a/chromium/third_party/angle/include/GLSLANG/ShaderLang.h b/chromium/third_party/angle/include/GLSLANG/ShaderLang.h
index 6267ecf7591..c804715d27f 100644
--- a/chromium/third_party/angle/include/GLSLANG/ShaderLang.h
+++ b/chromium/third_party/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 205
+#define ANGLE_SH_VERSION 206
enum ShShaderSpec
{
@@ -274,6 +274,13 @@ const ShCompileOptions SH_EMULATE_GL_DRAW_ID = UINT64_C(1) << 40;
// another webpage/application.
const ShCompileOptions SH_INIT_SHARED_VARIABLES = UINT64_C(1) << 41;
+// Forces the value returned from an atomic operations to be always be resolved. This is targeted to
+// workaround a bug in NVIDIA D3D driver where the return value from
+// RWByteAddressBuffer.InterlockedAdd does not get resolved when used in the .yzw components of a
+// RWByteAddressBuffer.Store operation. Only has an effect on HLSL translation.
+// http://anglebug.com/3246
+const ShCompileOptions SH_FORCE_ATOMIC_VALUE_RESOLUTION = UINT64_C(1) << 42;
+
// Defines alternate strategies for implementing array index clamping.
enum ShArrayIndexClampingStrategy
{
@@ -319,7 +326,7 @@ struct ShBuiltInResources
int EXT_shader_framebuffer_fetch;
int NV_shader_framebuffer_fetch;
int ARM_shader_framebuffer_fetch;
- int OVR_multiview;
+ int OVR_multiview2;
int EXT_YUV_target;
int EXT_geometry_shader;
int OES_texture_storage_multisample_2d_array;
diff --git a/chromium/third_party/angle/include/platform/FeaturesVk.h b/chromium/third_party/angle/include/platform/FeaturesVk.h
index 4b09d8f1f95..92698eac167 100644
--- a/chromium/third_party/angle/include/platform/FeaturesVk.h
+++ b/chromium/third_party/angle/include/platform/FeaturesVk.h
@@ -69,8 +69,20 @@ struct FeaturesVk
// extension, on which the EGL_ANDROID_image_native_buffer extension can be layered.
bool supportsAndroidHardwareBuffer = false;
+ // Whether the VkDevice supports the VK_KHR_external_memory_fd
+ // extension, on which the GL_EXT_memory_object_fd extension can be layered.
+ bool supportsExternalMemoryFd = false;
+
+ // Whether the VkDevice supports the VK_KHR_external_semaphore_fd
+ // extension, on which the GL_EXT_semaphore_fd extension can be layered.
+ bool supportsExternalSemaphoreFd = false;
+
// VK_PRESENT_MODE_FIFO_KHR causes random timeouts on Linux Intel. http://anglebug.com/3153
bool disableFifoPresentMode = false;
+
+ // On Qualcomm, a bug is preventing us from using loadOp=Clear with inline commands in the
+ // render pass. http://anglebug.com/2361
+ bool restartRenderPassAfterLoadOpClear = false;
};
inline FeaturesVk::FeaturesVk() = default;
diff --git a/chromium/third_party/angle/include/platform/WorkaroundsD3D.h b/chromium/third_party/angle/include/platform/WorkaroundsD3D.h
index 7145b0c8622..62fec72fcb9 100644
--- a/chromium/third_party/angle/include/platform/WorkaroundsD3D.h
+++ b/chromium/third_party/angle/include/platform/WorkaroundsD3D.h
@@ -87,6 +87,8 @@ struct WorkaroundsD3D
// In Intel driver, the data with format DXGI_FORMAT_B5G6R5_UNORM will be parsed incorrectly.
// This workaroud will disable B5G6R5 support when it's Intel driver. By default, it will use
// R8G8B8A8 format. This bug is fixed in version 4539 on Intel drivers.
+ // On older AMD drivers, the data in DXGI_FORMAT_B5G6R5_UNORM becomes corrupted for unknown
+ // reasons.
bool disableB5G6R5Support = false;
// On some Intel drivers, evaluating unary minus operator on integer may get wrong answer in
@@ -131,6 +133,13 @@ struct WorkaroundsD3D
// This is targeted to work around a bug in NVIDIA D3D driver version 388.59 where in very
// specific cases the driver would not handle constant register zero correctly.
bool skipVSConstantRegisterZero = false;
+
+ // Forces the value returned from an atomic operations to be always be resolved. This is
+ // targeted to workaround a bug in NVIDIA D3D driver where the return value from
+ // RWByteAddressBuffer.InterlockedAdd does not get resolved when used in the .yzw components of
+ // a RWByteAddressBuffer.Store operation. Only has an effect on HLSL translation.
+ // http://anglebug.com/3246
+ bool forceAtomicValueResolution = false;
};
inline WorkaroundsD3D::WorkaroundsD3D() = default;
diff --git a/chromium/third_party/angle/infra/ANGLEWrangling.md b/chromium/third_party/angle/infra/ANGLEWrangling.md
index 3897cafd312..fec5d75ee68 100644
--- a/chromium/third_party/angle/infra/ANGLEWrangling.md
+++ b/chromium/third_party/angle/infra/ANGLEWrangling.md
@@ -2,48 +2,51 @@
As an ANGLE Sheriff. Your job is to:
- 1. Keep the [ANGLE Try Waterfall](https://ci.chromium.org/p/chromium/g/angle.try/builders) in good working order.
- 1. Monitor the [Chromium GPU FYI Waterfall](https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console) and respond to ANGLE bugs.
- 1. Control and monitor the [ANGLE auto-roller](https://autoroll.skia.org/r/angle-chromium-autoroll).
+ 1. Keep the [ANGLE Try Waterfall](https://ci.chromium.org/p/chromium/g/angle.try/builders) in good
+ working order.
+ 1. Monitor the
+ [Chromium GPU FYI Waterfall](https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console)
+ and respond to ANGLE bugs.
+ 1. Control and monitor the [ANGLE auto-rollers](#task-3_the-auto_rollers).
1. Keep the [ANGLE Standalone Testers](README.md) in good working order.
-If you're not an ANGLE team member, you can contact us on the public ANGLE project [Google group](https://groups.google.com/forum/#!forum/angleproject).
+If you're not an ANGLE team member, you can contact us on the public ANGLE project
+[Google group](https://groups.google.com/forum/#!forum/angleproject).
## Task 1: The Try Waterfall
Your first job is to keep the
-[ANGLE Try Waterfall](https://ci.chromium.org/p/chromium/g/angle.try/builders) healthy.
-Some failures are expected on this waterfall. Developers might be testing
-expectedly buggy code. But persistent flakiness and failures should be
-reported and reverted.
+[ANGLE Try Waterfall](https://ci.chromium.org/p/chromium/g/angle.try/builders) healthy. Some
+failures are expected on this waterfall. Developers might be testing expectedly buggy code. But
+persistent flakiness and failures should be reported and reverted.
When encoutering an unexpected failure in your CLs please
-[file an ANGLE bug](http://anglebug.com/new) and cc the current ANGLE wrangler. If the
-failure is unrelated to ANGLE [file a Chromium bug](http://crbug.com/new) and
-mark the bug as `Hotlist-PixelWrangler`. Refer to
-[build.chromium.org](https://ci.chromium.org/p/chromium/g/main/console) to
-find the current ANGLE wrangler and GPU Pixel Wrangler.
+[file an ANGLE bug](http://anglebug.com/new) and cc the current ANGLE wrangler. If the failure is
+unrelated to ANGLE [file a Chromium bug](http://crbug.com/new) and mark the bug as
+`Hotlist-PixelWrangler`. Refer to
+[build.chromium.org](https://ci.chromium.org/p/chromium/g/main/console) to find the current ANGLE
+wrangler and GPU Pixel Wrangler.
**NOTE: When all builds seem to be purple or otherwise broken:**
-This could be a major infrastructure outage. File a high-priority bug using [g.co/bugatrooper](http://g.co/bugatrooper).
+This could be a major infrastructure outage. File a high-priority bug using
+[g.co/bugatrooper](http://g.co/bugatrooper).
## Task 2: Respond to Bugs
-ANGLE bugs sometimes make it past the commit queue testing and into the master
-branch. This can be because of flaky tests or because the failures are
-specific to system configurations for which we lack full pre-commit testing
-support.
+ANGLE bugs sometimes make it past the commit queue testing and into the master branch. This can be
+because of flaky tests or because the failures are specific to system configurations for which we
+lack full pre-commit testing support.
The [Chromium GPU FYI Waterfall](https://ci.chromium.org/p/chromium/g/chromium.gpu.fyi/console)
-waterfall includes a number of these one-off specialized configurations.
-Monitor this console for persistent breakage that could be related to ANGLE.
-Also follow the `Internals>GPU>ANGLE` component on the Chromium issue tracker
-to be alerted to reports of breakage on the GPU.FYI waterfall. Googlers can use [sheriff-o-matic](https://sheriff-o-matic.appspot.com/chromium.gpu.fyi) to monitor the health of the GPU.FYI waterfall.
+waterfall includes a number of these one-off specialized configurations. Monitor this console for
+persistent breakage that could be related to ANGLE. Also follow the `Internals>GPU>ANGLE` component
+on the Chromium issue tracker to be alerted to reports of breakage on the GPU.FYI waterfall.
+Googlers can use [sheriff-o-matic](https://sheriff-o-matic.appspot.com/chromium.gpu.fyi) to monitor
+the health of the GPU.FYI waterfall.
-Note that the GPU Pixel Wrangler is responsible for the *Chromium* bugs.
-Please file issues with the tag `Hotlist-PixelWrangler` for bugs that aren't
-caused by ANGLE regressions.
+Note that the GPU Pixel Wrangler is responsible for the *Chromium* bugs. Please file issues with
+the tag `Hotlist-PixelWrangler` for bugs that aren't caused by ANGLE regressions.
*IMPORTANT*: Info to include in bug reports:
@@ -59,14 +62,26 @@ caused by ANGLE regressions.
1. Open the first failing and last passing builds.
1. For test failures: record `parent_got_angle_revision` in both builds.
1. For compile failures record `got_angle_revision`.
- 1. Use this URL: https://chromium.googlesource.com/angle/angle.git/+log/<last good revision>..<first bad revision>
+ 1. Use this URL:
+ `https://chromium.googlesource.com/angle/angle.git/+log/<last passing revision>..<first failing revision>`
-## Task 3: The Auto-Roller
+## Task 3: The Auto-Rollers
-The [ANGLE auto-roller](https://autoroll.skia.org/r/angle-chromium-autoroll) automatically updates Chrome with the latest ANGLE changes.
+The [ANGLE auto-roller](https://autoroll.skia.org/r/angle-chromium-autoroll) automatically updates
+Chrome with the latest ANGLE changes.
- 1. You will be cc'ed on ANGLE rolls. Please check failed rolls to verify there is no blocking breakage.
- 1. You are also responsible for pausing the roller 24h before branch days, and resuming afterwards. See the [Chrome Release Schedule](https://chromiumdash.appspot.com/schedule).
+ 1. **Roller health**: You will be cc'ed on all rolls. Please check failed rolls to verify there is no blocking
+ breakage.
+ 1. **Chrome Branching**: You are responsible for pausing the roller 24h before branch days, and resuming afterwards.
+ See the [Chrome Release Schedule](https://chromiumdash.appspot.com/schedule).
+
+We also use additional auto-rollers to roll third party libraries into ANGLE once per day:
+
+ * [SPIRV-Headers into ANGLE](https://autoroll.skia.org/r/spirv-headers-angle-autoroll),
+ * [SPIRV-Tools into ANGLE](https://autoroll.skia.org/r/spirv-tools-angle-autoroll) and
+ * [glslang into ANGLE](https://autoroll.skia.org/r/glslang-angle-autoroll)
+
+Please ensure these rollers are also healthy and unblocked.
## Task 4: ANGLE Standalone Testing
diff --git a/chromium/third_party/angle/infra/config/global/commit-queue.cfg b/chromium/third_party/angle/infra/config/global/commit-queue.cfg
index 68f93cb220c..5bef04bba2d 100644
--- a/chromium/third_party/angle/infra/config/global/commit-queue.cfg
+++ b/chromium/third_party/angle/infra/config/global/commit-queue.cfg
@@ -35,6 +35,10 @@ config_groups {
name: "angle/try/mac-rel"
}
builders {
+ name: "angle/try/presubmit"
+ disable_reuse: true
+ }
+ builders {
name: "angle/try/win-clang-x64-dbg"
}
builders {
@@ -86,10 +90,10 @@ config_groups {
name: "chromium/try/linux_angle_ozone_rel_ng"
}
builders {
- name: "chromium/try/linux_angle_rel_ng"
+ name: "chromium/try/linux-angle-rel"
}
builders {
- name: "chromium/try/mac_angle_rel_ng"
+ name: "chromium/try/mac-angle-rel"
}
builders {
name: "chromium/try/win-angle-rel"
diff --git a/chromium/third_party/angle/infra/config/global/cr-buildbucket.cfg b/chromium/third_party/angle/infra/config/global/cr-buildbucket.cfg
index b2bfd6c0c50..4378cf11a28 100644
--- a/chromium/third_party/angle/infra/config/global/cr-buildbucket.cfg
+++ b/chromium/third_party/angle/infra/config/global/cr-buildbucket.cfg
@@ -249,6 +249,16 @@ buckets {
}
builders {
+ name: "presubmit"
+ dimensions: "os:Ubuntu-14.04"
+ recipe {
+ name: "run_presubmit"
+ properties: "repo_name:angle"
+ properties_j: "runhooks:true"
+ }
+ }
+
+ builders {
name: "linux-clang-dbg"
mixins: "linux"
mixins: "clang"
diff --git a/chromium/third_party/angle/infra/config/global/luci-milo.cfg b/chromium/third_party/angle/infra/config/global/luci-milo.cfg
index 0a40e9bb0be..32be53a795d 100644
--- a/chromium/third_party/angle/infra/config/global/luci-milo.cfg
+++ b/chromium/third_party/angle/infra/config/global/luci-milo.cfg
@@ -90,6 +90,9 @@ consoles {
manifest_name: "PATCHED"
builders {
+ name: "buildbucket/luci.angle.try/presubmit"
+ }
+ builders {
name: "buildbucket/luci.angle.try/linux-clang-dbg"
category: "linux|clang"
short_name: "dbg"
diff --git a/chromium/third_party/angle/samples/multiview/Multiview.cpp b/chromium/third_party/angle/samples/multiview/Multiview.cpp
index ec6a02153b8..fd5e30ecbd4 100644
--- a/chromium/third_party/angle/samples/multiview/Multiview.cpp
+++ b/chromium/third_party/angle/samples/multiview/Multiview.cpp
@@ -3,7 +3,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// This sample shows basic usage of the GL_ANGLE_multiview extension.
+// This sample shows basic usage of the GL_OVR_multiview2 extension.
#include "SampleApplication.h"
@@ -64,13 +64,13 @@ class MultiviewSample : public SampleApplication
bool initialize() override
{
- // Check whether the GL_ANGLE_multiview extension is supported. If not, abort
+ // Check whether the GL_OVR_multiview2 extension is supported. If not, abort
// initialization.
const char *allExtensions = reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS));
const std::string paddedExtensions = std::string(" ") + allExtensions + std::string(" ");
- if (paddedExtensions.find(std::string(" GL_ANGLE_multiview ")) == std::string::npos)
+ if (paddedExtensions.find(std::string(" GL_OVR_multiview2 ")) == std::string::npos)
{
- std::cout << "GL_ANGLE_multiview is not available." << std::endl;
+ std::cout << "GL_OVR_multiview2 is not available." << std::endl;
return false;
}
@@ -94,10 +94,10 @@ class MultiviewSample : public SampleApplication
// Generate multiview framebuffer for layered rendering.
glGenFramebuffers(1, &mMultiviewFBO);
glBindFramebuffer(GL_FRAMEBUFFER, mMultiviewFBO);
- glFramebufferTextureMultiviewLayeredANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
- mColorTexture, 0, 0, 2);
- glFramebufferTextureMultiviewLayeredANGLE(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
- mDepthTexture, 0, 0, 2);
+ glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mColorTexture, 0, 0,
+ 2);
+ glFramebufferTextureMultiviewOVR(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, mDepthTexture, 0, 0,
+ 2);
GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
glDrawBuffers(1, &drawBuffer);
@@ -113,7 +113,7 @@ class MultiviewSample : public SampleApplication
// use.
constexpr char kMultiviewVS[] =
"#version 300 es\n"
- "#extension GL_OVR_multiview : require\n"
+ "#extension GL_OVR_multiview2 : require\n"
"layout(num_views = 2) in;\n"
"layout(location=0) in vec3 posIn;\n"
"layout(location=1) in vec3 normalIn;\n"
@@ -136,7 +136,7 @@ class MultiviewSample : public SampleApplication
constexpr char kMultiviewFS[] =
"#version 300 es\n"
- "#extension GL_OVR_multiview : require\n"
+ "#extension GL_OVR_multiview2 : require\n"
"precision mediump float;\n"
"out vec4 color;\n"
"in vec3 oNormal;\n"
diff --git a/chromium/third_party/angle/samples/sample_util/SampleApplication.cpp b/chromium/third_party/angle/samples/sample_util/SampleApplication.cpp
index 68c1db26052..507e5d73e8c 100644
--- a/chromium/third_party/angle/samples/sample_util/SampleApplication.cpp
+++ b/chromium/third_party/angle/samples/sample_util/SampleApplication.cpp
@@ -70,16 +70,6 @@ SampleApplication::SampleApplication(std::string name,
EGLPlatformParameters(requestedRenderer));
mTimer.reset(CreateTimer());
mOSWindow = OSWindow::New();
-
- mEGLWindow->setConfigRedBits(8);
- mEGLWindow->setConfigGreenBits(8);
- mEGLWindow->setConfigBlueBits(8);
- mEGLWindow->setConfigAlphaBits(8);
- mEGLWindow->setConfigDepthBits(24);
- mEGLWindow->setConfigStencilBits(8);
-
- // Disable vsync
- mEGLWindow->setSwapInterval(0);
}
SampleApplication::~SampleApplication()
@@ -138,7 +128,18 @@ int SampleApplication::run()
mOSWindow->setVisible(true);
- if (!mEGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get()))
+ ConfigParameters configParams;
+ configParams.redBits = 8;
+ configParams.greenBits = 8;
+ configParams.blueBits = 8;
+ configParams.alphaBits = 8;
+ configParams.depthBits = 24;
+ configParams.stencilBits = 8;
+
+ // Disable vsync
+ configParams.swapInterval = 0;
+
+ if (!mEGLWindow->initializeGL(mOSWindow, mEntryPointsLib.get(), configParams))
{
return -1;
}
diff --git a/chromium/third_party/angle/samples/shader_translator/shader_translator.cpp b/chromium/third_party/angle/samples/shader_translator/shader_translator.cpp
index ce6b6cb0340..a5528122968 100644
--- a/chromium/third_party/angle/samples/shader_translator/shader_translator.cpp
+++ b/chromium/third_party/angle/samples/shader_translator/shader_translator.cpp
@@ -51,19 +51,19 @@ void GenerateResources(ShBuiltInResources *resources)
{
sh::InitBuiltInResources(resources);
- resources->MaxVertexAttribs = 8;
- resources->MaxVertexUniformVectors = 128;
- resources->MaxVaryingVectors = 8;
- resources->MaxVertexTextureImageUnits = 0;
+ resources->MaxVertexAttribs = 8;
+ resources->MaxVertexUniformVectors = 128;
+ resources->MaxVaryingVectors = 8;
+ resources->MaxVertexTextureImageUnits = 0;
resources->MaxCombinedTextureImageUnits = 8;
- resources->MaxTextureImageUnits = 8;
- resources->MaxFragmentUniformVectors = 16;
- resources->MaxDrawBuffers = 1;
+ resources->MaxTextureImageUnits = 8;
+ resources->MaxFragmentUniformVectors = 16;
+ resources->MaxDrawBuffers = 1;
resources->MaxDualSourceDrawBuffers = 1;
- resources->OES_standard_derivatives = 0;
- resources->OES_EGL_image_external = 0;
- resources->EXT_geometry_shader = 1;
+ resources->OES_standard_derivatives = 0;
+ resources->OES_EGL_image_external = 0;
+ resources->EXT_geometry_shader = 1;
resources->ANGLE_texture_multisample = 0;
}
@@ -72,13 +72,13 @@ int main(int argc, char *argv[])
TFailCode failCode = ESuccess;
ShCompileOptions compileOptions = 0;
- int numCompiles = 0;
- ShHandle vertexCompiler = 0;
- ShHandle fragmentCompiler = 0;
- ShHandle computeCompiler = 0;
+ int numCompiles = 0;
+ ShHandle vertexCompiler = 0;
+ ShHandle fragmentCompiler = 0;
+ ShHandle computeCompiler = 0;
ShHandle geometryCompiler = 0;
- ShShaderSpec spec = SH_GLES2_SPEC;
- ShShaderOutput output = SH_ESSL_OUTPUT;
+ ShShaderSpec spec = SH_GLES2_SPEC;
+ ShShaderOutput output = SH_ESSL_OUTPUT;
sh::Initialize();
@@ -93,99 +93,107 @@ int main(int argc, char *argv[])
{
switch (argv[0][1])
{
- case 'i': compileOptions |= SH_INTERMEDIATE_TREE; break;
- case 'o': compileOptions |= SH_OBJECT_CODE; break;
- case 'u': compileOptions |= SH_VARIABLES; break;
- case 'p': resources.WEBGL_debug_shader_precision = 1; break;
- case 's':
- if (argv[0][2] == '=')
- {
- switch (argv[0][3])
+ case 'i':
+ compileOptions |= SH_INTERMEDIATE_TREE;
+ break;
+ case 'o':
+ compileOptions |= SH_OBJECT_CODE;
+ break;
+ case 'u':
+ compileOptions |= SH_VARIABLES;
+ break;
+ case 'p':
+ resources.WEBGL_debug_shader_precision = 1;
+ break;
+ case 's':
+ if (argv[0][2] == '=')
{
- case 'e':
- if (argv[0][4] == '3')
- {
- if (argv[0][5] == '1')
+ switch (argv[0][3])
+ {
+ case 'e':
+ if (argv[0][4] == '3')
{
- spec = SH_GLES3_1_SPEC;
+ if (argv[0][5] == '1')
+ {
+ spec = SH_GLES3_1_SPEC;
+ }
+ else
+ {
+ spec = SH_GLES3_SPEC;
+ }
}
else
{
- spec = SH_GLES3_SPEC;
+ spec = SH_GLES2_SPEC;
+ }
+ break;
+ case 'w':
+ if (argv[0][4] == '3')
+ {
+ spec = SH_WEBGL3_SPEC;
+ }
+ else if (argv[0][4] == '2')
+ {
+ spec = SH_WEBGL2_SPEC;
+ }
+ else if (argv[0][4] == 'n')
+ {
+ spec = SH_WEBGL_SPEC;
}
- }
- else
- {
- spec = SH_GLES2_SPEC;
- }
- break;
- case 'w':
- if (argv[0][4] == '3')
- {
- spec = SH_WEBGL3_SPEC;
- }
- else if (argv[0][4] == '2')
- {
- spec = SH_WEBGL2_SPEC;
- }
- else if (argv[0][4] == 'n')
- {
- spec = SH_WEBGL_SPEC;
- }
- else
- {
- spec = SH_WEBGL_SPEC;
- resources.FragmentPrecisionHigh = 1;
- }
- break;
- default:
- failCode = EFailUsage;
+ else
+ {
+ spec = SH_WEBGL_SPEC;
+ resources.FragmentPrecisionHigh = 1;
+ }
+ break;
+ default:
+ failCode = EFailUsage;
+ }
}
- }
- else
- {
- failCode = EFailUsage;
- }
- break;
- case 'b':
- if (argv[0][2] == '=')
- {
- switch (argv[0][3])
+ else
+ {
+ failCode = EFailUsage;
+ }
+ break;
+ case 'b':
+ if (argv[0][2] == '=')
{
- case 'e':
- output = SH_ESSL_OUTPUT;
- compileOptions |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
- break;
- case 'g':
- if (!ParseGLSLOutputVersion(&argv[0][sizeof("-b=g") - 1], &output))
- {
+ switch (argv[0][3])
+ {
+ case 'e':
+ output = SH_ESSL_OUTPUT;
+ compileOptions |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
+ break;
+ case 'g':
+ if (!ParseGLSLOutputVersion(&argv[0][sizeof("-b=g") - 1], &output))
+ {
+ failCode = EFailUsage;
+ }
+ compileOptions |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
+ break;
+ case 'h':
+ if (argv[0][4] == '1' && argv[0][5] == '1')
+ {
+ output = SH_HLSL_4_1_OUTPUT;
+ }
+ else
+ {
+ output = SH_HLSL_3_0_OUTPUT;
+ }
+ break;
+ default:
failCode = EFailUsage;
- }
- compileOptions |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
- break;
- case 'h':
- if (argv[0][4] == '1' && argv[0][5] == '1')
- {
- output = SH_HLSL_4_1_OUTPUT;
- }
- else
- {
- output = SH_HLSL_3_0_OUTPUT;
- }
- break;
- default:
- failCode = EFailUsage;
+ }
}
- }
- else
- {
- failCode = EFailUsage;
- }
- break;
- case 'x':
- if (argv[0][2] == '=')
- {
- // clang-format off
+ else
+ {
+ failCode = EFailUsage;
+ }
+ break;
+ case 'x':
+ if (argv[0][2] == '=')
+ {
+ // clang-format off
switch (argv[0][3])
{
case 'i': resources.OES_EGL_image_external = 1; break;
@@ -219,67 +227,69 @@ int main(int argc, char *argv[])
case 'n': resources.NV_shader_framebuffer_fetch = 1; break;
case 'a': resources.ARM_shader_framebuffer_fetch = 1; break;
case 'm':
- resources.OVR_multiview = 1;
+ resources.OVR_multiview2 = 1;
compileOptions |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW;
compileOptions |= SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER;
break;
case 'y': resources.EXT_YUV_target = 1; break;
default: failCode = EFailUsage;
}
- // clang-format on
- }
- else
- {
+ // clang-format on
+ }
+ else
+ {
+ failCode = EFailUsage;
+ }
+ break;
+ default:
failCode = EFailUsage;
- }
- break;
- default: failCode = EFailUsage;
}
}
else
{
if (spec != SH_GLES2_SPEC && spec != SH_WEBGL_SPEC)
{
- resources.MaxDrawBuffers = 8;
+ resources.MaxDrawBuffers = 8;
resources.MaxVertexTextureImageUnits = 16;
resources.MaxTextureImageUnits = 16;
}
ShHandle compiler = 0;
switch (FindShaderType(argv[0]))
{
- case GL_VERTEX_SHADER:
- if (vertexCompiler == 0)
- {
- vertexCompiler =
- sh::ConstructCompiler(GL_VERTEX_SHADER, spec, output, &resources);
- }
- compiler = vertexCompiler;
- break;
- case GL_FRAGMENT_SHADER:
- if (fragmentCompiler == 0)
- {
- fragmentCompiler =
- sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources);
- }
- compiler = fragmentCompiler;
- break;
- case GL_COMPUTE_SHADER:
- if (computeCompiler == 0)
- {
- computeCompiler =
- sh::ConstructCompiler(GL_COMPUTE_SHADER, spec, output, &resources);
- }
- compiler = computeCompiler;
- break;
- case GL_GEOMETRY_SHADER_EXT:
- if (geometryCompiler == 0)
- {
- geometryCompiler =
- sh::ConstructCompiler(GL_GEOMETRY_SHADER_EXT, spec, output, &resources);
- }
- compiler = geometryCompiler;
- break;
- default: break;
+ case GL_VERTEX_SHADER:
+ if (vertexCompiler == 0)
+ {
+ vertexCompiler =
+ sh::ConstructCompiler(GL_VERTEX_SHADER, spec, output, &resources);
+ }
+ compiler = vertexCompiler;
+ break;
+ case GL_FRAGMENT_SHADER:
+ if (fragmentCompiler == 0)
+ {
+ fragmentCompiler =
+ sh::ConstructCompiler(GL_FRAGMENT_SHADER, spec, output, &resources);
+ }
+ compiler = fragmentCompiler;
+ break;
+ case GL_COMPUTE_SHADER:
+ if (computeCompiler == 0)
+ {
+ computeCompiler =
+ sh::ConstructCompiler(GL_COMPUTE_SHADER, spec, output, &resources);
+ }
+ compiler = computeCompiler;
+ break;
+ case GL_GEOMETRY_SHADER_EXT:
+ if (geometryCompiler == 0)
+ {
+ geometryCompiler =
+ sh::ConstructCompiler(GL_GEOMETRY_SHADER_EXT, spec, output, &resources);
+ }
+ compiler = geometryCompiler;
+ break;
+ default:
+ break;
}
if (compiler)
{
@@ -318,7 +328,7 @@ int main(int argc, char *argv[])
printf("\n\n");
}
if (!compiled)
- failCode = EFailCompile;
+ failCode = EFailCompile;
++numCompiles;
}
else
@@ -402,7 +412,8 @@ sh::GLenum FindShaderType(const char *fileName)
const char *ext = strrchr(fileName, '.');
if (ext && strcmp(ext, ".sl") == 0)
- for (; ext > fileName && ext[0] != '.'; ext--);
+ for (; ext > fileName && ext[0] != '.'; ext--)
+ ;
ext = strrchr(fileName, '.');
if (ext)
@@ -445,131 +456,187 @@ void PrintVariable(const std::string &prefix, size_t index, const sh::ShaderVari
std::string typeName;
switch (var.type)
{
- case GL_FLOAT: typeName = "GL_FLOAT"; break;
- case GL_FLOAT_VEC2: typeName = "GL_FLOAT_VEC2"; break;
- case GL_FLOAT_VEC3: typeName = "GL_FLOAT_VEC3"; break;
- case GL_FLOAT_VEC4: typeName = "GL_FLOAT_VEC4"; break;
- case GL_INT: typeName = "GL_INT"; break;
- case GL_INT_VEC2: typeName = "GL_INT_VEC2"; break;
- case GL_INT_VEC3: typeName = "GL_INT_VEC3"; break;
- case GL_INT_VEC4: typeName = "GL_INT_VEC4"; break;
- case GL_UNSIGNED_INT: typeName = "GL_UNSIGNED_INT"; break;
- case GL_UNSIGNED_INT_VEC2: typeName = "GL_UNSIGNED_INT_VEC2"; break;
- case GL_UNSIGNED_INT_VEC3: typeName = "GL_UNSIGNED_INT_VEC3"; break;
- case GL_UNSIGNED_INT_VEC4: typeName = "GL_UNSIGNED_INT_VEC4"; break;
- case GL_BOOL: typeName = "GL_BOOL"; break;
- case GL_BOOL_VEC2: typeName = "GL_BOOL_VEC2"; break;
- case GL_BOOL_VEC3: typeName = "GL_BOOL_VEC3"; break;
- case GL_BOOL_VEC4: typeName = "GL_BOOL_VEC4"; break;
- case GL_FLOAT_MAT2: typeName = "GL_FLOAT_MAT2"; break;
- case GL_FLOAT_MAT3: typeName = "GL_FLOAT_MAT3"; break;
- case GL_FLOAT_MAT4: typeName = "GL_FLOAT_MAT4"; break;
- case GL_FLOAT_MAT2x3: typeName = "GL_FLOAT_MAT2x3"; break;
- case GL_FLOAT_MAT3x2: typeName = "GL_FLOAT_MAT3x2"; break;
- case GL_FLOAT_MAT4x2: typeName = "GL_FLOAT_MAT4x2"; break;
- case GL_FLOAT_MAT2x4: typeName = "GL_FLOAT_MAT2x4"; break;
- case GL_FLOAT_MAT3x4: typeName = "GL_FLOAT_MAT3x4"; break;
- case GL_FLOAT_MAT4x3: typeName = "GL_FLOAT_MAT4x3"; break;
-
- case GL_SAMPLER_2D: typeName = "GL_SAMPLER_2D"; break;
- case GL_SAMPLER_3D:
- typeName = "GL_SAMPLER_3D";
- break;
- case GL_SAMPLER_CUBE:
- typeName = "GL_SAMPLER_CUBE";
- break;
- case GL_SAMPLER_CUBE_SHADOW:
- typeName = "GL_SAMPLER_CUBE_SHADOW";
- break;
- case GL_SAMPLER_2D_SHADOW:
- typeName = "GL_SAMPLER_2D_ARRAY_SHADOW";
- break;
- case GL_SAMPLER_2D_ARRAY:
- typeName = "GL_SAMPLER_2D_ARRAY";
- break;
- case GL_SAMPLER_2D_ARRAY_SHADOW:
- typeName = "GL_SAMPLER_2D_ARRAY_SHADOW";
- break;
- case GL_SAMPLER_2D_MULTISAMPLE:
- typeName = "GL_SAMPLER_2D_MULTISAMPLE";
- break;
- case GL_IMAGE_2D:
- typeName = "GL_IMAGE_2D";
- break;
- case GL_IMAGE_3D:
- typeName = "GL_IMAGE_3D";
- break;
- case GL_IMAGE_CUBE:
- typeName = "GL_IMAGE_CUBE";
- break;
- case GL_IMAGE_2D_ARRAY:
- typeName = "GL_IMAGE_2D_ARRAY";
- break;
-
- case GL_INT_SAMPLER_2D:
- typeName = "GL_INT_SAMPLER_2D";
- break;
- case GL_INT_SAMPLER_3D:
- typeName = "GL_INT_SAMPLER_3D";
- break;
- case GL_INT_SAMPLER_CUBE:
- typeName = "GL_INT_SAMPLER_CUBE";
- break;
- case GL_INT_SAMPLER_2D_ARRAY:
- typeName = "GL_INT_SAMPLER_2D_ARRAY";
- break;
- case GL_INT_SAMPLER_2D_MULTISAMPLE:
- typeName = "GL_INT_SAMPLER_2D_MULTISAMPLE";
- break;
- case GL_INT_IMAGE_2D:
- typeName = "GL_INT_IMAGE_2D";
- break;
- case GL_INT_IMAGE_3D:
- typeName = "GL_INT_IMAGE_3D";
- break;
- case GL_INT_IMAGE_CUBE:
- typeName = "GL_INT_IMAGE_CUBE";
- break;
- case GL_INT_IMAGE_2D_ARRAY:
- typeName = "GL_INT_IMAGE_2D_ARRAY";
- break;
-
- case GL_UNSIGNED_INT_SAMPLER_2D:
- typeName = "GL_UNSIGNED_INT_SAMPLER_2D";
- break;
- case GL_UNSIGNED_INT_SAMPLER_3D:
- typeName = "GL_UNSIGNED_INT_SAMPLER_3D";
- break;
- case GL_UNSIGNED_INT_SAMPLER_CUBE:
- typeName = "GL_UNSIGNED_INT_SAMPLER_CUBE";
- break;
- case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
- typeName = "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY";
- break;
- case GL_UNSIGNED_INT_ATOMIC_COUNTER:
- typeName = "GL_UNSIGNED_INT_ATOMIC_COUNTER";
- break;
- case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
- typeName = "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE";
- break;
- case GL_UNSIGNED_INT_IMAGE_2D:
- typeName = "GL_UNSIGNED_INT_IMAGE_2D";
- break;
- case GL_UNSIGNED_INT_IMAGE_3D:
- typeName = "GL_UNSIGNED_INT_IMAGE_3D";
- break;
- case GL_UNSIGNED_INT_IMAGE_CUBE:
- typeName = "GL_UNSIGNED_INT_IMAGE_CUBE";
- break;
- case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
- typeName = "GL_UNSIGNED_INT_IMAGE_2D_ARRAY";
- break;
-
- case GL_SAMPLER_EXTERNAL_OES: typeName = "GL_SAMPLER_EXTERNAL_OES"; break;
- case GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT:
- typeName = "GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT";
- break;
- default: typeName = "UNKNOWN"; break;
+ case GL_FLOAT:
+ typeName = "GL_FLOAT";
+ break;
+ case GL_FLOAT_VEC2:
+ typeName = "GL_FLOAT_VEC2";
+ break;
+ case GL_FLOAT_VEC3:
+ typeName = "GL_FLOAT_VEC3";
+ break;
+ case GL_FLOAT_VEC4:
+ typeName = "GL_FLOAT_VEC4";
+ break;
+ case GL_INT:
+ typeName = "GL_INT";
+ break;
+ case GL_INT_VEC2:
+ typeName = "GL_INT_VEC2";
+ break;
+ case GL_INT_VEC3:
+ typeName = "GL_INT_VEC3";
+ break;
+ case GL_INT_VEC4:
+ typeName = "GL_INT_VEC4";
+ break;
+ case GL_UNSIGNED_INT:
+ typeName = "GL_UNSIGNED_INT";
+ break;
+ case GL_UNSIGNED_INT_VEC2:
+ typeName = "GL_UNSIGNED_INT_VEC2";
+ break;
+ case GL_UNSIGNED_INT_VEC3:
+ typeName = "GL_UNSIGNED_INT_VEC3";
+ break;
+ case GL_UNSIGNED_INT_VEC4:
+ typeName = "GL_UNSIGNED_INT_VEC4";
+ break;
+ case GL_BOOL:
+ typeName = "GL_BOOL";
+ break;
+ case GL_BOOL_VEC2:
+ typeName = "GL_BOOL_VEC2";
+ break;
+ case GL_BOOL_VEC3:
+ typeName = "GL_BOOL_VEC3";
+ break;
+ case GL_BOOL_VEC4:
+ typeName = "GL_BOOL_VEC4";
+ break;
+ case GL_FLOAT_MAT2:
+ typeName = "GL_FLOAT_MAT2";
+ break;
+ case GL_FLOAT_MAT3:
+ typeName = "GL_FLOAT_MAT3";
+ break;
+ case GL_FLOAT_MAT4:
+ typeName = "GL_FLOAT_MAT4";
+ break;
+ case GL_FLOAT_MAT2x3:
+ typeName = "GL_FLOAT_MAT2x3";
+ break;
+ case GL_FLOAT_MAT3x2:
+ typeName = "GL_FLOAT_MAT3x2";
+ break;
+ case GL_FLOAT_MAT4x2:
+ typeName = "GL_FLOAT_MAT4x2";
+ break;
+ case GL_FLOAT_MAT2x4:
+ typeName = "GL_FLOAT_MAT2x4";
+ break;
+ case GL_FLOAT_MAT3x4:
+ typeName = "GL_FLOAT_MAT3x4";
+ break;
+ case GL_FLOAT_MAT4x3:
+ typeName = "GL_FLOAT_MAT4x3";
+ break;
+
+ case GL_SAMPLER_2D:
+ typeName = "GL_SAMPLER_2D";
+ break;
+ case GL_SAMPLER_3D:
+ typeName = "GL_SAMPLER_3D";
+ break;
+ case GL_SAMPLER_CUBE:
+ typeName = "GL_SAMPLER_CUBE";
+ break;
+ case GL_SAMPLER_CUBE_SHADOW:
+ typeName = "GL_SAMPLER_CUBE_SHADOW";
+ break;
+ case GL_SAMPLER_2D_SHADOW:
+ typeName = "GL_SAMPLER_2D_ARRAY_SHADOW";
+ break;
+ case GL_SAMPLER_2D_ARRAY:
+ typeName = "GL_SAMPLER_2D_ARRAY";
+ break;
+ case GL_SAMPLER_2D_ARRAY_SHADOW:
+ typeName = "GL_SAMPLER_2D_ARRAY_SHADOW";
+ break;
+ case GL_SAMPLER_2D_MULTISAMPLE:
+ typeName = "GL_SAMPLER_2D_MULTISAMPLE";
+ break;
+ case GL_IMAGE_2D:
+ typeName = "GL_IMAGE_2D";
+ break;
+ case GL_IMAGE_3D:
+ typeName = "GL_IMAGE_3D";
+ break;
+ case GL_IMAGE_CUBE:
+ typeName = "GL_IMAGE_CUBE";
+ break;
+ case GL_IMAGE_2D_ARRAY:
+ typeName = "GL_IMAGE_2D_ARRAY";
+ break;
+
+ case GL_INT_SAMPLER_2D:
+ typeName = "GL_INT_SAMPLER_2D";
+ break;
+ case GL_INT_SAMPLER_3D:
+ typeName = "GL_INT_SAMPLER_3D";
+ break;
+ case GL_INT_SAMPLER_CUBE:
+ typeName = "GL_INT_SAMPLER_CUBE";
+ break;
+ case GL_INT_SAMPLER_2D_ARRAY:
+ typeName = "GL_INT_SAMPLER_2D_ARRAY";
+ break;
+ case GL_INT_SAMPLER_2D_MULTISAMPLE:
+ typeName = "GL_INT_SAMPLER_2D_MULTISAMPLE";
+ break;
+ case GL_INT_IMAGE_2D:
+ typeName = "GL_INT_IMAGE_2D";
+ break;
+ case GL_INT_IMAGE_3D:
+ typeName = "GL_INT_IMAGE_3D";
+ break;
+ case GL_INT_IMAGE_CUBE:
+ typeName = "GL_INT_IMAGE_CUBE";
+ break;
+ case GL_INT_IMAGE_2D_ARRAY:
+ typeName = "GL_INT_IMAGE_2D_ARRAY";
+ break;
+
+ case GL_UNSIGNED_INT_SAMPLER_2D:
+ typeName = "GL_UNSIGNED_INT_SAMPLER_2D";
+ break;
+ case GL_UNSIGNED_INT_SAMPLER_3D:
+ typeName = "GL_UNSIGNED_INT_SAMPLER_3D";
+ break;
+ case GL_UNSIGNED_INT_SAMPLER_CUBE:
+ typeName = "GL_UNSIGNED_INT_SAMPLER_CUBE";
+ break;
+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
+ typeName = "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY";
+ break;
+ case GL_UNSIGNED_INT_ATOMIC_COUNTER:
+ typeName = "GL_UNSIGNED_INT_ATOMIC_COUNTER";
+ break;
+ case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
+ typeName = "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE";
+ break;
+ case GL_UNSIGNED_INT_IMAGE_2D:
+ typeName = "GL_UNSIGNED_INT_IMAGE_2D";
+ break;
+ case GL_UNSIGNED_INT_IMAGE_3D:
+ typeName = "GL_UNSIGNED_INT_IMAGE_3D";
+ break;
+ case GL_UNSIGNED_INT_IMAGE_CUBE:
+ typeName = "GL_UNSIGNED_INT_IMAGE_CUBE";
+ break;
+ case GL_UNSIGNED_INT_IMAGE_2D_ARRAY:
+ typeName = "GL_UNSIGNED_INT_IMAGE_2D_ARRAY";
+ break;
+
+ case GL_SAMPLER_EXTERNAL_OES:
+ typeName = "GL_SAMPLER_EXTERNAL_OES";
+ break;
+ case GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT:
+ typeName = "GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT";
+ break;
+ default:
+ typeName = "UNKNOWN";
+ break;
}
printf("%s %u : name=%s, mappedName=%s, type=%s, arraySizes=", prefix.c_str(),
@@ -605,7 +672,7 @@ static void PrintActiveVariables(ShHandle compiler)
std::string varCategoryName;
if (varCategory == 0)
{
- numVars = uniforms->size();
+ numVars = uniforms->size();
varCategoryName = "uniform";
}
else if (varCategory == 1)
@@ -620,7 +687,7 @@ static void PrintActiveVariables(ShHandle compiler)
}
else if (varCategory == 3)
{
- numVars = attributes->size();
+ numVars = attributes->size();
varCategoryName = "attribute";
}
else
@@ -670,14 +737,13 @@ static bool ReadShaderSource(const char *fileName, ShaderSource &source)
// string is added to vector.
do
{
- char *data = new char[len + 1];
+ char *data = new char[len + 1];
size_t nread = fread(data, 1, len, in);
- data[nread] = '\0';
+ data[nread] = '\0';
source.push_back(data);
count -= nread;
- }
- while (count > 0);
+ } while (count > 0);
fclose(in);
return true;
@@ -687,7 +753,7 @@ static void FreeShaderSource(ShaderSource &source)
{
for (ShaderSource::size_type i = 0; i < source.size(); ++i)
{
- delete [] source[i];
+ delete[] source[i];
}
source.clear();
}
diff --git a/chromium/third_party/angle/scripts/entry_point_packed_gl_enums.json b/chromium/third_party/angle/scripts/entry_point_packed_gl_enums.json
index 2449ab4d51c..7c5fd6351dd 100644
--- a/chromium/third_party/angle/scripts/entry_point_packed_gl_enums.json
+++ b/chromium/third_party/angle/scripts/entry_point_packed_gl_enums.json
@@ -43,10 +43,10 @@
"target": "TextureTarget"
},
"glCompressedTexImage3D": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glCompressedTexImage3DRobustANGLE": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glCompressedTexSubImage2D": {
"target": "TextureTarget"
@@ -55,10 +55,10 @@
"target": "TextureTarget"
},
"glCompressedTexSubImage3D": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glCompressedTexSubImage3DRobustANGLE": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glCopyTexImage2D": {
"target": "TextureTarget"
@@ -73,7 +73,7 @@
"target": "TextureTarget"
},
"glCopyTexSubImage3D": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glCopySubTexture3DANGLE": {
"destTarget": "TextureTarget"
@@ -265,6 +265,12 @@
"glGetTexParameterxv": {
"target": "TextureType"
},
+ "glImportMemoryFdEXT": {
+ "handleType": "HandleType"
+ },
+ "glImportSemaphoreFdEXT": {
+ "handleType": "HandleType"
+ },
"glLightf" : {
"pname" : "LightParameter"
},
@@ -280,6 +286,10 @@
"glLogicOp" : {
"opcode" : "LogicalOperation"
},
+ "glLoseContextCHROMIUM" : {
+ "current" : "GraphicsResetStatus",
+ "other" : "GraphicsResetStatus"
+ },
"glMapBuffer": {
"target": "BufferBinding"
},
@@ -382,10 +392,10 @@
"target": "TextureTarget"
},
"glTexImage3D": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glTexImage3DRobustANGLE": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glTexParameterf": {
"target": "TextureType"
@@ -438,6 +448,21 @@
"glTexStorage3DMultisampleOES": {
"target": "TextureType"
},
+ "glTexStorageMem2DEXT": {
+ "target": "TextureType"
+ },
+ "glTexStorageMem2DMultisampleEXT": {
+ "target": "TextureType"
+ },
+ "glTexStorageMem3DEXT": {
+ "target": "TextureType"
+ },
+ "glTexStorageMem3DMultisampleEXT": {
+ "target": "TextureType"
+ },
+ "glBufferStorageMemEXT": {
+ "target": "TextureType"
+ },
"glTexStorage3D": {
"target": "TextureType"
},
@@ -451,10 +476,10 @@
"target": "TextureTarget"
},
"glTexSubImage3D": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glTexSubImage3DRobustANGLE": {
- "target": "TextureType"
+ "target": "TextureTarget"
},
"glUnmapBuffer": {
"target": "BufferBinding"
diff --git a/chromium/third_party/angle/scripts/file_exists.py b/chromium/third_party/angle/scripts/file_exists.py
index d492be6bf65..435cdf89f85 100644
--- a/chromium/third_party/angle/scripts/file_exists.py
+++ b/chromium/third_party/angle/scripts/file_exists.py
@@ -5,18 +5,20 @@
#
# Simple helper for use in 'gn' files to check if a file exists.
+from __future__ import print_function
+
import os, shutil, sys
def main():
- if len(sys.argv) != 2:
- print "Usage: %s <path>" % sys.argv[0]
- sys.exit(1)
+ if len(sys.argv) != 2:
+ print("Usage: %s <path>" % sys.argv[0])
+ sys.exit(1)
- if os.path.exists(sys.argv[1]):
- print "true"
- else:
- print "false"
- sys.exit(0)
+ if os.path.exists(sys.argv[1]):
+ print("true")
+ else:
+ print("false")
+ sys.exit(0)
if __name__ == '__main__':
main()
diff --git a/chromium/third_party/angle/scripts/generate_deqp_stats.py b/chromium/third_party/angle/scripts/generate_deqp_stats.py
new file mode 100755
index 00000000000..2c71914938c
--- /dev/null
+++ b/chromium/third_party/angle/scripts/generate_deqp_stats.py
@@ -0,0 +1,167 @@
+#!/usr/bin/python2
+#
+# Copyright 2019 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# generate_deqp_stats.py:
+# Checks output of deqp testers and generates stats using the GDocs API
+
+import re
+import datetime
+import os
+import subprocess
+import sys
+
+BOT_NAMES = [
+ 'Win10 FYI dEQP Release (NVIDIA)',
+ 'Win10 FYI dEQP Release (Intel HD 630)',
+ 'Win7 FYI dEQP Release (AMD)',
+ 'Win7 FYI x64 dEQP Release (NVIDIA)',
+ 'Mac FYI dEQP Release Intel',
+ 'Mac FYI dEQP Release AMD',
+ 'Linux FYI dEQP Release (Intel HD 630)',
+ 'Linux FYI dEQP Release (NVIDIA)',
+ 'Android FYI dEQP Release (Nexus 5X)',
+ 'Android FYI 32 dEQP Vk Release (Pixel XL)',
+ 'Android FYI 64 dEQP Vk Release (Pixel XL)',
+ 'Android FYI 32 dEQP Vk Release (Pixel 2)',
+ 'Android FYI 64 dEQP Vk Release (Pixel 2)',
+]
+BOT_NAME_PREFIX = 'chromium/ci/'
+
+INFO_TAG = '*RESULT'
+
+
+# Returns a struct with info about the latest successful build given a bot name
+# Info contains the build_name, time, date, and angle_revision, if available.
+# Uses: bb ls '<botname>' -n 1 -status success -A
+def get_latest_success_build_info(bot_name):
+ bb = subprocess.Popen(
+ ['bb', 'ls', bot_name, '-n', '1', '-status', 'success', '-A'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = bb.communicate()
+ if err:
+ raise ValueError("Unexpected error from bb ls: '" + err + "'")
+ if not out:
+ raise ValueError("Unexpected empty result from bb ls of bot '" + bot_name +
+ "'")
+ if 'SUCCESS' not in out:
+ raise ValueError("Unexpected result from bb ls: '" + out + "'")
+ info = {}
+ for line in out.splitlines():
+ # The first line holds the build name
+ if 'build_name' not in info:
+ info['build_name'] = line.strip().split("'")[1]
+ if 'Created' in line:
+ info['time'] = re.findall(r'[0-9]{1,2}:[0-9]{2}:[0-9]{2}',
+ line.split(',', 1)[0])[0]
+ info['date'] = datetime.datetime.now().strftime('%y/%m/%d')
+ if 'parent_got_angle_revision' in line:
+ info['angle_revision'] = filter(str.isalnum, line.split(':')[1])
+ if 'build_name' not in info:
+ raise ValueError("Could not find build_name from bot '" + bot_name + "'")
+ return info
+
+
+# Returns a list of step names that we're interested in given a build name. We
+# are interested in step names starting with 'angle_'.
+# Uses: bb get '<build_name>' -steps
+# May raise an exception.
+def get_step_names(build_name):
+ bb = subprocess.Popen(['bb', 'get', build_name, '-steps'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = bb.communicate()
+ if err:
+ raise ValueError("Unexpected error from bb get: '" + err + "'")
+ step_names = []
+ for line in out.splitlines():
+ if 'Step "angle_' not in line:
+ continue
+ step_names.append(line.split('"')[1])
+ return step_names
+
+
+# Performs some heuristic validation of the step_info struct returned from a
+# single step log. Returns True if valid, False if invalid. May write to stderr
+def validate_step_info(step_info, build_name, step_name):
+ print_name = "'" + build_name + "': '" + step_name + "'"
+ if not step_info:
+ sys.stderr.write('WARNING: Step info empty for ' + print_name + '\n')
+ return False
+
+ if 'Total' in step_info:
+ partial_sum_keys = [
+ 'Passed', 'Failed', 'Skipped', 'Not Supported', 'Exception', 'Crashed'
+ ]
+ partial_sum_values = [
+ int(step_info[key]) for key in partial_sum_keys if key in step_info
+ ]
+ computed_total = sum(partial_sum_values)
+ if step_info['Total'] != computed_total:
+ sys.stderr.write('WARNING: Step info does not sum to total for ' +
+ print_name + ' | Total: ' + str(step_info['Total']) +
+ ' - Computed total: ' + str(computed_total) + '\n')
+ return True
+
+
+# Returns a struct containing parsed info from a given step log. The info is
+# parsed by looking for lines with the following format in stdout:
+# '[TESTSTATS]: <key>: <value>''
+# May write to stderr
+# Uses: bb log '<build_name>' '<step_name>'
+def get_step_info(build_name, step_name):
+ bb = subprocess.Popen(['bb', 'log', build_name, step_name],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = bb.communicate()
+ if err:
+ sys.stderr.write("WARNING: Unexpected error from bb log '" + build_name +
+ "' '" + step_name + "': '" + err + "'")
+ return None
+ step_info = {}
+ for line in out.splitlines():
+ if INFO_TAG not in line:
+ continue
+ found_stat = True
+ line_columns = line.split(INFO_TAG, 1)[1].split(':')
+ if len(line_columns) is not 3:
+ sys.stderr.write("WARNING: Line improperly formatted: '" + line + "'\n")
+ continue
+ key = line_columns[1].strip()
+ if key not in step_info:
+ step_info[key] = 0
+ val = int(filter(str.isdigit, line_columns[2]))
+ if val is not None:
+ step_info[key] += val
+ else:
+ step_info[key] += ', ' + line_columns[2]
+ if validate_step_info(step_info, build_name, step_name):
+ return step_info
+ return None
+
+
+# Returns the info for each step run on a given bot_name.
+def get_bot_info(bot_name):
+ info = get_latest_success_build_info(bot_name)
+ info['step_names'] = get_step_names(info['build_name'])
+ for step_name in info['step_names']:
+ info[step_name] = get_step_info(info['build_name'], step_name)
+ return info
+
+
+def main():
+ info = {}
+ for bot_name in BOT_NAMES:
+ try:
+ info[bot_name] = get_bot_info(BOT_NAME_PREFIX + bot_name)
+ except Exception as error:
+ sys.stderr.write('ERROR: %s\n' % str(error))
+
+ print(str(info))
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/scripts/generate_entry_points.py b/chromium/third_party/angle/scripts/generate_entry_points.py
index bbaa2751765..4233becffdd 100755
--- a/chromium/third_party/angle/scripts/generate_entry_points.py
+++ b/chromium/third_party/angle/scripts/generate_entry_points.py
@@ -6,26 +6,12 @@
#
# generate_entry_points.py:
# Generates the OpenGL bindings and entry point layers for ANGLE.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
import sys, os, pprint, json
from datetime import date
import registry_xml
-# Handle inputs/outputs for run_code_generation.py's auto_script
-if len(sys.argv) == 2 and sys.argv[1] == 'inputs':
-
- inputs = [
- 'egl.xml',
- 'egl_angle_ext.xml',
- 'entry_point_packed_gl_enums.json',
- 'gl.xml',
- 'gl_angle_ext.xml',
- 'registry_xml.py',
- ]
-
- print(",".join(inputs))
- sys.exit(0)
-
# List of GLES1 extensions for which we don't need to add Context.h decls.
gles1_no_context_decl_extensions = [
"GL_OES_framebuffer_object",
@@ -46,7 +32,7 @@ no_event_marker_exceptions_list = sorted([
])
# Strip these suffixes from Context entry point names. NV is excluded (for now).
-strip_suffixes = ["ANGLE", "EXT", "KHR", "OES", "CHROMIUM"]
+strip_suffixes = ["ANGLE", "EXT", "KHR", "OES", "CHROMIUM", "OVR"]
template_entry_point_header = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name}.
@@ -355,7 +341,7 @@ def default_return_value(cmd_name, return_type):
return "GetDefaultReturnValue<EntryPoint::" + cmd_name[2:] + ", " + return_type + ">()"
def get_context_getter_function(cmd_name, is_explicit_context):
- if cmd_name == "glGetError":
+ if cmd_name == "glGetError" or cmd_name == "glGetGraphicsResetStatusEXT":
return "GetGlobalContext()"
elif is_explicit_context:
return "static_cast<gl::Context *>(ctx)"
@@ -640,250 +626,296 @@ def get_exports(commands, fmt = None):
else:
return [" %s" % cmd for cmd in sorted(commands)]
-gles1decls = {}
-
-gles1decls['core'] = []
-gles1decls['exts'] = {}
-
-libgles_ep_defs = []
-libgles_ep_exports = []
-
-xml = registry_xml.RegistryXML('gl.xml', 'gl_angle_ext.xml')
-
-# First run through the main GLES entry points. Since ES2+ is the primary use
-# case, we go through those first and then add ES1-only APIs at the end.
-for major_version, minor_version in [[2, 0], [3, 0], [3, 1], [1, 0]]:
- annotation = "{}_{}".format(major_version, minor_version)
- name_prefix = "GL_ES_VERSION_"
-
- is_gles1 = major_version == 1
- if is_gles1:
- name_prefix = "GL_VERSION_ES_CM_"
-
- comment = annotation.replace("_", ".")
- feature_name = "{}{}".format(name_prefix, annotation)
-
- xml.AddCommands(feature_name, annotation)
-
- gles_commands = xml.commands[annotation]
- all_commands = xml.all_commands
-
- decls, defs, libgles_defs, validation_protos = get_entry_points(
- all_commands, gles_commands, False)
-
- # Write the version as a comment before the first EP.
- libgles_defs.insert(0, "\n// OpenGL ES %s" % comment)
- libgles_ep_exports.append("\n ; OpenGL ES %s" % comment)
+# Get EGL exports
+def get_egl_exports():
- libgles_ep_defs += libgles_defs
- libgles_ep_exports += get_exports(gles_commands)
+ egl = registry_xml.RegistryXML('egl.xml', 'egl_angle_ext.xml')
+ exports = []
- major_if_not_one = major_version if major_version != 1 else ""
- minor_if_not_zero = minor_version if minor_version != 0 else ""
+ capser = lambda fn: "EGL_" + fn[3:]
- header_includes = template_header_includes.format(
- major=major_if_not_one, minor=minor_if_not_zero)
+ for major, minor in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]:
+ annotation = "{}_{}".format(major, minor)
+ name_prefix = "EGL_VERSION_"
- # We include the platform.h header since it undefines the conflicting MemoryBarrier macro.
- if major_version == 3 and minor_version == 1:
- header_includes += "\n#include \"common/platform.h\"\n"
+ feature_name = "{}{}".format(name_prefix, annotation)
- source_includes = template_sources_includes.format(
- annotation.lower(), major_version, minor_if_not_zero)
+ egl.AddCommands(feature_name, annotation)
- write_file(annotation, comment, template_entry_point_header,
- "\n".join(decls), "h", header_includes, "gl.xml")
- write_file(annotation, comment, template_entry_point_source,
- "\n".join(defs), "cpp", source_includes, "gl.xml")
- if is_gles1:
- gles1decls['core'] = get_gles1_decls(all_commands, gles_commands)
+ commands = egl.commands[annotation]
- validation_annotation = "%s%s" % (major_version, minor_if_not_zero)
- write_validation_header(validation_annotation, comment, validation_protos)
+ if len(commands) == 0:
+ continue
+ exports.append("\n ; EGL %d.%d" % (major, minor))
+ exports += get_exports(commands, capser)
-# After we finish with the main entry points, we process the extensions.
-extension_defs = []
-extension_decls = []
+ egl.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl'])
-# Accumulated validation prototypes.
-ext_validation_protos = []
+ for extension_name, ext_cmd_names in sorted(egl.ext_data.iteritems()):
-for gles1ext in registry_xml.gles1_extensions:
- gles1decls['exts'][gles1ext] = []
+ if len(ext_cmd_names) == 0:
+ continue
-xml.AddExtensionCommands(registry_xml.supported_extensions, ['gles2', 'gles1'])
+ exports.append("\n ; %s" % extension_name)
+ exports += get_exports(ext_cmd_names, capser)
-for extension_name, ext_cmd_names in sorted(xml.ext_data.iteritems()):
+ return exports
- # Detect and filter duplicate extensions.
- decls, defs, libgles_defs, validation_protos = get_entry_points(
- xml.all_commands, ext_cmd_names, False)
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [
+ 'egl.xml',
+ 'egl_angle_ext.xml',
+ 'entry_point_packed_gl_enums.json',
+ 'gl.xml',
+ 'gl_angle_ext.xml',
+ 'registry_xml.py',
+ ]
+ outputs = [
+ '../src/libANGLE/Context_gles_1_0_autogen.h',
+ '../src/libANGLE/validationES1_autogen.h',
+ '../src/libANGLE/validationES2_autogen.h',
+ '../src/libANGLE/validationES31_autogen.h',
+ '../src/libANGLE/validationES3_autogen.h',
+ '../src/libANGLE/validationESEXT_autogen.h',
+ '../src/libGLESv2/entry_points_enum_autogen.h',
+ '../src/libGLESv2/entry_points_gles_1_0_autogen.cpp',
+ '../src/libGLESv2/entry_points_gles_1_0_autogen.h',
+ '../src/libGLESv2/entry_points_gles_2_0_autogen.cpp',
+ '../src/libGLESv2/entry_points_gles_2_0_autogen.h',
+ '../src/libGLESv2/entry_points_gles_3_0_autogen.cpp',
+ '../src/libGLESv2/entry_points_gles_3_0_autogen.h',
+ '../src/libGLESv2/entry_points_gles_3_1_autogen.cpp',
+ '../src/libGLESv2/entry_points_gles_3_1_autogen.h',
+ '../src/libGLESv2/entry_points_gles_ext_autogen.cpp',
+ '../src/libGLESv2/entry_points_gles_ext_autogen.h',
+ '../src/libGLESv2/libGLESv2_autogen.cpp',
+ '../src/libGLESv2/libGLESv2_autogen.def',
+ ]
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ gles1decls = {}
+
+ gles1decls['core'] = []
+ gles1decls['exts'] = {}
+
+ libgles_ep_defs = []
+ libgles_ep_exports = []
+
+ xml = registry_xml.RegistryXML('gl.xml', 'gl_angle_ext.xml')
+
+ # First run through the main GLES entry points. Since ES2+ is the primary use
+ # case, we go through those first and then add ES1-only APIs at the end.
+ for major_version, minor_version in [[2, 0], [3, 0], [3, 1], [1, 0]]:
+ annotation = "{}_{}".format(major_version, minor_version)
+ name_prefix = "GL_ES_VERSION_"
+
+ is_gles1 = major_version == 1
+ if is_gles1:
+ name_prefix = "GL_VERSION_ES_CM_"
+
+ comment = annotation.replace("_", ".")
+ feature_name = "{}{}".format(name_prefix, annotation)
- # Avoid writing out entry points defined by a prior extension.
- for dupe in xml.ext_dupes[extension_name]:
- msg = "// {} is already defined.\n".format(dupe[2:])
- defs.append(msg)
+ xml.AddCommands(feature_name, annotation)
- # Write the extension name as a comment before the first EP.
- comment = "\n// {}".format(extension_name)
- defs.insert(0, comment)
- decls.insert(0, comment)
- libgles_defs.insert(0, comment)
- libgles_ep_exports.append("\n ; %s" % extension_name)
+ gles_commands = xml.commands[annotation]
+ all_commands = xml.all_commands
- extension_defs += defs
- extension_decls += decls
+ decls, defs, libgles_defs, validation_protos = get_entry_points(
+ all_commands, gles_commands, False)
- ext_validation_protos += [comment] + validation_protos
+ # Write the version as a comment before the first EP.
+ libgles_defs.insert(0, "\n// OpenGL ES %s" % comment)
+ libgles_ep_exports.append("\n ; OpenGL ES %s" % comment)
- libgles_ep_defs += libgles_defs
- libgles_ep_exports += get_exports(ext_cmd_names)
+ libgles_ep_defs += libgles_defs
+ libgles_ep_exports += get_exports(gles_commands)
- if extension_name in registry_xml.gles1_extensions:
- if extension_name not in gles1_no_context_decl_extensions:
- gles1decls['exts'][extension_name] = get_gles1_decls(all_commands, ext_cmd_names)
+ major_if_not_one = major_version if major_version != 1 else ""
+ minor_if_not_zero = minor_version if minor_version != 0 else ""
-# Special handling for EGL_ANGLE_explicit_context extension
-if registry_xml.support_EGL_ANGLE_explicit_context:
- comment = "\n// EGL_ANGLE_explicit_context"
- extension_defs.append(comment)
- extension_decls.append(comment)
- libgles_ep_defs.append(comment)
+ header_includes = template_header_includes.format(
+ major=major_if_not_one, minor=minor_if_not_zero)
- cmds = xml.all_cmd_names.get_all_commands()
+ # We include the platform.h header since it undefines the conflicting MemoryBarrier macro.
+ if major_version == 3 and minor_version == 1:
+ header_includes += "\n#include \"common/platform.h\"\n"
- # Get the explicit context entry points
- decls, defs, libgles_defs, validation_protos = get_entry_points(
- xml.all_commands, cmds, True)
+ source_includes = template_sources_includes.format(
+ annotation.lower(), major_version, minor_if_not_zero)
- # Append the explicit context entry points
- extension_decls += decls
- extension_defs += defs
- libgles_ep_defs += libgles_defs
+ write_file(annotation, comment, template_entry_point_header,
+ "\n".join(decls), "h", header_includes, "gl.xml")
+ write_file(annotation, comment, template_entry_point_source,
+ "\n".join(defs), "cpp", source_includes, "gl.xml")
+ if is_gles1:
+ gles1decls['core'] = get_gles1_decls(all_commands, gles_commands)
- libgles_ep_exports.append("\n ; EGL_ANGLE_explicit_context")
- libgles_ep_exports += get_exports(cmds, lambda x: "%sContextANGLE" % x)
+ validation_annotation = "%s%s" % (major_version, minor_if_not_zero)
+ write_validation_header(validation_annotation, comment, validation_protos)
- # Generate .inc files for extension function pointers and declarations
- for major, minor in [[2, 0], [3, 0], [3, 1], [1, 0]]:
- annotation = "{}_{}".format(major, minor)
- major_if_not_one = major if major != 1 else ""
- minor_if_not_zero = minor if minor != 0 else ""
- version = "{}{}".format(major_if_not_one, minor_if_not_zero)
+ # After we finish with the main entry points, we process the extensions.
+ extension_defs = []
+ extension_decls = []
- glext_ptrs, glext_protos = get_glext_decls(all_commands,
- xml.all_cmd_names.get_commands(annotation), version, True)
+ # Accumulated validation prototypes.
+ ext_validation_protos = []
- glext_ext_ptrs = []
- glext_ext_protos = []
+ for gles1ext in registry_xml.gles1_extensions:
+ gles1decls['exts'][gles1ext] = []
- # Append extensions for 1.0 and 2.0
- if(annotation == "1_0"):
- glext_ext_ptrs, glext_ext_protos = get_glext_decls(all_commands,
- xml.all_cmd_names.get_commands("glext"), version, True)
- elif(annotation == "2_0"):
- glext_ext_ptrs, glext_ext_protos = get_glext_decls(all_commands,
- xml.all_cmd_names.get_commands("gl2ext"), version, True)
+ xml.AddExtensionCommands(registry_xml.supported_extensions, ['gles2', 'gles1'])
- glext_ptrs += glext_ext_ptrs
- glext_protos += glext_ext_protos
+ for extension_name, ext_cmd_names in sorted(xml.ext_data.iteritems()):
- write_glext_explicit_context_inc(version, "\n".join(glext_ptrs), "\n".join(glext_protos))
+ # Detect and filter duplicate extensions.
+ decls, defs, libgles_defs, validation_protos = get_entry_points(
+ xml.all_commands, ext_cmd_names, False)
-# Get EGL exports
-def get_egl_exports():
+ # Avoid writing out entry points defined by a prior extension.
+ for dupe in xml.ext_dupes[extension_name]:
+ msg = "// {} is already defined.\n".format(dupe[2:])
+ defs.append(msg)
- egl = registry_xml.RegistryXML('egl.xml', 'egl_angle_ext.xml')
- exports = []
+ # Write the extension name as a comment before the first EP.
+ comment = "\n// {}".format(extension_name)
+ defs.insert(0, comment)
+ decls.insert(0, comment)
+ libgles_defs.insert(0, comment)
+ libgles_ep_exports.append("\n ; %s" % extension_name)
- capser = lambda fn: "EGL_" + fn[3:]
+ extension_defs += defs
+ extension_decls += decls
- for major, minor in [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]]:
- annotation = "{}_{}".format(major, minor)
- name_prefix = "EGL_VERSION_"
+ ext_validation_protos += [comment] + validation_protos
- feature_name = "{}{}".format(name_prefix, annotation)
+ libgles_ep_defs += libgles_defs
+ libgles_ep_exports += get_exports(ext_cmd_names)
- egl.AddCommands(feature_name, annotation)
+ if extension_name in registry_xml.gles1_extensions:
+ if extension_name not in gles1_no_context_decl_extensions:
+ gles1decls['exts'][extension_name] = get_gles1_decls(all_commands, ext_cmd_names)
- commands = egl.commands[annotation]
+ # Special handling for EGL_ANGLE_explicit_context extension
+ if registry_xml.support_EGL_ANGLE_explicit_context:
+ comment = "\n// EGL_ANGLE_explicit_context"
+ extension_defs.append(comment)
+ extension_decls.append(comment)
+ libgles_ep_defs.append(comment)
- if len(commands) == 0:
- continue
+ cmds = xml.all_cmd_names.get_all_commands()
- exports.append("\n ; EGL %d.%d" % (major, minor))
- exports += get_exports(commands, capser)
+ # Get the explicit context entry points
+ decls, defs, libgles_defs, validation_protos = get_entry_points(
+ xml.all_commands, cmds, True)
- egl.AddExtensionCommands(registry_xml.supported_egl_extensions, ['egl'])
+ # Append the explicit context entry points
+ extension_decls += decls
+ extension_defs += defs
+ libgles_ep_defs += libgles_defs
- for extension_name, ext_cmd_names in sorted(egl.ext_data.iteritems()):
+ libgles_ep_exports.append("\n ; EGL_ANGLE_explicit_context")
+ libgles_ep_exports += get_exports(cmds, lambda x: "%sContextANGLE" % x)
- if len(ext_cmd_names) == 0:
- continue
+ # Generate .inc files for extension function pointers and declarations
+ for major, minor in [[2, 0], [3, 0], [3, 1], [1, 0]]:
+ annotation = "{}_{}".format(major, minor)
- exports.append("\n ; %s" % extension_name)
- exports += get_exports(ext_cmd_names, capser)
+ major_if_not_one = major if major != 1 else ""
+ minor_if_not_zero = minor if minor != 0 else ""
+ version = "{}{}".format(major_if_not_one, minor_if_not_zero)
- return exports
+ glext_ptrs, glext_protos = get_glext_decls(all_commands,
+ xml.all_cmd_names.get_commands(annotation), version, True)
-header_includes = template_header_includes.format(
- major="", minor="")
-header_includes += """
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-"""
+ glext_ext_ptrs = []
+ glext_ext_protos = []
-source_includes = template_sources_includes.format("ext", "EXT", "")
-source_includes += """
-#include "libANGLE/validationES1.h"
-#include "libANGLE/validationES2.h"
-#include "libANGLE/validationES3.h"
-#include "libANGLE/validationES31.h"
-"""
+ # Append extensions for 1.0 and 2.0
+ if(annotation == "1_0"):
+ glext_ext_ptrs, glext_ext_protos = get_glext_decls(all_commands,
+ xml.all_cmd_names.get_commands("glext"), version, True)
+ elif(annotation == "2_0"):
+ glext_ext_ptrs, glext_ext_protos = get_glext_decls(all_commands,
+ xml.all_cmd_names.get_commands("gl2ext"), version, True)
-write_file("ext", "extension", template_entry_point_header,
- "\n".join([item for item in extension_decls]), "h", header_includes,
- "gl.xml and gl_angle_ext.xml")
-write_file("ext", "extension", template_entry_point_source,
- "\n".join([item for item in extension_defs]), "cpp", source_includes,
- "gl.xml and gl_angle_ext.xml")
+ glext_ptrs += glext_ext_ptrs
+ glext_protos += glext_ext_protos
-write_validation_header("EXT", "extension", ext_validation_protos)
+ write_glext_explicit_context_inc(version, "\n".join(glext_ptrs), "\n".join(glext_protos))
-write_context_api_decls("1_0", context_gles_header, gles1decls)
-sorted_cmd_names = ["Invalid"] + [cmd[2:] for cmd in sorted(xml.all_cmd_names.get_all_commands())]
+ header_includes = template_header_includes.format(
+ major="", minor="")
+ header_includes += """
+ #include <GLES/glext.h>
+ #include <GLES2/gl2.h>
+ #include <GLES2/gl2ext.h>
+ """
+
+ source_includes = template_sources_includes.format("ext", "EXT", "")
+ source_includes += """
+ #include "libANGLE/validationES1.h"
+ #include "libANGLE/validationES2.h"
+ #include "libANGLE/validationES3.h"
+ #include "libANGLE/validationES31.h"
+ """
+
+ write_file("ext", "extension", template_entry_point_header,
+ "\n".join([item for item in extension_decls]), "h", header_includes,
+ "gl.xml and gl_angle_ext.xml")
+ write_file("ext", "extension", template_entry_point_source,
+ "\n".join([item for item in extension_defs]), "cpp", source_includes,
+ "gl.xml and gl_angle_ext.xml")
+
+ write_validation_header("EXT", "extension", ext_validation_protos)
+
+ write_context_api_decls("1_0", context_gles_header, gles1decls)
+
+ sorted_cmd_names = ["Invalid"] + [cmd[2:] for cmd in sorted(xml.all_cmd_names.get_all_commands())]
+
+ entry_points_enum = template_entry_points_enum_header.format(
+ script_name = os.path.basename(sys.argv[0]),
+ data_source_name = "gl.xml and gl_angle_ext.xml",
+ year = date.today().year,
+ entry_points_list = ",\n".join([" " + cmd for cmd in sorted_cmd_names]))
-entry_points_enum = template_entry_points_enum_header.format(
- script_name = os.path.basename(sys.argv[0]),
- data_source_name = "gl.xml and gl_angle_ext.xml",
- year = date.today().year,
- entry_points_list = ",\n".join([" " + cmd for cmd in sorted_cmd_names]))
+ entry_points_enum_header_path = path_to("libGLESv2", "entry_points_enum_autogen.h")
+ with open(entry_points_enum_header_path, "w") as out:
+ out.write(entry_points_enum)
+ out.close()
-entry_points_enum_header_path = path_to("libGLESv2", "entry_points_enum_autogen.h")
-with open(entry_points_enum_header_path, "w") as out:
- out.write(entry_points_enum)
- out.close()
+ source_includes = """
+ #include "angle_gl.h"
-source_includes = """
-#include "angle_gl.h"
+ #include "libGLESv2/entry_points_gles_1_0_autogen.h"
+ #include "libGLESv2/entry_points_gles_2_0_autogen.h"
+ #include "libGLESv2/entry_points_gles_3_0_autogen.h"
+ #include "libGLESv2/entry_points_gles_3_1_autogen.h"
+ #include "libGLESv2/entry_points_gles_ext_autogen.h"
-#include "libGLESv2/entry_points_gles_1_0_autogen.h"
-#include "libGLESv2/entry_points_gles_2_0_autogen.h"
-#include "libGLESv2/entry_points_gles_3_0_autogen.h"
-#include "libGLESv2/entry_points_gles_3_1_autogen.h"
-#include "libGLESv2/entry_points_gles_ext_autogen.h"
+ #include "common/event_tracer.h"
+ """
-#include "common/event_tracer.h"
-"""
+ write_export_files("\n".join([item for item in libgles_ep_defs]), source_includes)
-write_export_files("\n".join([item for item in libgles_ep_defs]), source_includes)
+ libgles_ep_exports += get_egl_exports()
-libgles_ep_exports += get_egl_exports()
+ everything = "Khronos and ANGLE XML files"
+ write_windows_def_file(everything, "libGLESv2", libgles_ep_exports)
-everything = "Khronos and ANGLE XML files"
-write_windows_def_file(everything, "libGLESv2", libgles_ep_exports)
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/scripts/generate_loader.py b/chromium/third_party/angle/scripts/generate_loader.py
index de14bebacd4..a408dac4e63 100755
--- a/chromium/third_party/angle/scripts/generate_loader.py
+++ b/chromium/third_party/angle/scripts/generate_loader.py
@@ -6,24 +6,12 @@
#
# generate_loader.py:
# Generates dynamic loaders for various binding interfaces.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
import sys, os, pprint, json
from datetime import date
import registry_xml
-# Handle inputs/outputs for run_code_generation.py's auto_script
-if len(sys.argv) == 2 and sys.argv[1] == 'inputs':
-
- inputs = [
- 'egl.xml',
- 'egl_angle_ext.xml',
- 'registry_xml.py',
- 'wgl.xml',
- ]
-
- print(",".join(inputs))
- sys.exit(0)
-
def write_header(data_source_name, all_cmds, api, preamble, path, lib, ns = "", prefix = None, export = ""):
file_name = "%s_loader_autogen.h" % api
header_path = registry_xml.path_to(path, file_name)
@@ -175,10 +163,40 @@ def gen_wgl_loader():
write_source(source, all_cmds, "wgl", path, "_")
def main():
+
+ # Handle inputs/outputs for run_code_generation.py's auto_script
+ if len(sys.argv) > 1:
+ inputs = [
+ 'egl.xml',
+ 'egl_angle_ext.xml',
+ 'registry_xml.py',
+ 'wgl.xml',
+ ]
+ outputs = [
+ '../src/libEGL/egl_loader_autogen.cpp',
+ '../src/libEGL/egl_loader_autogen.h',
+ '../util/egl_loader_autogen.cpp',
+ '../util/egl_loader_autogen.h',
+ '../util/gles_loader_autogen.cpp',
+ '../util/gles_loader_autogen.h',
+ '../util/windows/wgl_loader_autogen.cpp',
+ '../util/windows/wgl_loader_autogen.h',
+ ]
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
gen_libegl_loader()
gen_gl_loader()
gen_egl_loader()
gen_wgl_loader()
+ return 0
libegl_preamble = """#include <EGL/egl.h>
diff --git a/chromium/third_party/angle/scripts/gl_angle_ext.xml b/chromium/third_party/angle/scripts/gl_angle_ext.xml
index 121ec91966e..db7a7c7daef 100644
--- a/chromium/third_party/angle/scripts/gl_angle_ext.xml
+++ b/chromium/third_party/angle/scripts/gl_angle_ext.xml
@@ -798,24 +798,6 @@
<param><ptype>GLuint64 *</ptype> <name>params</name></param>
</command>
<command>
- <proto>void <name>glFramebufferTextureMultiviewLayeredANGLE</name></proto>
- <param><ptype>GLenum</ptype> <name>target</name></param>
- <param><ptype>GLenum</ptype> <name>attachment</name></param>
- <param><ptype>GLuint</ptype> <name>texture</name></param>
- <param><ptype>GLint</ptype> <name>level</name></param>
- <param><ptype>GLint</ptype> <name>baseViewIndex</name></param>
- <param><ptype>GLsizei</ptype> <name>numViews</name></param>
- </command>
- <command>
- <proto>void <name>glFramebufferTextureMultiviewSideBySideANGLE</name></proto>
- <param><ptype>GLenum</ptype> <name>target</name></param>
- <param><ptype>GLenum</ptype> <name>attachment</name></param>
- <param><ptype>GLuint</ptype> <name>texture</name></param>
- <param><ptype>GLint</ptype> <name>level</name></param>
- <param><ptype>GLsizei</ptype> <name>numViews</name></param>
- <param><ptype>const GLint *</ptype> <name>viewportOffsets</name></param>
- </command>
- <command>
<proto>void <name>glCopyTexture3DANGLE</name></proto>
<param><ptype>GLuint</ptype> <name>sourceId</name></param>
<param><ptype>GLint</ptype> <name>sourceLevel</name></param>
@@ -918,6 +900,11 @@
<proto>void <name>glProvokingVertexANGLE</name></proto>
<param group="VertexProvokingMode"><ptype>GLenum</ptype> <name>mode</name></param>
</command>
+ <command>
+ <proto>void <name>glLoseContextCHROMIUM</name></proto>
+ <param group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>current</name></param>
+ <param group="GraphicsResetStatus"><ptype>GLenum</ptype> <name>other</name></param>
+ </command>
</commands>
<!-- SECTION: ANGLE extension interface definitions -->
<extensions>
@@ -1044,12 +1031,6 @@
<command name="glGetQueryObjectui64vRobustANGLE"/>
</require>
</extension>
- <extension name="GL_ANGLE_multiview" supported='gles2'>
- <require>
- <command name="glFramebufferTextureMultiviewSideBySideANGLE"/>
- <command name="glFramebufferTextureMultiviewLayeredANGLE"/>
- </require>
- </extension>
<extension name="GL_ANGLE_copy_texture_3d" supported='gles2'>
<require>
<command name="glCopyTexture3DANGLE"/>
@@ -1081,5 +1062,13 @@
<command name="glProvokingVertexANGLE"/>
</require>
</extension>
+ <extension name="GL_CHROMIUM_lose_context" supported='gles2'>
+ <require>
+ <enum name="GL_GUILTY_CONTEXT_RESET"/>
+ <enum name="GL_INNOCENT_CONTEXT_RESET"/>
+ <enum name="GL_UNKNOWN_CONTEXT_RESET"/>
+ <command name="glLoseContextCHROMIUM"/>
+ </require>
+ </extension>
</extensions>
</registry>
diff --git a/chromium/third_party/angle/scripts/registry_xml.py b/chromium/third_party/angle/scripts/registry_xml.py
index c4deaaf6b0b..56f85a6d7d2 100644
--- a/chromium/third_party/angle/scripts/registry_xml.py
+++ b/chromium/third_party/angle/scripts/registry_xml.py
@@ -20,9 +20,9 @@ angle_extensions = [
"GL_CHROMIUM_path_rendering",
"GL_CHROMIUM_copy_texture",
"GL_CHROMIUM_copy_compressed_texture",
+ "GL_CHROMIUM_lose_context",
"GL_ANGLE_request_extension",
"GL_ANGLE_robust_client_memory",
- "GL_ANGLE_multiview",
"GL_ANGLE_copy_texture_3d",
]
@@ -52,8 +52,12 @@ supported_extensions = sorted(angle_extensions + gles1_extensions + [
"GL_EXT_geometry_shader",
"GL_EXT_instanced_arrays",
"GL_EXT_map_buffer_range",
+ "GL_EXT_memory_object",
+ "GL_EXT_memory_object_fd",
"GL_EXT_occlusion_query_boolean",
"GL_EXT_robustness",
+ "GL_EXT_semaphore",
+ "GL_EXT_semaphore_fd",
"GL_EXT_texture_storage",
"GL_KHR_debug",
"GL_NV_fence",
@@ -63,6 +67,8 @@ supported_extensions = sorted(angle_extensions + gles1_extensions + [
"GL_OES_texture_border_clamp",
"GL_OES_texture_storage_multisample_2d_array",
"GL_OES_vertex_array_object",
+ "GL_OVR_multiview",
+ "GL_OVR_multiview2",
"GL_KHR_parallel_shader_compile",
"GL_ANGLE_multi_draw",
])
diff --git a/chromium/third_party/angle/scripts/run_code_generation.py b/chromium/third_party/angle/scripts/run_code_generation.py
index 0f65a4ce9ee..b622eac4b1a 100755
--- a/chromium/third_party/angle/scripts/run_code_generation.py
+++ b/chromium/third_party/angle/scripts/run_code_generation.py
@@ -13,7 +13,7 @@ import os
import subprocess
import sys
-script_dir = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))
+script_dir = sys.path[0]
root_dir = os.path.abspath(os.path.join(script_dir, '..'))
# auto_script is a standard way for scripts to return their inputs and outputs.
@@ -26,140 +26,70 @@ def get_child_script_dirname(script):
def clean_path_slashes(path):
return path.replace("\\", "/")
-# Takes a script input file name which is relative to the code generation script's directory and
+# Takes a script file name which is relative to the code generation script's directory and
# changes it to be relative to the angle root directory
-def rebase_script_input_path(script_path, input_file_path):
- return os.path.relpath(os.path.join(os.path.dirname(script_path), input_file_path), root_dir);
+def rebase_script_path(script_path, relative_path):
+ return os.path.relpath(os.path.join(os.path.dirname(script_path), relative_path), root_dir)
def grab_from_script(script, param):
res = subprocess.check_output(['python', script, param]).strip()
- return [clean_path_slashes(rebase_script_input_path(script, name)) for name in res.split(',')]
+ if res == '':
+ return []
+ return [clean_path_slashes(rebase_script_path(script, name)) for name in res.split(',')]
def auto_script(script):
# Set the CWD to the script directory.
os.chdir(get_child_script_dirname(script))
base_script = os.path.basename(script)
- return {
- 'script': script,
+ info = {
'inputs': grab_from_script(base_script, 'inputs'),
+ 'outputs': grab_from_script(base_script, 'outputs')
}
+ # Reset the CWD to the root ANGLE directory.
+ os.chdir(root_dir)
+ return info
hash_fname = "run_code_generation_hashes.json"
-# TODO(jmadill): Convert everyting to auto-script.
generators = {
- 'ANGLE format': {
- 'inputs': [
- 'src/libANGLE/renderer/angle_format.py',
- 'src/libANGLE/renderer/angle_format_data.json',
- 'src/libANGLE/renderer/angle_format_map.json',
- ],
- 'script': 'src/libANGLE/renderer/gen_angle_format_table.py',
- },
- 'ANGLE load functions table': {
- 'inputs': [
- 'src/libANGLE/renderer/load_functions_data.json',
- ],
- 'script': 'src/libANGLE/renderer/gen_load_functions_table.py',
- },
- 'D3D11 blit shader selection': {
- 'inputs': [],
- 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py',
- },
- 'D3D11 format': {
- 'inputs': [
- 'src/libANGLE/renderer/angle_format.py',
- 'src/libANGLE/renderer/d3d/d3d11/texture_format_data.json',
- 'src/libANGLE/renderer/d3d/d3d11/texture_format_map.json',
- ],
- 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py',
- },
- 'DXGI format': {
- 'inputs': [
- 'src/libANGLE/renderer/angle_format.py',
- 'src/libANGLE/renderer/angle_format_map.json',
- 'src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json',
- 'src/libANGLE/renderer/gen_angle_format_table.py',
- ],
- 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py',
- },
- 'DXGI format support': {
- 'inputs': [
- 'src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json',
- ],
- 'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py',
- },
+ 'ANGLE format':
+ 'src/libANGLE/renderer/gen_angle_format_table.py',
+ 'ANGLE load functions table':
+ 'src/libANGLE/renderer/gen_load_functions_table.py',
+ 'D3D11 blit shader selection':
+ 'src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py',
+ 'D3D11 format':
+ 'src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py',
+ 'DXGI format':
+ 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py',
+ 'DXGI format support':
+ 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py',
+ 'GL copy conversion table':
+ 'src/libANGLE/gen_copy_conversion_table.py',
'GL/EGL/WGL loader':
- auto_script('scripts/generate_loader.py'),
+ 'scripts/generate_loader.py',
'GL/EGL entry points':
- auto_script('scripts/generate_entry_points.py'),
- 'GL copy conversion table': {
- 'inputs': [
- 'src/libANGLE/es3_copy_conversion_formats.json',
- ],
- 'script': 'src/libANGLE/gen_copy_conversion_table.py',
- },
- 'GL format map': {
- 'inputs': [
- 'src/libANGLE/es3_format_type_combinations.json',
- 'src/libANGLE/format_map_data.json',
- ],
- 'script': 'src/libANGLE/gen_format_map.py',
- },
- 'uniform type': {
- 'inputs': [],
- 'script': 'src/common/gen_uniform_type_table.py',
- },
- 'OpenGL dispatch table': {
- 'inputs': [
- 'scripts/gl.xml',
- ],
- 'script': 'src/libANGLE/renderer/gl/generate_gl_dispatch_table.py',
- },
- 'packed enum': {
- 'inputs': [
- 'src/common/packed_gl_enums.json',
- 'src/common/packed_egl_enums.json',
- ],
- 'script': 'src/common/gen_packed_gl_enums.py',
- },
- 'proc table': {
- 'inputs': [
- 'src/libGLESv2/proc_table_data.json',
- ],
- 'script': 'src/libGLESv2/gen_proc_table.py',
- },
- 'Vulkan format': {
- 'inputs': [
- 'src/libANGLE/renderer/angle_format.py',
- 'src/libANGLE/renderer/angle_format_map.json',
- 'src/libANGLE/renderer/vulkan/vk_format_map.json',
- ],
- 'script': 'src/libANGLE/renderer/vulkan/gen_vk_format_table.py',
- },
- 'Vulkan mandatory format support table': {
- 'inputs': [
- 'src/libANGLE/renderer/angle_format.py',
- 'third_party/vulkan-headers/src/registry/vk.xml',
- 'src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json',
- ],
- 'script': 'src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py',
- },
+ 'scripts/generate_entry_points.py',
+ 'GL format map':
+ 'src/libANGLE/gen_format_map.py',
+ 'uniform type':
+ 'src/common/gen_uniform_type_table.py',
+ 'OpenGL dispatch table':
+ 'src/libANGLE/renderer/gl/generate_gl_dispatch_table.py',
+ 'packed enum':
+ 'src/common/gen_packed_gl_enums.py',
+ 'proc table':
+ 'src/libGLESv2/gen_proc_table.py',
+ 'Vulkan format':
+ 'src/libANGLE/renderer/vulkan/gen_vk_format_table.py',
+ 'Vulkan mandatory format support table':
+ 'src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py',
'Vulkan internal shader programs':
- auto_script('src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py'),
- 'Emulated HLSL functions': {
- 'inputs': [
- 'src/compiler/translator/emulated_builtin_function_data_hlsl.json'
- ],
- 'script': 'src/compiler/translator/gen_emulated_builtin_function_tables.py'
- },
- 'ESSL static builtins': {
- 'inputs': [
- 'src/compiler/translator/builtin_function_declarations.txt',
- 'src/compiler/translator/builtin_variables.json',
- ],
- 'script': 'src/compiler/translator/gen_builtin_symbols.py',
- },
+ 'src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py',
+ 'Emulated HLSL functions':
+ 'src/compiler/translator/gen_emulated_builtin_function_tables.py',
+ 'ESSL static builtins':
+ 'src/compiler/translator/gen_builtin_symbols.py',
}
@@ -171,25 +101,42 @@ def md5(fname):
return hash_md5.hexdigest()
-def any_input_dirty(name, inputs, new_hashes, old_hashes):
- found_dirty_input = False
- for finput in inputs:
- key = name + ":" + finput
- new_hashes[key] = md5(finput)
- if (not key in old_hashes) or (old_hashes[key] != new_hashes[key]):
- found_dirty_input = True
- return found_dirty_input
+def any_hash_dirty(name, filenames, new_hashes, old_hashes):
+ found_dirty_hash = False
+ for filename in filenames:
+ key = name + ":" + filename
+ if not os.path.isfile(filename):
+ print('Could not find %s for %s' % (filename, name))
+ found_dirty_hash = True
+ else:
+ new_hashes[key] = md5(filename)
+ if (not key in old_hashes) or (old_hashes[key] != new_hashes[key]):
+ found_dirty_hash = True
+ return found_dirty_hash
def any_old_hash_missing(new_hashes, old_hashes):
+ result = False
for name, _ in old_hashes.iteritems():
if name not in new_hashes:
- return True
- return False
+ script, file = name.split(':')
+ print('%s missing from generated hashes for %s.' % (file, script))
+ result = True
+ return result
+
+
+def update_output_hashes(script, outputs, new_hashes):
+ for output in outputs:
+ if not os.path.isfile(output):
+ print('Output is missing from %s: %s' % (script, output))
+ sys.exit(1)
+ key = script + ":" + output
+ new_hashes[key] = md5(output)
def main():
os.chdir(script_dir)
+
old_hashes = json.load(open(hash_fname))
new_hashes = {}
any_dirty = False
@@ -198,13 +145,10 @@ def main():
if len(sys.argv) > 1 and sys.argv[1] == '--verify-no-dirty':
verify_only = True
- for name, info in sorted(generators.iteritems()):
-
- # Reset the CWD to the root ANGLE directory.
- os.chdir(root_dir)
- script = info['script']
-
- if any_input_dirty(name, info['inputs'] + [script], new_hashes, old_hashes):
+ for name, script in sorted(generators.iteritems()):
+ info = auto_script(script)
+ filenames = info['inputs'] + info['outputs'] + [script]
+ if any_hash_dirty(name, filenames, new_hashes, old_hashes):
any_dirty = True
if not verify_only:
@@ -233,6 +177,11 @@ def main():
print('Calling git cl format')
subprocess.call(args)
+ # Update the output hashes again since they can be formatted.
+ for name, script in sorted(generators.iteritems()):
+ info = auto_script(script)
+ update_output_hashes(name, info['outputs'], new_hashes)
+
os.chdir(script_dir)
json.dump(new_hashes, open(hash_fname, "w"), indent=2, sort_keys=True,
separators=(',', ':\n '))
diff --git a/chromium/third_party/angle/scripts/run_code_generation_hashes.json b/chromium/third_party/angle/scripts/run_code_generation_hashes.json
index ed63b87e3a3..3cb8f885f45 100644
--- a/chromium/third_party/angle/scripts/run_code_generation_hashes.json
+++ b/chromium/third_party/angle/scripts/run_code_generation_hashes.json
@@ -1,4 +1,8 @@
{
+ "ANGLE format:src/libANGLE/renderer/FormatID_autogen.h":
+ "083c08bb743bf72a900079890b14184f",
+ "ANGLE format:src/libANGLE/renderer/Format_table_autogen.cpp":
+ "a4cf00b75621bc058c4a1b341bdf6989",
"ANGLE format:src/libANGLE/renderer/angle_format.py":
"b18ca0fe4835114a4a2f54977b19e798",
"ANGLE format:src/libANGLE/renderer/angle_format_data.json":
@@ -6,121 +10,381 @@
"ANGLE format:src/libANGLE/renderer/angle_format_map.json":
"be9f9bdbdf785dda05920146e8c55dbb",
"ANGLE format:src/libANGLE/renderer/gen_angle_format_table.py":
- "00d5b2293e79d71e8d4212d1190a6426",
+ "3d9f679b65f39ccf19bd7bdf5498f837",
"ANGLE load functions table:src/libANGLE/renderer/gen_load_functions_table.py":
- "8afc7eecce2a3ba9f0b4beacb1aa7fe2",
+ "2dcc3aa0cd700165b588cf53441e243b",
"ANGLE load functions table:src/libANGLE/renderer/load_functions_data.json":
- "4253e14cd3217f42b6fec75ee400655a",
+ "816be111bf4d1995589350dceb367315",
+ "ANGLE load functions table:src/libANGLE/renderer/load_functions_table_autogen.cpp":
+ "e6d34c18d41d3a9259f6a3e3ff6e40ff",
+ "D3D11 blit shader selection:src/libANGLE/renderer/d3d/d3d11/Blit11Helper_autogen.inc":
+ "f69cf03a3d868a977fad9e9c0eb0652a",
+ "D3D11 blit shader selection:src/libANGLE/renderer/d3d/d3d11/d3d11_blit_shaders_autogen.gni":
+ "329dbafc64b0cb578348819198abcfea",
"D3D11 blit shader selection:src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py":
- "fa59a0edd32890a018a7247e0484426c",
+ "38bff72bc17ac25c6b42c98d40c76e20",
"D3D11 format:src/libANGLE/renderer/angle_format.py":
"b18ca0fe4835114a4a2f54977b19e798",
"D3D11 format:src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py":
- "15fb2a9b3f81e39a22090bce2f071185",
+ "d3260e0390ad2cd8b07420b7426fad43",
"D3D11 format:src/libANGLE/renderer/d3d/d3d11/texture_format_data.json":
"d7483ece817e819588f4ca157716dc7b",
"D3D11 format:src/libANGLE/renderer/d3d/d3d11/texture_format_map.json":
"805d30e2443935e3a3bd68839699e171",
+ "D3D11 format:src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp":
+ "7c42f9e538cb675d13f8b5d2f248ef84",
"DXGI format support:src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json":
"09195053f8829fc81efe08229b54a8b5",
+ "DXGI format support:src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp":
+ "7ec32ce0ad41450be7493c1db1130e25",
"DXGI format support:src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py":
- "30158f76e168e014a1bee3925cd5910a",
+ "389a6358534ebad5e232a44944b6123b",
"DXGI format:src/libANGLE/renderer/angle_format.py":
"b18ca0fe4835114a4a2f54977b19e798",
"DXGI format:src/libANGLE/renderer/angle_format_map.json":
"be9f9bdbdf785dda05920146e8c55dbb",
"DXGI format:src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json":
"24f525b05dc665fbbc8c6d68fb863719",
+ "DXGI format:src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp":
+ "32b9860e3fd8e87a89ff9a09e848e516",
"DXGI format:src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py":
- "8ea01df6cb7f160772d3c85dd5164890",
- "DXGI format:src/libANGLE/renderer/gen_angle_format_table.py":
- "00d5b2293e79d71e8d4212d1190a6426",
+ "bed2688ca828fc9fd1904408d33ba007",
+ "ESSL static builtins:src/compiler/translator/ParseContext_autogen.h":
+ "6be7f97ce68aa5ba5ecf30b835bc344d",
+ "ESSL static builtins:src/compiler/translator/SymbolTable_autogen.cpp":
+ "f3b75261653cf1729b11afcee7294494",
+ "ESSL static builtins:src/compiler/translator/SymbolTable_autogen.h":
+ "bdb3c8eab0d48267a2f264e3af635e1a",
"ESSL static builtins:src/compiler/translator/builtin_function_declarations.txt":
"e5e567406476306ea06984d885be028d",
+ "ESSL static builtins:src/compiler/translator/builtin_symbols_hash_autogen.txt":
+ "e60e2185718a035adfd19ab91536fdb7",
"ESSL static builtins:src/compiler/translator/builtin_variables.json":
- "d07ec4348b35d0db1eeab3c99a5e91f9",
+ "a8f3d76c3c395e8f6a35dd22eb2e8416",
"ESSL static builtins:src/compiler/translator/gen_builtin_symbols.py":
- "932aafd053b3a64affdc7ad31d0a3c42",
+ "f056dba2fdeac5a5dbad9d8f7b17f55f",
+ "ESSL static builtins:src/compiler/translator/tree_util/BuiltIn_autogen.h":
+ "6df5ab6576da4f364763b581da839b77",
+ "ESSL static builtins:src/tests/compiler_tests/ImmutableString_test_autogen.cpp":
+ "c7994179a311f152df4b4a8513211c87",
"Emulated HLSL functions:src/compiler/translator/emulated_builtin_function_data_hlsl.json":
"002ad46d144c51fe98d73478aa554ba7",
+ "Emulated HLSL functions:src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp":
+ "1c759ffdd27a86fd8f2d590b2f3dcb56",
"Emulated HLSL functions:src/compiler/translator/gen_emulated_builtin_function_tables.py":
- "6a00c1ba22c35a9b700a154efda6f861",
+ "c24de0c9ce5f201985c852d2b4b12b98",
"GL copy conversion table:src/libANGLE/es3_copy_conversion_formats.json":
"54608f6f7d9aa7c59a8458ccf3ab9935",
+ "GL copy conversion table:src/libANGLE/es3_copy_conversion_table_autogen.cpp":
+ "b20d198cf5e292c43170d4873b381b34",
"GL copy conversion table:src/libANGLE/gen_copy_conversion_table.py":
- "ac1afe23d9578bd1d2ef74f4a7aa927a",
+ "92428cef9d97d33ee7063cfa387ccf56",
"GL format map:src/libANGLE/es3_format_type_combinations.json":
"a232823cd6430f14e28793ccabb968ee",
+ "GL format map:src/libANGLE/format_map_autogen.cpp":
+ "1e1b1c2af35a8a75c4395430d2370758",
"GL format map:src/libANGLE/format_map_data.json":
"779798d4879e5f73a5a108e3e3fd3095",
"GL format map:src/libANGLE/gen_format_map.py":
- "a383ee79a7bf929d145165f3e76c1079",
+ "0fd8c00e8b5afb28a5f8b40d9628b9a4",
"GL/EGL entry points:scripts/egl.xml":
"842e24514c4cfe09fba703c17a0fd292",
"GL/EGL entry points:scripts/egl_angle_ext.xml":
"745534010f31fbe8e1a1fcddce15ed2d",
"GL/EGL entry points:scripts/entry_point_packed_gl_enums.json":
- "afe2284956be2360463d0d036ad9cdde",
+ "28238b0f52826c3794eaa1aa940238bf",
"GL/EGL entry points:scripts/generate_entry_points.py":
- "a959669b31f086510fb60c5b55de56d1",
+ "728b042a1845e8b24f5e992831193920",
"GL/EGL entry points:scripts/gl.xml":
"b470cb06b06cbbe7adb2c8129ec85708",
"GL/EGL entry points:scripts/gl_angle_ext.xml":
- "56fb2634ebb3d8240b1a92aeb5518f1a",
+ "11e1eb2cbe51ae6e7b8705d3506846d5",
"GL/EGL entry points:scripts/registry_xml.py":
- "be6628bdeb99e50868cf4af51ea63f54",
+ "3b9a36e0be051dc5b4e5162d54749e49",
+ "GL/EGL entry points:src/libANGLE/Context_gles_1_0_autogen.h":
+ "fad4ec629b41e9d97ff57a132ad946cb",
+ "GL/EGL entry points:src/libANGLE/validationES1_autogen.h":
+ "8d3131d2bf2e6f521f46b44e64a6bff9",
+ "GL/EGL entry points:src/libANGLE/validationES2_autogen.h":
+ "edf0d7d2afdfd6c090f83d40312394ad",
+ "GL/EGL entry points:src/libANGLE/validationES31_autogen.h":
+ "22ef241ea5b79a6abe6589f1afcc80a2",
+ "GL/EGL entry points:src/libANGLE/validationES3_autogen.h":
+ "4617942e5bf67fa5e35675daf66afc5c",
+ "GL/EGL entry points:src/libANGLE/validationESEXT_autogen.h":
+ "d7777a2ca9aea09ae46fd39088206bfc",
+ "GL/EGL entry points:src/libGLESv2/entry_points_enum_autogen.h":
+ "296e06c9ced6c5a9a2b0c54370be8a04",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_1_0_autogen.cpp":
+ "196771da8ad7a5beded1dc878410ac11",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_1_0_autogen.h":
+ "77fa8d307ebf839838f8812786cddc1a",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_2_0_autogen.cpp":
+ "d0be11a3780b0c348279fc36060d1fab",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_2_0_autogen.h":
+ "3bbaf1cf42fba5d675e5b54cd1d14df7",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_0_autogen.cpp":
+ "dfaddd183b8560a49ae8f21b14d484d3",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_0_autogen.h":
+ "395f6978219abd5182bbe80cc367e40c",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_1_autogen.cpp":
+ "72188430258b99258cef9048f0f4b4ee",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_3_1_autogen.h":
+ "043d09a964c740067bf4279e0b544aed",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_ext_autogen.cpp":
+ "de95abd89e4aa6f615d5313e9291183d",
+ "GL/EGL entry points:src/libGLESv2/entry_points_gles_ext_autogen.h":
+ "eb5e13e2da6e217068ae949e900487a0",
+ "GL/EGL entry points:src/libGLESv2/libGLESv2_autogen.cpp":
+ "c99457bcd86a5b94c61185c1bcddfdcb",
+ "GL/EGL entry points:src/libGLESv2/libGLESv2_autogen.def":
+ "f92d6246265e21a5ed7d949d9de1e26e",
"GL/EGL/WGL loader:scripts/egl.xml":
"842e24514c4cfe09fba703c17a0fd292",
"GL/EGL/WGL loader:scripts/egl_angle_ext.xml":
"745534010f31fbe8e1a1fcddce15ed2d",
"GL/EGL/WGL loader:scripts/generate_loader.py":
- "2d9be1d0f4f54905f3372411522133d1",
+ "475030714c1644b6dfb1f6f08572039d",
"GL/EGL/WGL loader:scripts/registry_xml.py":
- "be6628bdeb99e50868cf4af51ea63f54",
+ "3b9a36e0be051dc5b4e5162d54749e49",
"GL/EGL/WGL loader:scripts/wgl.xml":
"aa96419c582af2f6673430e2847693f4",
+ "GL/EGL/WGL loader:src/libEGL/egl_loader_autogen.cpp":
+ "d270ee9f0b0bcbb58f3a8967758d9b38",
+ "GL/EGL/WGL loader:src/libEGL/egl_loader_autogen.h":
+ "77d0a6b43528115ea2ce3a987b25fa91",
+ "GL/EGL/WGL loader:util/egl_loader_autogen.cpp":
+ "d397c5b251c10f44857c9098eab5f9a2",
+ "GL/EGL/WGL loader:util/egl_loader_autogen.h":
+ "897a66bc15e1791e356d7324f2ff94af",
+ "GL/EGL/WGL loader:util/gles_loader_autogen.cpp":
+ "34056ce8d9c18d3cdcd23e16b94508c4",
+ "GL/EGL/WGL loader:util/gles_loader_autogen.h":
+ "0ee94fbf54d7ae8b56d4fabc478fd31e",
+ "GL/EGL/WGL loader:util/windows/wgl_loader_autogen.cpp":
+ "12ffb44e5e743c826e4d84ac65cdba82",
+ "GL/EGL/WGL loader:util/windows/wgl_loader_autogen.h":
+ "e18f6c134b709c5a69ed3b4ff38642d0",
"OpenGL dispatch table:scripts/gl.xml":
"b470cb06b06cbbe7adb2c8129ec85708",
+ "OpenGL dispatch table:src/libANGLE/renderer/angle_format.py":
+ "b18ca0fe4835114a4a2f54977b19e798",
+ "OpenGL dispatch table:src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp":
+ "96d06b3acf7826aee1ec813a8fa3a867",
+ "OpenGL dispatch table:src/libANGLE/renderer/gl/DispatchTableGL_autogen.h":
+ "ea5eded625b5db7d7b2b7f689c72f14b",
"OpenGL dispatch table:src/libANGLE/renderer/gl/generate_gl_dispatch_table.py":
- "f527232452ecf930cfb1276883581342",
+ "7571edb9e610891ed0c95dc496120cff",
+ "OpenGL dispatch table:src/libANGLE/renderer/gl/gl_bindings_data.json":
+ "1afca09d29ed7788c76cbc9bcfb4de0a",
+ "OpenGL dispatch table:src/libANGLE/renderer/gl/null_functions.cpp":
+ "5470d6b1d7057d797e15b986a31e196e",
+ "OpenGL dispatch table:src/libANGLE/renderer/gl/null_functions.h":
+ "7906751710cab691f9e7365e59b7beed",
"Vulkan format:src/libANGLE/renderer/angle_format.py":
"b18ca0fe4835114a4a2f54977b19e798",
"Vulkan format:src/libANGLE/renderer/angle_format_map.json":
"be9f9bdbdf785dda05920146e8c55dbb",
"Vulkan format:src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
- "61a7752424595e24edff0c1f1784e18e",
+ "c1f153d67fa50e5f6683170c83b610d4",
"Vulkan format:src/libANGLE/renderer/vulkan/vk_format_map.json":
- "992749b88763adb66003fe5d801b5ded",
+ "a6522dc0af17eebfee8b3d6d4723594f",
+ "Vulkan format:src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
+ "34dcf4f106f94b03f74c9fd08b22f6ed",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py":
- "1c64f7187357d7561c984ec57d251e74",
+ "1262e5e903c7dad214ded83625f9d3c4",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc":
+ "caa03e84d757844a099d0e408a162c7e",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc":
+ "e5de095f618b4c5a3f95a0933fac99b8",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc":
+ "92be0607996ec71596011ae627d1c014",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc":
+ "6514d0995cdeb9106ae13c638f09ff2d",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc":
+ "46fe870e1d4dfb51727475f15c5a8696",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc":
+ "6a6ecd244c5c0db9eb4987ffaa753418",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc":
+ "dbf87695a067c39af53555d89b583022",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc":
+ "eb6ee24de79771edeb2841442362c51a",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc":
+ "7f32ffa7aac75052911555856088fffa",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc":
+ "1d4f8238c97aa8f0b6cbd358c2b5113f",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc":
+ "d4a5d3182f4b4d8e73d2c20657111cb1",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc":
+ "23db7e8e3818a3970d9a89f83b67c01a",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc":
+ "213a2b787f8844ddb76bd4b155cbb9c2",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc":
+ "17b71f1b9a22ed05357f1409f7ff8945",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc":
+ "fc1d4efe95ef97aea9692bb81a368ba6",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc":
+ "91989c25edcb1ea87585a38ee5639760",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc":
+ "5258597cfae463579ad5dd389ed6640b",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc":
+ "5e1e5572e214d9920ac0b917147a5a18",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc":
+ "d39d7c29b08dd9ce3c8819e9d1ca8d02",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc":
+ "f25152b2ad944d39695fe7dadd86e660",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc":
+ "3bd0e4958dbc9d1bbe7e1c613774cb5b",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc":
+ "9845efd3073ddf7a10b71e225e1d8412",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc":
+ "e15c71e7e6691929fd6cfa91f9f2225f",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc":
+ "a45fbca55c9e0e8ebeff1361381b837a",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc":
+ "b772949f6235efde9f8f046e919024aa",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc":
+ "1389d5d1ca18163e458a63115f017004",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc":
+ "66d9462ac3ccbba2338e7363c6041aa7",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc":
+ "b8e930a6a7357e99476f05cc13436795",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc":
+ "e0baef7dbb3d37d9220fe5c47b699903",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc":
+ "c0574d0edec329664ababf8390f0f8d7",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc":
+ "40a0d8489dafa815b0b9a1ca7a796583",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc":
+ "cce2d3897ae18cf9df3eefc9c2e08a2b",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc":
+ "76e83e0a3df1e9e64009a1de1eac6f0a",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc":
+ "9b948bda7d8e77b97fbdb334d3a45eb8",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc":
+ "271bdb4d1e3bddddeec4e422d27d6b43",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc":
+ "7da53883fadcf31d4f8616f8c7bea8a0",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc":
+ "a6465f6fb97f25b8581285691140ff83",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc":
+ "440a8ea2bb8cabd360c7c27c642ae220",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc":
+ "9e9d743e5da6943bdf98cc18e33ce5ff",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc":
+ "dedb37d1db52d3579d352c67ab8fb5c7",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc":
+ "cedcc96ae848cff331769640210fb4ca",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc":
+ "4b73e2c034d4548467a9a31ae2a330c3",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc":
+ "5a6a468b452bb8534ee9c96af8fd2298",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc":
+ "baf91a84a621705a56067644a898a984",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc":
+ "1d4a9ee861c8da792d1a207e4ee623e3",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc":
+ "913bd14e42386d7884cd4c71311c6596",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc":
+ "b6809c60e9c7b113e90cc82753818767",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc":
+ "93bf55a25b866b73e78dc1253a8eabf3",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc":
+ "d4aa885da98dde43ad94dd76742c12e6",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc":
+ "d70d2a7380efaa795bab22445119ac45",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc":
+ "ae41ff1909b9ab2cd36792d88714e6d3",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc":
+ "30b4f51388b992e976e0f8e077f12ecd",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc":
+ "d6694636d0ec7c5c6a81505412f0a790",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc":
+ "1faa58a55c16b0e9aba212c3d1967bb1",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc":
+ "7c6856d0d1fbb2f0cf136429718ea73e",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc":
+ "a45cc3d680ebcb25d20778047a4ddd2d",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc":
+ "73efe6e89967dcb26f45de624afc2d0b",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc":
+ "ef0cd7ca1246951a19ce78db185e6a91",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc":
+ "f26939cccda7d0c518391c76ad04b89b",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc":
+ "9cba7718c40fec9efa57001e8c096d51",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc":
+ "c74d02e82a51952716aa5ccf1c5f00df",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc":
+ "d6a808df6cd1a2c9c53a7a3b6fca9f51",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc":
+ "b9a74f36b35600bf10b23055ce7d3cf0",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc":
+ "0c516b1bd6d91da627957522fb4fe8aa",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc":
+ "db29024c7750f2b53db8e23b01c3b44b",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc":
+ "15f9a5a9752647caff36fb60574ce5bc",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc":
+ "6df4a84b18bd0916674f785e38d44249",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc":
+ "c06bb3eb6ed8341088d5f7fa12582a28",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc":
+ "dc5420b2fc2cde18713563878b880c7f",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc":
+ "65bb707b9a817ff4b8a2da5a4a7202b7",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc":
+ "b8ede4184815457b74e4749918236fce",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp":
"0c8c050841543da0d7faca2559212aa8",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp":
"93649f61036c2fa4739988ad71f413df",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
- "1743adf55153edf91363fa7b4350d859",
+ "805ec8b2f87d4bd4242dc5b1c58ba3b4",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag":
- "98d490413d20118e92dd2b160c1dfc6e",
+ "7f562c60e5df018b0087ecb8642ac821",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag":
- "9b9fd690321f53163221f1ebba9f006d",
+ "20c83ade1efb48a802dc34ca838a2be6",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
+ "751f3554fe613d9b4739c7a4ac87b037",
+ "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
+ "930fc6f4a705a0d2121770377d3bc764",
+ "Vulkan internal shader programs:tools/glslang/glslang_validator.exe.sha1":
+ "4e0076daa7a27051c1245b8b339ebd6d",
+ "Vulkan internal shader programs:tools/glslang/glslang_validator.sha1":
+ "ea685e0867a4b3a07ad7e4246ac84e10",
"Vulkan mandatory format support table:src/libANGLE/renderer/angle_format.py":
"b18ca0fe4835114a4a2f54977b19e798",
"Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py":
- "d647fcb39acb9a18e08e3e604b19cfee",
+ "417772416d3082400ce05acc2f209c9f",
"Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json":
"fa2bd54c1bb0ab2cf1d386061a4bc5c5",
+ "Vulkan mandatory format support table:src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp":
+ "d20e549634ef32d6ad4e9f0b28e52acf",
"Vulkan mandatory format support table:third_party/vulkan-headers/src/registry/vk.xml":
- "f5c8c9b8e521644ded34d44b1016c25e",
+ "8af0f992bd45c2d9500eb5ed60c256d6",
+ "packed enum:src/common/PackedEGLEnums_autogen.cpp":
+ "c9f7cea85751e5a39b92bccc1d97f3bd",
+ "packed enum:src/common/PackedEGLEnums_autogen.h":
+ "4073274726e0c926765c5ab8b21dc3de",
+ "packed enum:src/common/PackedGLEnums_autogen.cpp":
+ "41faf7a2b9b7a5008269f3e57bbe361d",
+ "packed enum:src/common/PackedGLEnums_autogen.h":
+ "0766f2bb7874b2b6b4aaed4a6d0ef49e",
"packed enum:src/common/gen_packed_gl_enums.py":
- "a9b1c38b4e4d8a1038e743be323f1a51",
+ "0cd1a1cb6d5fde8cbac2994db24eb901",
"packed enum:src/common/packed_egl_enums.json":
"5f591d220ee53b6e54a27d1523a3ab79",
"packed enum:src/common/packed_gl_enums.json":
- "6e2e2845f96754509b8add1f77e203b3",
+ "cd2c00958dd8cc546b816dedaf4769d3",
"proc table:src/libGLESv2/gen_proc_table.py":
- "ee265eada3dd238646010dd03874d242",
+ "20ebe54894d613de42b0b15ca34078d9",
+ "proc table:src/libGLESv2/proc_table_autogen.cpp":
+ "1e89c264adbe7120edb636013383598b",
"proc table:src/libGLESv2/proc_table_data.json":
- "6deb74c7709ecb664b917a2f1e598399",
+ "04123621b8fd5e6d18f9f3c95c190693",
"uniform type:src/common/gen_uniform_type_table.py":
- "e185802e66950dfc5fc7a8fc19751206"
+ "fa40444d496ac07cd9dc0cd239e4a499",
+ "uniform type:src/common/uniform_type_info_autogen.cpp":
+ "b31d181bc49ad1c3540401a5c874e692"
} \ No newline at end of file
diff --git a/chromium/third_party/angle/scripts/trigger.bat b/chromium/third_party/angle/scripts/trigger.bat
new file mode 100644
index 00000000000..a2d00d65939
--- /dev/null
+++ b/chromium/third_party/angle/scripts/trigger.bat
@@ -0,0 +1 @@
+@python %~dp0\trigger.py %*
diff --git a/chromium/third_party/angle/scripts/trigger.py b/chromium/third_party/angle/scripts/trigger.py
new file mode 100644
index 00000000000..f8421ef564f
--- /dev/null
+++ b/chromium/third_party/angle/scripts/trigger.py
@@ -0,0 +1,71 @@
+#!/usr/bin/python2
+#
+# Copyright 2019 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# trigger.py:
+# Helper script for triggering GPU tests on swarming.
+
+import argparse
+import os
+import subprocess
+import sys
+
+
+def parse_args():
+ parser = argparse.ArgumentParser(os.path.basename(sys.argv[0]))
+ parser.add_argument('gn_path', help='path to GN. (e.g. out/Release)')
+ parser.add_argument('test', help='test name. (e.g. angle_end2end_tests)')
+ parser.add_argument('os_dim', help='OS dimension. (e.g. Windows-10)')
+ parser.add_argument('gpu_dim', help='GPU dimension. (e.g. intel-hd-630-win10-stable)')
+ parser.add_argument('-s', '--shards', default=1, help='number of shards', type=int)
+ parser.add_argument('-p', '--pool', default='Chrome-GPU', help='swarming pool')
+ parser.add_argument('extra_args', help='extra test command line arguments', nargs='*')
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+ path = args.gn_path.replace('\\', '/')
+ out_gn_path = '//' + path
+ out_file_path = os.path.join(*path.split('/'))
+
+ mb_script_path = os.path.join('tools', 'mb', 'mb.py')
+ subprocess.call(['python', mb_script_path, 'isolate', out_gn_path, args.test])
+
+ isolate_script_path = os.path.join('tools', 'swarming_client', 'isolate.py')
+ isolate_file = os.path.join(out_file_path, '%s.isolate' % args.test)
+ isolated_file = os.path.join(out_file_path, '%s.isolated' % args.test)
+
+ isolate_args = [
+ 'python', isolate_script_path, 'archive',
+ '-I', 'https://isolateserver.appspot.com',
+ '-i', isolate_file,
+ '-s', isolated_file]
+ stdout = subprocess.check_output(isolate_args)
+ sha = stdout[:40]
+
+ print('Got an isolated SHA of %s' % sha)
+ swarming_script_path = os.path.join('tools', 'swarming_client', 'swarming.py')
+
+ swarmings_args = [
+ 'python', swarming_script_path, 'trigger',
+ '-S', 'chromium-swarm.appspot.com',
+ '-I', 'isolateserver.appspot.com',
+ '-d', 'os', args.os_dim,
+ '-d', 'pool', args.pool,
+ '-d', 'gpu', args.gpu_dim,
+ '--shards=%d' % args.shards,
+ '-s', sha]
+
+ if args.extra_args:
+ swarmings_args += ['--'] + args.extra_args
+
+ print(' '.join(swarmings_args))
+ subprocess.call(swarmings_args)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/common/PackedEnums.cpp b/chromium/third_party/angle/src/common/PackedEnums.cpp
index 805c3b821cf..60cc785bc6d 100644
--- a/chromium/third_party/angle/src/common/PackedEnums.cpp
+++ b/chromium/third_party/angle/src/common/PackedEnums.cpp
@@ -38,6 +38,8 @@ TextureType TextureTargetToType(TextureTarget target)
return TextureType::_2DMultisampleArray;
case TextureTarget::_3D:
return TextureType::_3D;
+ case TextureTarget::InvalidEnum:
+ return TextureType::InvalidEnum;
default:
UNREACHABLE();
return TextureType::InvalidEnum;
diff --git a/chromium/third_party/angle/src/common/PackedGLEnums_autogen.cpp b/chromium/third_party/angle/src/common/PackedGLEnums_autogen.cpp
index 66fb9269798..81eef31425e 100644
--- a/chromium/third_party/angle/src/common/PackedGLEnums_autogen.cpp
+++ b/chromium/third_party/angle/src/common/PackedGLEnums_autogen.cpp
@@ -336,6 +336,66 @@ GLenum ToGLenum(FogMode from)
}
template <>
+GraphicsResetStatus FromGLenum<GraphicsResetStatus>(GLenum from)
+{
+ switch (from)
+ {
+ case GL_NO_ERROR:
+ return GraphicsResetStatus::NoError;
+ case GL_GUILTY_CONTEXT_RESET:
+ return GraphicsResetStatus::GuiltyContextReset;
+ case GL_INNOCENT_CONTEXT_RESET:
+ return GraphicsResetStatus::InnocentContextReset;
+ case GL_UNKNOWN_CONTEXT_RESET:
+ return GraphicsResetStatus::UnknownContextReset;
+ default:
+ return GraphicsResetStatus::InvalidEnum;
+ }
+}
+
+GLenum ToGLenum(GraphicsResetStatus from)
+{
+ switch (from)
+ {
+ case GraphicsResetStatus::NoError:
+ return GL_NO_ERROR;
+ case GraphicsResetStatus::GuiltyContextReset:
+ return GL_GUILTY_CONTEXT_RESET;
+ case GraphicsResetStatus::InnocentContextReset:
+ return GL_INNOCENT_CONTEXT_RESET;
+ case GraphicsResetStatus::UnknownContextReset:
+ return GL_UNKNOWN_CONTEXT_RESET;
+ default:
+ UNREACHABLE();
+ return 0;
+ }
+}
+
+template <>
+HandleType FromGLenum<HandleType>(GLenum from)
+{
+ switch (from)
+ {
+ case GL_HANDLE_TYPE_OPAQUE_FD_EXT:
+ return HandleType::OpaqueFd;
+ default:
+ return HandleType::InvalidEnum;
+ }
+}
+
+GLenum ToGLenum(HandleType from)
+{
+ switch (from)
+ {
+ case HandleType::OpaqueFd:
+ return GL_HANDLE_TYPE_OPAQUE_FD_EXT;
+ default:
+ UNREACHABLE();
+ return 0;
+ }
+}
+
+template <>
HintSetting FromGLenum<HintSetting>(GLenum from)
{
switch (from)
diff --git a/chromium/third_party/angle/src/common/PackedGLEnums_autogen.h b/chromium/third_party/angle/src/common/PackedGLEnums_autogen.h
index 7d8b4fbbbd5..cd65115097f 100644
--- a/chromium/third_party/angle/src/common/PackedGLEnums_autogen.h
+++ b/chromium/third_party/angle/src/common/PackedGLEnums_autogen.h
@@ -146,6 +146,33 @@ template <>
FogMode FromGLenum<FogMode>(GLenum from);
GLenum ToGLenum(FogMode from);
+enum class GraphicsResetStatus : uint8_t
+{
+ NoError = 0,
+ GuiltyContextReset = 1,
+ InnocentContextReset = 2,
+ UnknownContextReset = 3,
+
+ InvalidEnum = 4,
+ EnumCount = 4,
+};
+
+template <>
+GraphicsResetStatus FromGLenum<GraphicsResetStatus>(GLenum from);
+GLenum ToGLenum(GraphicsResetStatus from);
+
+enum class HandleType : uint8_t
+{
+ OpaqueFd = 0,
+
+ InvalidEnum = 1,
+ EnumCount = 1,
+};
+
+template <>
+HandleType FromGLenum<HandleType>(GLenum from);
+GLenum ToGLenum(HandleType from);
+
enum class HintSetting : uint8_t
{
DontCare = 0,
diff --git a/chromium/third_party/angle/src/common/PoolAlloc.cpp b/chromium/third_party/angle/src/common/PoolAlloc.cpp
index a340f083c64..b6e3702f8f4 100644
--- a/chromium/third_party/angle/src/common/PoolAlloc.cpp
+++ b/chromium/third_party/angle/src/common/PoolAlloc.cpp
@@ -15,6 +15,7 @@
#include "common/angleutils.h"
#include "common/debug.h"
+#include "common/mathutil.h"
#include "common/platform.h"
#include "common/tls.h"
@@ -36,42 +37,48 @@ PoolAllocator::PoolAllocator(int growthIncrement, int allocationAlignment)
#endif
mLocked(false)
{
- //
- // Adjust mAlignment to be at least pointer aligned and
- // power of 2.
- //
- size_t minAlign = sizeof(void *);
- mAlignment &= ~(minAlign - 1);
- if (mAlignment < minAlign)
- mAlignment = minAlign;
- size_t a = 1;
- while (a < mAlignment)
- a <<= 1;
- mAlignment = a;
- mAlignmentMask = a - 1;
+#if !defined(ANGLE_DISABLE_POOL_ALLOC)
+ if (mAlignment == 1)
+ {
+ // This is a special fast-path where fastAllocation() is enabled
+ mAlignmentMask = 0;
+ mHeaderSkip = sizeof(Header);
+ }
+ else
+ {
+#endif
+ //
+ // Adjust mAlignment to be at least pointer aligned and
+ // power of 2.
+ //
+ size_t minAlign = sizeof(void *);
+ mAlignment &= ~(minAlign - 1);
+ if (mAlignment < minAlign)
+ mAlignment = minAlign;
+ mAlignment = gl::ceilPow2(mAlignment);
+ mAlignmentMask = mAlignment - 1;
#if !defined(ANGLE_DISABLE_POOL_ALLOC)
+ //
+ // Align header skip
+ //
+ mHeaderSkip = minAlign;
+ if (mHeaderSkip < sizeof(Header))
+ {
+ mHeaderSkip = rx::roundUp(sizeof(Header), mAlignment);
+ }
+ }
//
// Don't allow page sizes we know are smaller than all common
// OS page sizes.
//
if (mPageSize < 4 * 1024)
mPageSize = 4 * 1024;
-
//
// A large mCurrentPageOffset indicates a new page needs to
// be obtained to allocate memory.
//
mCurrentPageOffset = mPageSize;
-
- //
- // Align header skip
- //
- mHeaderSkip = minAlign;
- if (mHeaderSkip < sizeof(Header))
- {
- mHeaderSkip = (sizeof(Header) + mAlignmentMask) & ~mAlignmentMask;
- }
#else // !defined(ANGLE_DISABLE_POOL_ALLOC)
mStack.push_back({});
#endif
@@ -262,7 +269,22 @@ void *PoolAllocator::allocate(size_t numBytes)
reinterpret_cast<void *>(reinterpret_cast<uintptr_t>(memory) + mHeaderSkip);
return std::align(mAlignment, numBytes, unalignedPtr, allocationSize);
}
+ unsigned char *newPageAddr =
+ static_cast<unsigned char *>(allocateNewPage(numBytes, allocationSize));
+ return initializeAllocation(mInUseList, newPageAddr, numBytes);
+#else // !defined(ANGLE_DISABLE_POOL_ALLOC)
+ void *alloc = malloc(numBytes + mAlignmentMask);
+ mStack.back().push_back(alloc);
+ intptr_t intAlloc = reinterpret_cast<intptr_t>(alloc);
+ intAlloc = (intAlloc + mAlignmentMask) & ~mAlignmentMask;
+ return reinterpret_cast<void *>(intAlloc);
+#endif
+}
+
+#if !defined(ANGLE_DISABLE_POOL_ALLOC)
+void *PoolAllocator::allocateNewPage(size_t numBytes, size_t allocationSize)
+{
//
// Need a simple page to allocate from.
//
@@ -278,23 +300,15 @@ void *PoolAllocator::allocate(size_t numBytes)
if (memory == 0)
return 0;
}
-
// Use placement-new to initialize header
new (memory) Header(mInUseList, 1);
mInUseList = memory;
unsigned char *ret = reinterpret_cast<unsigned char *>(mInUseList) + mHeaderSkip;
mCurrentPageOffset = (mHeaderSkip + allocationSize + mAlignmentMask) & ~mAlignmentMask;
- return initializeAllocation(mInUseList, ret, numBytes);
-#else // !defined(ANGLE_DISABLE_POOL_ALLOC)
- void *alloc = malloc(numBytes + mAlignmentMask);
- mStack.back().push_back(alloc);
-
- intptr_t intAlloc = reinterpret_cast<intptr_t>(alloc);
- intAlloc = (intAlloc + mAlignmentMask) & ~mAlignmentMask;
- return reinterpret_cast<void *>(intAlloc);
-#endif
+ return ret;
}
+#endif
void PoolAllocator::lock()
{
diff --git a/chromium/third_party/angle/src/common/PoolAlloc.h b/chromium/third_party/angle/src/common/PoolAlloc.h
index 90d165389bc..1c902bfdd75 100644
--- a/chromium/third_party/angle/src/common/PoolAlloc.h
+++ b/chromium/third_party/angle/src/common/PoolAlloc.h
@@ -38,6 +38,7 @@
#include <vector>
#include "angleutils.h"
+#include "common/debug.h"
namespace angle
{
@@ -123,6 +124,10 @@ class PoolAllocator : angle::NonCopyable
{
public:
static const int kDefaultAlignment = 16;
+ //
+ // Create PoolAllocator. If alignment is be set to 1 byte then fastAllocate()
+ // function can be used to make allocations with less overhead.
+ //
PoolAllocator(int growthIncrement = 8 * 1024, int allocationAlignment = kDefaultAlignment);
//
@@ -154,6 +159,33 @@ class PoolAllocator : angle::NonCopyable
void *allocate(size_t numBytes);
//
+ // Call fastAllocate() for a faster allocate function that does minimal bookkeeping
+ // preCondition: Allocator must have been created w/ alignment of 1
+ ANGLE_INLINE uint8_t *fastAllocate(size_t numBytes)
+ {
+#if defined(ANGLE_DISABLE_POOL_ALLOC)
+ return reinterpret_cast<uint8_t *>(allocate(numBytes));
+#else
+ ASSERT(mAlignment == 1);
+ // No multi-page allocations
+ ASSERT(numBytes <= (mPageSize - mHeaderSkip));
+ //
+ // Do the allocation, most likely case inline first, for efficiency.
+ //
+ if (numBytes <= mPageSize - mCurrentPageOffset)
+ {
+ //
+ // Safe to allocate from mCurrentPageOffset.
+ //
+ uint8_t *memory = reinterpret_cast<uint8_t *>(mInUseList) + mCurrentPageOffset;
+ mCurrentPageOffset += numBytes;
+ return memory;
+ }
+ return reinterpret_cast<uint8_t *>(allocateNewPage(numBytes, numBytes));
+#endif
+ }
+
+ //
// There is no deallocate. The point of this class is that
// deallocation can be skipped by the user of it, as the model
// of use is to simultaneously deallocate everything at once
@@ -205,6 +237,8 @@ class PoolAllocator : angle::NonCopyable
};
using AllocStack = std::vector<AllocState>;
+ // Slow path of allocation when we have to get a new page.
+ void *allocateNewPage(size_t numBytes, size_t allocationSize);
// Track allocations if and only if we're using guard blocks
void *initializeAllocation(Header *block, unsigned char *memory, size_t numBytes)
{
diff --git a/chromium/third_party/angle/src/common/angleutils.h b/chromium/third_party/angle/src/common/angleutils.h
index 7e7460a74c6..09adb588921 100644
--- a/chromium/third_party/angle/src/common/angleutils.h
+++ b/chromium/third_party/angle/src/common/angleutils.h
@@ -324,4 +324,10 @@ std::string ToString(const T &value)
# define ANGLE_NO_DISCARD
#endif // __has_cpp_attribute(nodiscard)
+#if __has_cpp_attribute(maybe_unused)
+# define ANGLE_MAYBE_UNUSED [[maybe_unused]]
+#else
+# define ANGLE_MAYBE_UNUSED
+#endif // __has_cpp_attribute(maybe_unused)
+
#endif // COMMON_ANGLEUTILS_H_
diff --git a/chromium/third_party/angle/src/common/bitset_utils.h b/chromium/third_party/angle/src/common/bitset_utils.h
index a4f25c71129..591a2609ea7 100644
--- a/chromium/third_party/angle/src/common/bitset_utils.h
+++ b/chromium/third_party/angle/src/common/bitset_utils.h
@@ -330,7 +330,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator|=(const BitSetT &
template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator^=(const BitSetT &other)
{
- mBits = (mBits ^ other.mBits) & Mask(N);
+ mBits = mBits ^ other.mBits;
return *this;
}
@@ -350,14 +350,14 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator&=(BitsT value)
template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator|=(BitsT value)
{
- mBits |= value;
+ mBits |= value & Mask(N);
return *this;
}
template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::operator^=(BitsT value)
{
- mBits ^= value;
+ mBits ^= value & Mask(N);
return *this;
}
@@ -399,7 +399,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::set(ParamT pos, bool value
{
if (value)
{
- mBits |= Bit(pos);
+ mBits |= Bit(pos) & Mask(N);
}
else
{
@@ -432,7 +432,7 @@ BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip()
template <size_t N, typename BitsT, typename ParamT>
BitSetT<N, BitsT, ParamT> &BitSetT<N, BitsT, ParamT>::flip(ParamT pos)
{
- mBits ^= Bit(pos);
+ mBits ^= Bit(pos) & Mask(N);
return *this;
}
diff --git a/chromium/third_party/angle/src/common/bitset_utils_unittest.cpp b/chromium/third_party/angle/src/common/bitset_utils_unittest.cpp
index fea451f3835..7e37ad40a71 100644
--- a/chromium/third_party/angle/src/common/bitset_utils_unittest.cpp
+++ b/chromium/third_party/angle/src/common/bitset_utils_unittest.cpp
@@ -15,6 +15,148 @@ using namespace angle;
namespace
{
+class BitSetTest : public testing::Test
+{
+ protected:
+ BitSet<12> mBits;
+};
+
+TEST_F(BitSetTest, Basic)
+{
+ EXPECT_FALSE(mBits.all());
+ EXPECT_FALSE(mBits.any());
+ EXPECT_TRUE(mBits.none());
+ EXPECT_EQ(mBits.count(), 0u);
+
+ // Set every bit to 1.
+ for (size_t i = 0; i < mBits.size(); ++i)
+ {
+ mBits.set(i);
+
+ EXPECT_EQ(mBits.all(), i + 1 == mBits.size());
+ EXPECT_TRUE(mBits.any());
+ EXPECT_FALSE(mBits.none());
+ EXPECT_EQ(mBits.count(), i + 1);
+ }
+
+ // Reset every other bit to 0.
+ for (size_t i = 0; i < mBits.size(); i += 2)
+ {
+ mBits.reset(i);
+
+ EXPECT_FALSE(mBits.all());
+ EXPECT_TRUE(mBits.any());
+ EXPECT_FALSE(mBits.none());
+ EXPECT_EQ(mBits.count(), mBits.size() - i / 2 - 1);
+ }
+
+ // Flip all bits.
+ for (size_t i = 0; i < mBits.size(); ++i)
+ {
+ mBits.flip(i);
+
+ EXPECT_FALSE(mBits.all());
+ EXPECT_TRUE(mBits.any());
+ EXPECT_FALSE(mBits.none());
+ EXPECT_EQ(mBits.count(), mBits.size() / 2 + (i % 2 == 0));
+ }
+
+ // Make sure the bit pattern is what we expect at this point.
+ for (size_t i = 0; i < mBits.size(); ++i)
+ {
+ EXPECT_EQ(mBits.test(i), i % 2 == 0);
+ EXPECT_EQ(static_cast<bool>(mBits[i]), i % 2 == 0);
+ }
+
+ // Test that flip, set and reset all bits at once work.
+ mBits.flip();
+ EXPECT_FALSE(mBits.all());
+ EXPECT_TRUE(mBits.any());
+ EXPECT_FALSE(mBits.none());
+ EXPECT_EQ(mBits.count(), mBits.size() / 2);
+
+ mBits.set();
+ EXPECT_TRUE(mBits.all());
+ EXPECT_TRUE(mBits.any());
+ EXPECT_FALSE(mBits.none());
+ EXPECT_EQ(mBits.count(), mBits.size());
+
+ mBits.reset();
+ EXPECT_FALSE(mBits.all());
+ EXPECT_FALSE(mBits.any());
+ EXPECT_TRUE(mBits.none());
+ EXPECT_EQ(mBits.count(), 0u);
+
+ // Test that out-of-bound sets don't modify the bitset
+ constexpr uint32_t kMask = (1 << 12) - 1;
+
+ EXPECT_EQ(mBits.set(12).bits() & ~kMask, 0u);
+ EXPECT_EQ(mBits.set(13).bits() & ~kMask, 0u);
+ EXPECT_EQ(mBits.flip(12).bits() & ~kMask, 0u);
+ EXPECT_EQ(mBits.flip(13).bits() & ~kMask, 0u);
+}
+
+TEST_F(BitSetTest, BitwiseOperators)
+{
+ // Use a value that has a 1 in the 12th and 13th bits, to make sure masking to exactly 12 bits
+ // does not have an off-by-one error.
+ constexpr uint32_t kSelfValue = 0xF9E4;
+ constexpr uint32_t kOtherValue = 0x5C6A;
+
+ constexpr uint32_t kMask = (1 << 12) - 1;
+ constexpr uint32_t kSelfMaskedValue = kSelfValue & kMask;
+ constexpr uint32_t kOtherMaskedValue = kOtherValue & kMask;
+
+ constexpr uint32_t kShift = 3;
+ constexpr uint32_t kSelfShiftedLeft = kSelfMaskedValue << kShift & kMask;
+ constexpr uint32_t kSelfShiftedRight = kSelfMaskedValue >> kShift & kMask;
+
+ mBits |= kSelfValue;
+ BitSet<12> other(kOtherValue);
+ BitSet<12> anded(kSelfMaskedValue & kOtherMaskedValue);
+ BitSet<12> ored(kSelfMaskedValue | kOtherMaskedValue);
+ BitSet<12> xored(kSelfMaskedValue ^ kOtherMaskedValue);
+
+ EXPECT_EQ(mBits.bits(), kSelfMaskedValue);
+ EXPECT_EQ(other.bits(), kOtherMaskedValue);
+
+ EXPECT_EQ(mBits & other, anded);
+ EXPECT_EQ(mBits | other, ored);
+ EXPECT_EQ(mBits ^ other, xored);
+
+ EXPECT_NE(mBits, other);
+ EXPECT_NE(anded, ored);
+ EXPECT_NE(anded, xored);
+ EXPECT_NE(ored, xored);
+
+ mBits &= other;
+ EXPECT_EQ(mBits, anded);
+
+ mBits |= ored;
+ EXPECT_EQ(mBits, ored);
+
+ mBits ^= other;
+ mBits ^= anded;
+ EXPECT_EQ(mBits, BitSet<12>(kSelfValue));
+
+ EXPECT_EQ(mBits << kShift, BitSet<12>(kSelfShiftedLeft));
+ EXPECT_EQ(mBits >> kShift, BitSet<12>(kSelfShiftedRight));
+
+ mBits <<= kShift;
+ EXPECT_EQ(mBits, BitSet<12>(kSelfShiftedLeft));
+ EXPECT_EQ(mBits.bits() & ~kMask, 0u);
+
+ mBits = BitSet<12>(kSelfValue);
+ mBits >>= kShift;
+ EXPECT_EQ(mBits, BitSet<12>(kSelfShiftedRight));
+ EXPECT_EQ(mBits.bits() & ~kMask, 0u);
+
+ mBits |= kSelfMaskedValue;
+ EXPECT_EQ(mBits.bits() & ~kMask, 0u);
+ mBits ^= kOtherMaskedValue;
+ EXPECT_EQ(mBits.bits() & ~kMask, 0u);
+}
+
class BitSetIteratorTest : public testing::Test
{
protected:
diff --git a/chromium/third_party/angle/src/common/debug.cpp b/chromium/third_party/angle/src/common/debug.cpp
index 511f05645dd..6a14631f580 100644
--- a/chromium/third_party/angle/src/common/debug.cpp
+++ b/chromium/third_party/angle/src/common/debug.cpp
@@ -35,7 +35,7 @@ DebugAnnotator *g_debugAnnotator = nullptr;
std::mutex *g_debugMutex = nullptr;
constexpr std::array<const char *, LOG_NUM_SEVERITIES> g_logSeverityNames = {
- {"EVENT", "WARN", "ERR"}};
+ {"EVENT", "WARN", "ERR", "FATAL"}};
constexpr const char *LogSeverityName(int severity)
{
@@ -157,7 +157,7 @@ LogMessage::~LogMessage()
lock = std::unique_lock<std::mutex>(*g_debugMutex);
}
- if (DebugAnnotationsInitialized() && (mSeverity == LOG_ERR || mSeverity == LOG_WARN))
+ if (DebugAnnotationsInitialized() && (mSeverity >= LOG_WARN))
{
g_debugAnnotator->logMessage(*this);
}
@@ -165,6 +165,11 @@ LogMessage::~LogMessage()
{
Trace(getSeverity(), getMessage().c_str());
}
+
+ if (mSeverity == LOG_FATAL)
+ {
+ ANGLE_CRASH();
+ }
}
void Trace(LogSeverity severity, const char *message)
@@ -190,14 +195,29 @@ void Trace(LogSeverity severity, const char *message)
}
}
- if (severity == LOG_ERR || severity == LOG_WARN)
+ if (severity == LOG_FATAL || severity == LOG_ERR || severity == LOG_WARN)
{
#if defined(ANGLE_PLATFORM_ANDROID)
- __android_log_print((severity == LOG_ERR) ? ANDROID_LOG_ERROR : ANDROID_LOG_WARN, "ANGLE",
- "%s: %s\n", LogSeverityName(severity), str.c_str());
+ android_LogPriority android_priority = ANDROID_LOG_ERROR;
+ switch (severity)
+ {
+ case LOG_WARN:
+ android_priority = ANDROID_LOG_WARN;
+ break;
+ case LOG_ERR:
+ android_priority = ANDROID_LOG_ERROR;
+ break;
+ case LOG_FATAL:
+ android_priority = ANDROID_LOG_FATAL;
+ break;
+ default:
+ UNREACHABLE();
+ }
+ __android_log_print(android_priority, "ANGLE", "%s: %s\n", LogSeverityName(severity),
+ str.c_str());
#else
// Note: we use fprintf because <iostream> includes static initializers.
- fprintf((severity == LOG_ERR) ? stderr : stdout, "%s: %s\n", LogSeverityName(severity),
+ fprintf((severity >= LOG_ERR) ? stderr : stdout, "%s: %s\n", LogSeverityName(severity),
str.c_str());
#endif
}
@@ -205,7 +225,7 @@ void Trace(LogSeverity severity, const char *message)
#if defined(ANGLE_PLATFORM_WINDOWS) && \
(defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) || !defined(NDEBUG))
# if !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER)
- if (severity == LOG_ERR)
+ if (severity >= LOG_ERR)
# endif // !defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER)
{
OutputDebugStringA(str.c_str());
diff --git a/chromium/third_party/angle/src/common/debug.h b/chromium/third_party/angle/src/common/debug.h
index 9d8f122d112..64783687b33 100644
--- a/chromium/third_party/angle/src/common/debug.h
+++ b/chromium/third_party/angle/src/common/debug.h
@@ -46,7 +46,8 @@ using LogSeverity = int;
constexpr LogSeverity LOG_EVENT = 0;
constexpr LogSeverity LOG_WARN = 1;
constexpr LogSeverity LOG_ERR = 2;
-constexpr LogSeverity LOG_NUM_SEVERITIES = 3;
+constexpr LogSeverity LOG_FATAL = 3;
+constexpr LogSeverity LOG_NUM_SEVERITIES = 4;
void Trace(LogSeverity severity, const char *message);
@@ -191,10 +192,13 @@ std::ostream &FmtHex(std::ostream &os, T value)
::gl::ClassName(__FUNCTION__, __LINE__, ::gl::LOG_WARN, ##__VA_ARGS__)
#define COMPACT_ANGLE_LOG_EX_ERR(ClassName, ...) \
::gl::ClassName(__FUNCTION__, __LINE__, ::gl::LOG_ERR, ##__VA_ARGS__)
+#define COMPACT_ANGLE_LOG_EX_FATAL(ClassName, ...) \
+ ::gl::ClassName(__FUNCTION__, __LINE__, ::gl::LOG_FATAL, ##__VA_ARGS__)
#define COMPACT_ANGLE_LOG_EVENT COMPACT_ANGLE_LOG_EX_EVENT(LogMessage)
#define COMPACT_ANGLE_LOG_WARN COMPACT_ANGLE_LOG_EX_WARN(LogMessage)
#define COMPACT_ANGLE_LOG_ERR COMPACT_ANGLE_LOG_EX_ERR(LogMessage)
+#define COMPACT_ANGLE_LOG_FATAL COMPACT_ANGLE_LOG_EX_FATAL(LogMessage)
#define ANGLE_LOG_IS_ON(severity) (::gl::priv::ShouldCreatePlatformLogMessage(::gl::LOG_##severity))
@@ -227,6 +231,7 @@ std::ostream &FmtHex(std::ostream &os, T value)
#define WARN() ANGLE_LOG(WARN)
#define ERR() ANGLE_LOG(ERR)
+#define FATAL() ANGLE_LOG(FATAL)
// A macro to log a performance event around a scope.
#if defined(ANGLE_TRACE_ENABLED)
@@ -251,11 +256,9 @@ std::ostream &FmtHex(std::ostream &os, T value)
#if !defined(NDEBUG)
# define ANGLE_ASSERT_IMPL(expression) assert(expression)
-# define ANGLE_ASSERT_IMPL_IS_NORETURN 0
#else
// TODO(jmadill): Detect if debugger is attached and break.
# define ANGLE_ASSERT_IMPL(expression) ANGLE_CRASH()
-# define ANGLE_ASSERT_IMPL_IS_NORETURN 1
#endif // !defined(NDEBUG)
// Note that gSwallowStream is used instead of an arbitrary LOG() stream to avoid the creation of an
@@ -272,17 +275,16 @@ std::ostream &FmtHex(std::ostream &os, T value)
// A macro asserting a condition and outputting failures to the debug log
#if defined(ANGLE_ENABLE_ASSERTS)
-# define ASSERT(expression) \
- (expression ? static_cast<void>(0) \
- : ((ERR() << "\t! Assert failed in " << __FUNCTION__ << "(" << __LINE__ \
- << "): " << #expression), \
- ANGLE_ASSERT_IMPL(expression)))
-# define UNREACHABLE_IS_NORETURN ANGLE_ASSERT_IMPL_IS_NORETURN
+# define ASSERT(expression) \
+ (expression ? static_cast<void>(0) \
+ : (FATAL() << "\t! Assert failed in " << __FUNCTION__ << "(" << __LINE__ \
+ << "): " << #expression))
#else
# define ASSERT(condition) ANGLE_EAT_STREAM_PARAMETERS << !(condition)
-# define UNREACHABLE_IS_NORETURN 0
#endif // defined(ANGLE_ENABLE_ASSERTS)
+#define UNREACHABLE_IS_NORETURN 0
+
#define ANGLE_UNUSED_VARIABLE(variable) (static_cast<void>(variable))
// A macro to indicate unimplemented functionality
@@ -300,12 +302,11 @@ std::ostream &FmtHex(std::ostream &os, T value)
} while (0)
// A macro for code which is not expected to be reached under valid assumptions
-# define UNREACHABLE() \
- do \
- { \
- ERR() << "\t! Unreachable reached: " << __FUNCTION__ << "(" << __FILE__ << ":" \
- << __LINE__ << ")"; \
- ASSERT(false); \
+# define UNREACHABLE() \
+ do \
+ { \
+ FATAL() << "\t! Unreachable reached: " << __FUNCTION__ << "(" << __FILE__ << ":" \
+ << __LINE__ << ")"; \
} while (0)
#else
# define UNIMPLEMENTED() \
diff --git a/chromium/third_party/angle/src/common/gen_packed_gl_enums.py b/chromium/third_party/angle/src/common/gen_packed_gl_enums.py
index e6bf599b6c8..2f77e72563b 100644
--- a/chromium/third_party/angle/src/common/gen_packed_gl_enums.py
+++ b/chromium/third_party/angle/src/common/gen_packed_gl_enums.py
@@ -3,7 +3,8 @@
# found in the LICENSE file.
#
# gen_packed_gl_enums.py:
-# Code generation for the packed enums.
+# Code generation for the packed enums.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
import datetime, json, os, sys
from collections import namedtuple
@@ -204,7 +205,29 @@ def write_cpp(enums, path_prefix, file_name, data_source_name, namespace, api_en
with (open(path_prefix + file_name, 'wt')) as f:
f.write(cpp)
-if __name__ == '__main__':
+
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = []
+ outputs = []
+ for generator in Generators:
+ inputs += [generator['json']]
+ outputs += [
+ generator['output'] + '_autogen.cpp',
+ generator['output'] + '_autogen.h',
+ ]
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
path_prefix = os.path.dirname(os.path.realpath(__file__)) + os.path.sep
for generator in Generators:
@@ -215,3 +238,8 @@ if __name__ == '__main__':
enums = load_enums(path_prefix + json_file)
write_header(enums, path_prefix, output_file + '_autogen.h', json_file, namespace, enum_type)
write_cpp(enums, path_prefix, output_file + '_autogen.cpp', json_file, namespace, enum_type)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/common/gen_uniform_type_table.py b/chromium/third_party/angle/src/common/gen_uniform_type_table.py
index 0e36c528ab1..21891a8e327 100644
--- a/chromium/third_party/angle/src/common/gen_uniform_type_table.py
+++ b/chromium/third_party/angle/src/common/gen_uniform_type_table.py
@@ -5,6 +5,7 @@
#
# gen_uniform_type_table.py:
# Code generation for OpenGL uniform type info tables.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
@@ -265,15 +266,37 @@ def gen_type_info(uniform_type):
def gen_type_index_case(index, uniform_type):
return "case " + uniform_type + ": return " + str(index) + ";"
-uniform_type_info_data = ",\n".join([gen_type_info(uniform_type) for uniform_type in all_uniform_types])
-uniform_type_index_cases = "\n".join([gen_type_index_case(index, uniform_type) for index, uniform_type in enumerate(all_uniform_types)])
-
-with open('uniform_type_info_autogen.cpp', 'wt') as out_file:
- output_cpp = template_cpp.format(
- script_name = sys.argv[0],
- copyright_year = date.today().year,
- total_count = len(all_uniform_types),
- uniform_type_info_data = uniform_type_info_data,
- uniform_type_index_cases = uniform_type_index_cases)
- out_file.write(output_cpp)
- out_file.close()
+
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = []
+ outputs = ['uniform_type_info_autogen.cpp']
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ uniform_type_info_data = ",\n".join([gen_type_info(uniform_type) for uniform_type in all_uniform_types])
+ uniform_type_index_cases = "\n".join([gen_type_index_case(index, uniform_type) for index, uniform_type in enumerate(all_uniform_types)])
+
+ with open('uniform_type_info_autogen.cpp', 'wt') as out_file:
+ output_cpp = template_cpp.format(
+ script_name = sys.argv[0],
+ copyright_year = date.today().year,
+ total_count = len(all_uniform_types),
+ uniform_type_info_data = uniform_type_info_data,
+ uniform_type_index_cases = uniform_type_index_cases)
+ out_file.write(output_cpp)
+ out_file.close()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/common/packed_gl_enums.json b/chromium/third_party/angle/src/common/packed_gl_enums.json
index 054e3c9062d..0cff012e375 100644
--- a/chromium/third_party/angle/src/common/packed_gl_enums.json
+++ b/chromium/third_party/angle/src/common/packed_gl_enums.json
@@ -57,6 +57,13 @@
"Exp2": "GL_EXP2",
"Linear": "GL_LINEAR"
},
+ "GraphicsResetStatus":
+ {
+ "NoError": "GL_NO_ERROR",
+ "GuiltyContextReset": "GL_GUILTY_CONTEXT_RESET",
+ "InnocentContextReset": "GL_INNOCENT_CONTEXT_RESET",
+ "UnknownContextReset": "GL_UNKNOWN_CONTEXT_RESET"
+ },
"HintSetting":
{
"DontCare": "GL_DONT_CARE",
@@ -255,5 +262,9 @@
{
"FirstVertexConvention": "GL_FIRST_VERTEX_CONVENTION",
"LastVertexConvention": "GL_LAST_VERTEX_CONVENTION"
+ },
+ "HandleType":
+ {
+ "OpaqueFd": "GL_HANDLE_TYPE_OPAQUE_FD_EXT"
}
}
diff --git a/chromium/third_party/angle/src/common/uniform_type_info_autogen.cpp b/chromium/third_party/angle/src/common/uniform_type_info_autogen.cpp
index 97d6f068d26..1de2146dc0f 100644
--- a/chromium/third_party/angle/src/common/uniform_type_info_autogen.cpp
+++ b/chromium/third_party/angle/src/common/uniform_type_info_autogen.cpp
@@ -1,7 +1,7 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_uniform_type_table.py.
//
-// Copyright 2018 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.
//
diff --git a/chromium/third_party/angle/src/compiler/preprocessor/DiagnosticsBase.h b/chromium/third_party/angle/src/compiler/preprocessor/DiagnosticsBase.h
index 8806d3749b8..bb90bf08292 100644
--- a/chromium/third_party/angle/src/compiler/preprocessor/DiagnosticsBase.h
+++ b/chromium/third_party/angle/src/compiler/preprocessor/DiagnosticsBase.h
@@ -64,6 +64,7 @@ class Diagnostics
PP_INVALID_LINE_NUMBER,
PP_INVALID_FILE_NUMBER,
PP_INVALID_LINE_DIRECTIVE,
+ PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1,
PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3,
PP_UNDEFINED_SHIFT,
PP_TOKENIZER_ERROR,
@@ -72,7 +73,6 @@ class Diagnostics
PP_WARNING_BEGIN,
PP_EOF_IN_DIRECTIVE,
PP_UNRECOGNIZED_PRAGMA,
- PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1,
PP_WARNING_MACRO_NAME_RESERVED,
PP_WARNING_END
};
diff --git a/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp b/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp
index 63fe0265456..52b8b878c36 100644
--- a/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.cpp
@@ -9,6 +9,7 @@
#include "compiler/translator/AtomicCounterFunctionHLSL.h"
+#include "compiler/translator/Common.h"
#include "compiler/translator/ImmutableStringBuilder.h"
#include "compiler/translator/InfoSink.h"
#include "compiler/translator/IntermNode.h"
@@ -24,6 +25,10 @@ constexpr ImmutableString kAtomicCounterDecrement("atomicCounterDecrement");
constexpr ImmutableString kAtomicCounterBaseName("_acbase_");
} // namespace
+AtomicCounterFunctionHLSL::AtomicCounterFunctionHLSL(bool forceResolution)
+ : mForceResolution(forceResolution)
+{}
+
ImmutableString AtomicCounterFunctionHLSL::useAtomicCounterFunction(const ImmutableString &name)
{
// The largest string that will be create created is "_acbase_increment" or "_acbase_decrement"
@@ -65,34 +70,41 @@ void AtomicCounterFunctionHLSL::atomicCounterFunctionHeader(TInfoSinkBase &out)
{
out << "uint " << atomicFunction.first
<< "(in RWByteAddressBuffer counter, int address)\n"
- "{\n";
+ "{\n"
+ " uint ret;\n";
+
switch (atomicFunction.second)
{
case AtomicCounterFunction::INCREMENT:
+ out << " counter.InterlockedAdd(address, 1u, ret);\n";
+ break;
case AtomicCounterFunction::DECREMENT:
- out << " uint ret;\n"
- " counter.InterlockedAdd(address, ";
- if (atomicFunction.second == AtomicCounterFunction::DECREMENT)
- {
- out << "0u - ";
- }
- out << "1u, ret);\n"
- << " return ret;\n";
+ out << " counter.InterlockedAdd(address, 0u - 1u, ret);\n"
+ " ret -= 1u;\n"; // atomicCounterDecrement is a post-decrement op
break;
case AtomicCounterFunction::LOAD:
- out << " return counter.Load(address);\n";
+ out << " ret = counter.Load(address);\n";
break;
default:
UNREACHABLE();
break;
}
- out << "}\n\n";
+
+ if (mForceResolution && atomicFunction.second != AtomicCounterFunction::LOAD)
+ {
+ out << " if (ret == 0) {\n"
+ " ret = 0 - ret;\n"
+ " }\n";
+ }
+
+ out << " return ret;\n"
+ "}\n\n";
}
}
ImmutableString getAtomicCounterNameForBinding(int binding)
{
- std::stringstream counterName;
+ std::stringstream counterName = sh::InitializeStream<std::stringstream>();
counterName << kAtomicCounterBaseName << binding;
return ImmutableString(counterName.str());
}
diff --git a/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.h b/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.h
index 63fd891d536..e658df3c203 100644
--- a/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.h
+++ b/chromium/third_party/angle/src/compiler/translator/AtomicCounterFunctionHLSL.h
@@ -24,6 +24,8 @@ struct TLayoutQualifier;
class AtomicCounterFunctionHLSL final : angle::NonCopyable
{
public:
+ AtomicCounterFunctionHLSL(bool forceResolution);
+
ImmutableString useAtomicCounterFunction(const ImmutableString &name);
void atomicCounterFunctionHeader(TInfoSinkBase &out);
@@ -38,6 +40,7 @@ class AtomicCounterFunctionHLSL final : angle::NonCopyable
};
std::map<ImmutableString, AtomicCounterFunction> mAtomicCounterFunctions;
+ bool mForceResolution;
};
ImmutableString getAtomicCounterNameForBinding(int binding);
diff --git a/chromium/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp b/chromium/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp
index 7c619dd7f44..dc485274804 100644
--- a/chromium/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/BuiltInFunctionEmulatorGLSL.cpp
@@ -5,6 +5,7 @@
//
#include "compiler/translator/BuiltInFunctionEmulatorGLSL.h"
+
#include "angle_gl.h"
#include "compiler/translator/BuiltInFunctionEmulator.h"
#include "compiler/translator/VersionGLSL.h"
@@ -87,7 +88,7 @@ void InitBuiltInAtanFunctionEmulatorForGLSLWorkarounds(BuiltInFunctionEmulator *
};
for (int dim = 2; dim <= 4; ++dim)
{
- std::stringstream ss;
+ std::stringstream ss = sh::InitializeStream<std::stringstream>();
ss << "emu_precision vec" << dim << " atan_emu(emu_precision vec" << dim
<< " y, emu_precision vec" << dim << " x)\n"
<< "{\n"
diff --git a/chromium/third_party/angle/src/compiler/translator/CallDAG.cpp b/chromium/third_party/angle/src/compiler/translator/CallDAG.cpp
index 9c0e2cf2598..63c8cd0f92e 100644
--- a/chromium/third_party/angle/src/compiler/translator/CallDAG.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/CallDAG.cpp
@@ -171,7 +171,7 @@ class CallDAG::CallDAGCreator : public TIntermTraverser
InitResult result = INITDAG_SUCCESS;
- std::stringstream errorStream;
+ std::stringstream errorStream = sh::InitializeStream<std::stringstream>();
while (!functionsToProcess.empty())
{
diff --git a/chromium/third_party/angle/src/compiler/translator/CollectVariables.cpp b/chromium/third_party/angle/src/compiler/translator/CollectVariables.cpp
index 07f08e90e0c..cbaaf83b27d 100644
--- a/chromium/third_party/angle/src/compiler/translator/CollectVariables.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/CollectVariables.cpp
@@ -554,7 +554,7 @@ void CollectVariablesTraverser::visitSymbol(TIntermSymbol *symbol)
else
{
ASSERT(mShaderType == GL_VERTEX_SHADER &&
- IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview));
+ IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview2));
}
break;
default:
@@ -766,7 +766,7 @@ Uniform CollectVariablesTraverser::recordUniform(const TIntermSymbol &variable)
{
Uniform uniform;
setCommonVariableProperties(variable.getType(), variable.variable(), &uniform);
- uniform.binding = variable.getType().getLayoutQualifier().binding;
+ uniform.binding = variable.getType().getLayoutQualifier().binding;
uniform.imageUnitFormat =
GetImageInternalFormatType(variable.getType().getLayoutQualifier().imageInternalFormat);
uniform.location = variable.getType().getLayoutQualifier().location;
diff --git a/chromium/third_party/angle/src/compiler/translator/Common.h b/chromium/third_party/angle/src/compiler/translator/Common.h
index d0b83471f7b..179cfe21ee5 100644
--- a/chromium/third_party/angle/src/compiler/translator/Common.h
+++ b/chromium/third_party/angle/src/compiler/translator/Common.h
@@ -125,6 +125,15 @@ inline const char *AllocatePoolCharArray(const char *str, size_t strLength)
return buffer;
}
+// Initialize a new stream which must be imbued with the classic locale
+template <typename T>
+T InitializeStream()
+{
+ T stream;
+ stream.imbue(std::locale::classic());
+ return stream;
+}
+
} // namespace sh
namespace std
diff --git a/chromium/third_party/angle/src/compiler/translator/Compiler.cpp b/chromium/third_party/angle/src/compiler/translator/Compiler.cpp
index 6be8638cb0e..a31eda779b1 100644
--- a/chromium/third_party/angle/src/compiler/translator/Compiler.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/Compiler.cpp
@@ -68,7 +68,7 @@ void DumpFuzzerCase(char const *const *shaderStrings,
{
static int fileIndex = 0;
- std::ostringstream o;
+ std::ostringstream o = sh::InitializeStream<std::ostringstream>();
o << "corpus/" << fileIndex++ << ".sample";
std::string s = o.str();
@@ -565,7 +565,7 @@ bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
}
if ((compileOptions & SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW) &&
- parseContext.isExtensionEnabled(TExtension::OVR_multiview) &&
+ parseContext.isExtensionEnabled(TExtension::OVR_multiview2) &&
getShaderType() != GL_COMPUTE_SHADER)
{
DeclareAndInitBuiltinsForInstancedMultiview(root, mNumViews, mShaderType, compileOptions,
@@ -940,7 +940,7 @@ bool TCompiler::initBuiltInSymbolTable(const ShBuiltInResources &resources)
void TCompiler::setResourceString()
{
- std::ostringstream strstream;
+ std::ostringstream strstream = sh::InitializeStream<std::ostringstream>();
// clang-format off
strstream << ":MaxVertexAttribs:" << mResources.MaxVertexAttribs
@@ -967,7 +967,7 @@ void TCompiler::setResourceString()
<< ":EXT_shader_framebuffer_fetch:" << mResources.EXT_shader_framebuffer_fetch
<< ":NV_shader_framebuffer_fetch:" << mResources.NV_shader_framebuffer_fetch
<< ":ARM_shader_framebuffer_fetch:" << mResources.ARM_shader_framebuffer_fetch
- << ":OVR_multiview:" << mResources.OVR_multiview
+ << ":OVR_multiview2:" << mResources.OVR_multiview2
<< ":EXT_YUV_target:" << mResources.EXT_YUV_target
<< ":EXT_geometry_shader:" << mResources.EXT_geometry_shader
<< ":MaxVertexOutputVectors:" << mResources.MaxVertexOutputVectors
@@ -1094,7 +1094,7 @@ bool TCompiler::checkCallDepth()
for (size_t i = 0; i < mCallDag.size(); i++)
{
- int depth = 0;
+ int depth = 0;
const CallDAG::Record &record = mCallDag.getRecordFromIndex(i);
for (const int &calleeIndex : record.callees)
@@ -1107,7 +1107,7 @@ bool TCompiler::checkCallDepth()
if (depth >= mResources.MaxCallStackDepth)
{
// Trace back the function chain to have a meaningful info log.
- std::stringstream errorStream;
+ std::stringstream errorStream = sh::InitializeStream<std::stringstream>();
errorStream << "Call stack too deep (larger than " << mResources.MaxCallStackDepth
<< ") with the following call chain: "
<< record.node->getFunction()->name();
diff --git a/chromium/third_party/angle/src/compiler/translator/DirectiveHandler.cpp b/chromium/third_party/angle/src/compiler/translator/DirectiveHandler.cpp
index 46e67f5f939..e468fd44d3b 100644
--- a/chromium/third_party/angle/src/compiler/translator/DirectiveHandler.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/DirectiveHandler.cpp
@@ -10,6 +10,7 @@
#include "angle_gl.h"
#include "common/debug.h"
+#include "compiler/translator/Common.h"
#include "compiler/translator/Diagnostics.h"
namespace sh
@@ -190,7 +191,7 @@ void TDirectiveHandler::handleVersion(const angle::pp::SourceLocation &loc, int
}
else
{
- std::stringstream stream;
+ std::stringstream stream = sh::InitializeStream<std::stringstream>();
stream << version;
std::string str = stream.str();
mDiagnostics.error(loc, "version number not supported", str.c_str());
diff --git a/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.cpp b/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.cpp
index faf1d83fc2d..e6028193986 100644
--- a/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.cpp
@@ -29,7 +29,7 @@
OP(OES_EGL_image_external_essl3) \
OP(OES_standard_derivatives) \
OP(OES_texture_storage_multisample_2d_array) \
- OP(OVR_multiview) \
+ OP(OVR_multiview2) \
OP(ANGLE_multi_draw)
namespace sh
diff --git a/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.h b/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.h
index e55484f4fd1..161cc664775 100644
--- a/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.h
+++ b/chromium/third_party/angle/src/compiler/translator/ExtensionBehavior.h
@@ -34,7 +34,7 @@ enum class TExtension
OES_EGL_image_external_essl3,
OES_standard_derivatives,
OES_texture_storage_multisample_2d_array,
- OVR_multiview,
+ OVR_multiview2,
ANGLE_multi_draw,
};
diff --git a/chromium/third_party/angle/src/compiler/translator/InfoSink.cpp b/chromium/third_party/angle/src/compiler/translator/InfoSink.cpp
index fc19d7ec2eb..e8a84530818 100644
--- a/chromium/third_party/angle/src/compiler/translator/InfoSink.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/InfoSink.cpp
@@ -69,7 +69,7 @@ TInfoSinkBase &TInfoSinkBase::operator<<(const TType &type)
void TInfoSinkBase::location(int file, int line)
{
- TPersistStringStream stream;
+ TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>();
if (line)
stream << file << ":" << line;
else
diff --git a/chromium/third_party/angle/src/compiler/translator/InfoSink.h b/chromium/third_party/angle/src/compiler/translator/InfoSink.h
index 44f0e83d6c5..100d06ec6bf 100644
--- a/chromium/third_party/angle/src/compiler/translator/InfoSink.h
+++ b/chromium/third_party/angle/src/compiler/translator/InfoSink.h
@@ -41,7 +41,7 @@ class TInfoSinkBase
template <typename T>
TInfoSinkBase &operator<<(const T &t)
{
- TPersistStringStream stream;
+ TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>();
stream << t;
sink.append(stream.str());
return *this;
@@ -79,7 +79,7 @@ class TInfoSinkBase
// does not have a fractional part, the default precision format does
// not write the decimal portion which gets interpreted as integer by
// the compiler.
- TPersistStringStream stream;
+ TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>();
if (fractionalPart(f) == 0.0f)
{
stream.precision(1);
diff --git a/chromium/third_party/angle/src/compiler/translator/Initialize.cpp b/chromium/third_party/angle/src/compiler/translator/Initialize.cpp
index e362edbdfa1..aec19c960c0 100644
--- a/chromium/third_party/angle/src/compiler/translator/Initialize.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/Initialize.cpp
@@ -61,9 +61,9 @@ void InitExtensionBehavior(const ShBuiltInResources &resources, TExtensionBehavi
{
extBehavior[TExtension::ARM_shader_framebuffer_fetch] = EBhUndefined;
}
- if (resources.OVR_multiview)
+ if (resources.OVR_multiview2)
{
- extBehavior[TExtension::OVR_multiview] = EBhUndefined;
+ extBehavior[TExtension::OVR_multiview2] = EBhUndefined;
}
if (resources.EXT_YUV_target)
{
diff --git a/chromium/third_party/angle/src/compiler/translator/OutputHLSL.cpp b/chromium/third_party/angle/src/compiler/translator/OutputHLSL.cpp
index 84e32dddf45..273f326eac8 100644
--- a/chromium/third_party/angle/src/compiler/translator/OutputHLSL.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/OutputHLSL.cpp
@@ -39,7 +39,7 @@ constexpr const char kImage2DFunctionString[] = "// @@ IMAGE2D DECLARATION FUNCT
TString ArrayHelperFunctionName(const char *prefix, const TType &type)
{
- TStringStream fnName;
+ TStringStream fnName = sh::InitializeStream<TStringStream>();
fnName << prefix << "_";
if (type.isArray())
{
@@ -132,7 +132,7 @@ const char *kZeros = "_ANGLE_ZEROS_";
constexpr int kZeroCount = 256;
std::string DefineZeroArray()
{
- std::stringstream ss;
+ std::stringstream ss = sh::InitializeStream<std::stringstream>();
// For 'static', if the declaration does not include an initializer, the value is set to zero.
// https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-variable-syntax
ss << "static uint " << kZeros << "[" << kZeroCount << "];\n";
@@ -141,9 +141,9 @@ std::string DefineZeroArray()
std::string GetZeroInitializer(size_t size)
{
- std::stringstream ss;
- size_t quotient = size / kZeroCount;
- size_t reminder = size % kZeroCount;
+ std::stringstream ss = sh::InitializeStream<std::stringstream>();
+ size_t quotient = size / kZeroCount;
+ size_t reminder = size % kZeroCount;
for (size_t i = 0; i < quotient; ++i)
{
@@ -262,7 +262,7 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType,
mUsesPointSize = false;
mUsesInstanceID = false;
mHasMultiviewExtensionEnabled =
- IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview);
+ IsExtensionEnabled(mExtensionBehavior, TExtension::OVR_multiview2);
mUsesViewID = false;
mUsesVertexID = false;
mUsesFragDepth = false;
@@ -285,10 +285,11 @@ OutputHLSL::OutputHLSL(sh::GLenum shaderType,
mExcessiveLoopIndex = nullptr;
- mStructureHLSL = new StructureHLSL;
- mTextureFunctionHLSL = new TextureFunctionHLSL;
- mImageFunctionHLSL = new ImageFunctionHLSL;
- mAtomicCounterFunctionHLSL = new AtomicCounterFunctionHLSL;
+ mStructureHLSL = new StructureHLSL;
+ mTextureFunctionHLSL = new TextureFunctionHLSL;
+ mImageFunctionHLSL = new ImageFunctionHLSL;
+ mAtomicCounterFunctionHLSL =
+ new AtomicCounterFunctionHLSL((compileOptions & SH_FORCE_ATOMIC_VALUE_RESOLUTION) != 0);
unsigned int firstUniformRegister =
((compileOptions & SH_SKIP_D3D_CONSTANT_REGISTER_ZERO) != 0) ? 1u : 0u;
@@ -416,7 +417,7 @@ TString OutputHLSL::structInitializerString(int indent,
init += indentString + "{\n";
for (unsigned int arrayIndex = 0u; arrayIndex < type.getOutermostArraySize(); ++arrayIndex)
{
- TStringStream indexedString;
+ TStringStream indexedString = sh::InitializeStream<TStringStream>();
indexedString << name << "[" << arrayIndex << "]";
TType elementType = type;
elementType.toArrayElementType();
@@ -849,6 +850,11 @@ void OutputHLSL::header(TInfoSinkBase &out,
mResourcesHLSL->samplerMetadataUniforms(out, 4);
}
+ if (mUsesVertexID)
+ {
+ out << " uint dx_VertexID : packoffset(c3.w);\n";
+ }
+
out << "};\n"
"\n";
}
@@ -891,8 +897,8 @@ void OutputHLSL::header(TInfoSinkBase &out,
out << kImage2DFunctionString << "\n";
- std::ostringstream systemValueDeclaration;
- std::ostringstream glBuiltinInitialization;
+ std::ostringstream systemValueDeclaration = sh::InitializeStream<std::ostringstream>();
+ std::ostringstream glBuiltinInitialization = sh::InitializeStream<std::ostringstream>();
systemValueDeclaration << "\nstruct CS_INPUT\n{\n";
glBuiltinInitialization << "\nvoid initGLBuiltins(CS_INPUT input)\n"
@@ -977,6 +983,11 @@ void OutputHLSL::header(TInfoSinkBase &out,
out << "#define GL_ANGLE_MULTIVIEW_ENABLED\n";
}
+ if (mUsesVertexID)
+ {
+ out << "#define GL_USES_VERTEX_ID\n";
+ }
+
if (mUsesViewID)
{
out << "#define GL_USES_VIEW_ID\n";
@@ -1900,7 +1911,7 @@ ImmutableString OutputHLSL::samplerNamePrefixFromStruct(TIntermTyped *node)
{
int index = nodeBinary->getRight()->getAsConstantUnion()->getIConst(0);
- std::stringstream prefixSink;
+ std::stringstream prefixSink = sh::InitializeStream<std::stringstream>();
prefixSink << samplerNamePrefixFromStruct(nodeBinary->getLeft()) << "_" << index;
return ImmutableString(prefixSink.str());
}
@@ -1910,7 +1921,7 @@ ImmutableString OutputHLSL::samplerNamePrefixFromStruct(TIntermTyped *node)
int index = nodeBinary->getRight()->getAsConstantUnion()->getIConst(0);
const TField *field = s->fields()[index];
- std::stringstream prefixSink;
+ std::stringstream prefixSink = sh::InitializeStream<std::stringstream>();
prefixSink << samplerNamePrefixFromStruct(nodeBinary->getLeft()) << "_"
<< field->name();
return ImmutableString(prefixSink.str());
@@ -2113,8 +2124,11 @@ bool OutputHLSL::visitDeclaration(Visit visit, TIntermDeclaration *node)
{
symbol->traverse(this);
out << ArrayString(symbol->getType());
- if (declarator->getQualifier() != EvqShared ||
- mCompileOptions & SH_INIT_SHARED_VARIABLES)
+ // Temporarily disable shadred memory initialization. It is very slow for D3D11
+ // drivers to compile a compute shader if we add code to initialize a
+ // groupshared array variable with a large array size. And maybe produce
+ // incorrect result. See http://anglebug.com/3226.
+ if (declarator->getQualifier() != EvqShared)
{
out << " = " + zeroInitializer(symbol->getType());
}
diff --git a/chromium/third_party/angle/src/compiler/translator/ParseContext.cpp b/chromium/third_party/angle/src/compiler/translator/ParseContext.cpp
index fcaca768242..17f241f1af9 100644
--- a/chromium/third_party/angle/src/compiler/translator/ParseContext.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ParseContext.cpp
@@ -611,7 +611,7 @@ bool TParseContext::checkCanBeLValue(const TSourceLoc &line, const char *op, TIn
return true;
}
- std::stringstream reasonStream;
+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>();
reasonStream << "l-value required";
if (!message.empty())
{
@@ -902,7 +902,7 @@ bool TParseContext::checkIsNotOpaqueType(const TSourceLoc &line,
{
if (ContainsSampler(pType.userDef))
{
- std::stringstream reasonStream;
+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>();
reasonStream << reason << " (structure contains a sampler)";
std::string reasonStr = reasonStream.str();
error(line, reasonStr.c_str(), getBasicString(pType.type));
@@ -1347,7 +1347,7 @@ void TParseContext::declarationQualifierErrorCheck(const sh::TQualifier qualifie
// If multiview extension is enabled, "in" qualifier is allowed in the vertex shader in previous
// parsing steps. So it needs to be checked here.
- if (isExtensionEnabled(TExtension::OVR_multiview) && mShaderVersion < 300 &&
+ if (isExtensionEnabled(TExtension::OVR_multiview2) && mShaderVersion < 300 &&
qualifier == EvqVertexIn)
{
error(location, "storage qualifier supported in GLSL ES 3.00 and above only", "in");
@@ -2366,11 +2366,6 @@ void TParseContext::checkAtomicCounterOffsetDoesNotOverlap(bool forceAppend,
const TSourceLoc &loc,
TType *type)
{
- if (!IsAtomicCounter(type->getBasicType()))
- {
- return;
- }
-
const size_t size = type->isArray() ? kAtomicCounterArrayStride * type->getArraySizeProduct()
: kAtomicCounterSize;
TLayoutQualifier layoutQualifier = type->getLayoutQualifier();
@@ -2393,6 +2388,17 @@ void TParseContext::checkAtomicCounterOffsetDoesNotOverlap(bool forceAppend,
type->setLayoutQualifier(layoutQualifier);
}
+void TParseContext::checkAtomicCounterOffsetAlignment(const TSourceLoc &location, const TType &type)
+{
+ TLayoutQualifier layoutQualifier = type.getLayoutQualifier();
+
+ // OpenGL ES 3.1 Table 6.5, Atomic counter offset must be a multiple of 4
+ if (layoutQualifier.offset % 4 != 0)
+ {
+ error(location, "Offset must be multiple of 4", "atomic counter");
+ }
+}
+
void TParseContext::checkGeometryShaderInputAndSetArraySize(const TSourceLoc &location,
const ImmutableString &token,
TType *type)
@@ -2495,7 +2501,12 @@ TIntermDeclaration *TParseContext::parseSingleDeclaration(
checkCanBeDeclaredWithoutInitializer(identifierOrTypeLocation, identifier, type);
- checkAtomicCounterOffsetDoesNotOverlap(false, identifierOrTypeLocation, type);
+ if (IsAtomicCounter(type->getBasicType()))
+ {
+ checkAtomicCounterOffsetDoesNotOverlap(false, identifierOrTypeLocation, type);
+
+ checkAtomicCounterOffsetAlignment(identifierOrTypeLocation, *type);
+ }
TVariable *variable = nullptr;
if (declareVariable(identifierOrTypeLocation, identifier, type, &variable))
@@ -2537,7 +2548,12 @@ TIntermDeclaration *TParseContext::parseSingleArrayDeclaration(
checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, arrayType);
- checkAtomicCounterOffsetDoesNotOverlap(false, identifierLocation, arrayType);
+ if (IsAtomicCounter(arrayType->getBasicType()))
+ {
+ checkAtomicCounterOffsetDoesNotOverlap(false, identifierLocation, arrayType);
+
+ checkAtomicCounterOffsetAlignment(identifierLocation, *arrayType);
+ }
TIntermDeclaration *declaration = new TIntermDeclaration();
declaration->setLine(identifierLocation);
@@ -2695,7 +2711,12 @@ void TParseContext::parseDeclarator(TPublicType &publicType,
checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, type);
- checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, type);
+ if (IsAtomicCounter(type->getBasicType()))
+ {
+ checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, type);
+
+ checkAtomicCounterOffsetAlignment(identifierLocation, *type);
+ }
TVariable *variable = nullptr;
if (declareVariable(identifierLocation, identifier, type, &variable))
@@ -2732,7 +2753,12 @@ void TParseContext::parseArrayDeclarator(TPublicType &elementType,
checkCanBeDeclaredWithoutInitializer(identifierLocation, identifier, arrayType);
- checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, arrayType);
+ if (IsAtomicCounter(arrayType->getBasicType()))
+ {
+ checkAtomicCounterOffsetDoesNotOverlap(true, identifierLocation, arrayType);
+
+ checkAtomicCounterOffsetAlignment(identifierLocation, *arrayType);
+ }
TVariable *variable = nullptr;
if (declareVariable(identifierLocation, identifier, arrayType, &variable))
@@ -3066,7 +3092,7 @@ void TParseContext::parseGlobalLayoutQualifier(const TTypeQualifierBuilder &type
if (mComputeShaderLocalSize[i] < 1 ||
mComputeShaderLocalSize[i] > maxComputeWorkGroupSizeValue)
{
- std::stringstream reasonStream;
+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>();
reasonStream << "invalid value: Value must be at least 1 and no greater than "
<< maxComputeWorkGroupSizeValue;
const std::string &reason = reasonStream.str();
@@ -3106,7 +3132,7 @@ void TParseContext::parseGlobalLayoutQualifier(const TTypeQualifierBuilder &type
return;
}
}
- else if (isExtensionEnabled(TExtension::OVR_multiview) &&
+ else if (isExtensionEnabled(TExtension::OVR_multiview2) &&
typeQualifier.qualifier == EvqVertexIn)
{
// This error is only specified in WebGL, but tightens unspecified behavior in the native
@@ -3891,7 +3917,7 @@ void TParseContext::checkIsBelowStructNestingLimit(const TSourceLoc &line, const
// one to the field's struct nesting.
if (1 + field.type()->getDeepestStructNesting() > kWebGLMaxStructNesting)
{
- std::stringstream reasonStream;
+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>();
if (field.type()->getStruct()->symbolType() == SymbolType::Empty)
{
// This may happen in case there are nested struct definitions. While they are also
@@ -4085,7 +4111,7 @@ int TParseContext::checkIndexLessThan(bool outOfRangeIndexIsError,
ASSERT(index >= 0);
if (index >= arraySize)
{
- std::stringstream reasonStream;
+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>();
reasonStream << reason << " '" << index << "'";
std::string token = reasonStream.str();
outOfRangeError(outOfRangeIndexIsError, location, reason, "[]");
@@ -4387,7 +4413,7 @@ void TParseContext::parseLocalSize(const ImmutableString &qualifierType,
checkLayoutQualifierSupported(qualifierTypeLine, qualifierType, 310);
if (intValue < 1)
{
- std::stringstream reasonStream;
+ std::stringstream reasonStream = sh::InitializeStream<std::stringstream>();
reasonStream << "out of range: " << getWorkGroupSizeString(index) << " must be positive";
std::string reason = reasonStream.str();
error(intValueLine, reason.c_str(), intValueString.c_str());
@@ -4535,7 +4561,7 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const ImmutableString &qual
}
else if (qualifierType == "num_views" && mShaderType == GL_VERTEX_SHADER)
{
- if (checkCanUseExtension(qualifierTypeLine, TExtension::OVR_multiview))
+ if (checkCanUseExtension(qualifierTypeLine, TExtension::OVR_multiview2))
{
parseNumViews(intValue, intValueLine, intValueString, &qualifier.numViews);
}
@@ -4597,7 +4623,7 @@ TStorageQualifierWrapper *TParseContext::parseInQualifier(const TSourceLoc &loc)
{
case GL_VERTEX_SHADER:
{
- if (mShaderVersion < 300 && !isExtensionEnabled(TExtension::OVR_multiview))
+ if (mShaderVersion < 300 && !isExtensionEnabled(TExtension::OVR_multiview2))
{
error(loc, "storage qualifier supported in GLSL ES 3.00 and above only", "in");
}
@@ -5672,7 +5698,7 @@ void TParseContext::checkTextureOffsetConst(TIntermAggregate *functionCall)
int offsetValue = values[i].getIConst();
if (offsetValue > maxOffsetValue || offsetValue < minOffsetValue)
{
- std::stringstream tokenStream;
+ std::stringstream tokenStream = sh::InitializeStream<std::stringstream>();
tokenStream << offsetValue;
std::string token = tokenStream.str();
error(offset->getLine(), "Texture offset value out of valid range",
diff --git a/chromium/third_party/angle/src/compiler/translator/ParseContext.h b/chromium/third_party/angle/src/compiler/translator/ParseContext.h
index ab68e2d08d8..035e8c7788b 100644
--- a/chromium/third_party/angle/src/compiler/translator/ParseContext.h
+++ b/chromium/third_party/angle/src/compiler/translator/ParseContext.h
@@ -515,6 +515,8 @@ class TParseContext : angle::NonCopyable
void checkAtomicCounterOffsetDoesNotOverlap(bool forceAppend,
const TSourceLoc &loc,
TType *type);
+ void checkAtomicCounterOffsetAlignment(const TSourceLoc &location, const TType &type);
+
void checkIndexIsNotSpecified(const TSourceLoc &location, int index);
void checkBindingIsValid(const TSourceLoc &identifierLocation, const TType &type);
void checkBindingIsNotSpecified(const TSourceLoc &location, int binding);
diff --git a/chromium/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp b/chromium/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp
index 24aa77d89aa..95e98deb122 100644
--- a/chromium/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ResourcesHLSL.cpp
@@ -385,8 +385,9 @@ void ResourcesHLSL::outputAtomicCounterBuffer(TInfoSinkBase &out,
const int binding,
const unsigned int registerIndex)
{
- out << "uniform RWByteAddressBuffer " << getAtomicCounterNameForBinding(binding)
- << " : register(u" << registerIndex << ");\n";
+ // Atomic counter memory access is not incoherent
+ out << "uniform globallycoherent RWByteAddressBuffer "
+ << getAtomicCounterNameForBinding(binding) << " : register(u" << registerIndex << ");\n";
}
void ResourcesHLSL::uniformsHeader(TInfoSinkBase &out,
diff --git a/chromium/third_party/angle/src/compiler/translator/ShaderLang.cpp b/chromium/third_party/angle/src/compiler/translator/ShaderLang.cpp
index b683966b542..a79c506ec3c 100644
--- a/chromium/third_party/angle/src/compiler/translator/ShaderLang.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ShaderLang.cpp
@@ -199,7 +199,7 @@ void InitBuiltInResources(ShBuiltInResources *resources)
resources->EXT_shader_framebuffer_fetch = 0;
resources->NV_shader_framebuffer_fetch = 0;
resources->ARM_shader_framebuffer_fetch = 0;
- resources->OVR_multiview = 0;
+ resources->OVR_multiview2 = 0;
resources->EXT_YUV_target = 0;
resources->EXT_geometry_shader = 0;
resources->OES_texture_storage_multisample_2d_array = 0;
diff --git a/chromium/third_party/angle/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp b/chromium/third_party/angle/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp
index 16dea7564db..bef88db386f 100644
--- a/chromium/third_party/angle/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ShaderStorageBlockOutputHLSL.cpp
@@ -634,6 +634,11 @@ bool ShaderStorageBlockOutputHLSL::visitBinary(Visit visit, TIntermBinary *node)
break;
}
case EOpIndexDirectInterfaceBlock:
+ if (!IsInShaderStorageBlock(node->getLeft()))
+ {
+ return mOutputHLSL->visitBinary(visit, node);
+ }
+
if (visit == InVisit)
{
ASSERT(IsInShaderStorageBlock(node->getLeft()));
diff --git a/chromium/third_party/angle/src/compiler/translator/Symbol.cpp b/chromium/third_party/angle/src/compiler/translator/Symbol.cpp
index babda8c172d..52ad4f319d1 100644
--- a/chromium/third_party/angle/src/compiler/translator/Symbol.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/Symbol.cpp
@@ -115,7 +115,7 @@ void TStructure::createSamplerSymbols(const char *namePrefix,
const TType *fieldType = field->type();
if (IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers())
{
- std::stringstream fieldName;
+ std::stringstream fieldName = sh::InitializeStream<std::stringstream>();
fieldName << namePrefix << "_" << field->name();
TString fieldApiName = apiNamePrefix + ".";
fieldApiName += field->name().data();
diff --git a/chromium/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp b/chromium/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp
index 1ab25b2cf9b..da9696232b3 100644
--- a/chromium/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/SymbolTable_autogen.cpp
@@ -1603,13 +1603,13 @@ constexpr const TVariable kVar_gl_ViewID_OVR(
BuiltInId::gl_ViewID_OVR,
BuiltInName::gl_ViewID_OVR,
SymbolType::BuiltIn,
- TExtension::OVR_multiview,
+ TExtension::OVR_multiview2,
StaticType::Get<EbtUInt, EbpHigh, EvqViewIDOVR, 1, 1>());
constexpr const TVariable kVar_gl_ViewID_OVRESSL1(
BuiltInId::gl_ViewID_OVRESSL1,
BuiltInName::gl_ViewID_OVR,
SymbolType::BuiltIn,
- TExtension::OVR_multiview,
+ TExtension::OVR_multiview2,
StaticType::Get<EbtInt, EbpHigh, EvqViewIDOVR, 1, 1>());
constexpr const TVariable kVar_gl_ViewportIndex(
BuiltInId::gl_ViewportIndex,
@@ -16806,7 +16806,7 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader
}
}
}
- if (mResources.OVR_multiview && mShaderType != GL_COMPUTE_SHADER)
+ if (mResources.OVR_multiview2 && mShaderType != GL_COMPUTE_SHADER)
{
switch (nameHash)
{
@@ -17296,7 +17296,7 @@ const TSymbol *TSymbolTable::findBuiltIn(const ImmutableString &name, int shader
}
}
}
- if (mResources.OVR_multiview && mShaderType != GL_COMPUTE_SHADER)
+ if (mResources.OVR_multiview2 && mShaderType != GL_COMPUTE_SHADER)
{
switch (nameHash)
{
diff --git a/chromium/third_party/angle/src/compiler/translator/TranslatorESSL.cpp b/chromium/third_party/angle/src/compiler/translator/TranslatorESSL.cpp
index 4491bf415e7..786a291e2c2 100644
--- a/chromium/third_party/angle/src/compiler/translator/TranslatorESSL.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/TranslatorESSL.cpp
@@ -132,7 +132,7 @@ void TranslatorESSL::writeExtensionBehavior(ShCompileOptions compileOptions)
{
if (iter->second != EBhUndefined)
{
- const bool isMultiview = (iter->first == TExtension::OVR_multiview);
+ const bool isMultiview = (iter->first == TExtension::OVR_multiview2);
if (getResources().NV_shader_framebuffer_fetch &&
iter->first == TExtension::EXT_shader_framebuffer_fetch)
{
@@ -151,7 +151,7 @@ void TranslatorESSL::writeExtensionBehavior(ShCompileOptions compileOptions)
{
// Emit the NV_viewport_array2 extension in a vertex shader if the
// SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is set and the
- // OVR_multiview(2) extension is requested.
+ // OVR_multiview2 extension is requested.
sink << "#extension GL_NV_viewport_array2 : require\n";
}
}
diff --git a/chromium/third_party/angle/src/compiler/translator/TranslatorGLSL.cpp b/chromium/third_party/angle/src/compiler/translator/TranslatorGLSL.cpp
index 2fdd20ede77..4bd8f548db6 100644
--- a/chromium/third_party/angle/src/compiler/translator/TranslatorGLSL.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/TranslatorGLSL.cpp
@@ -277,12 +277,12 @@ void TranslatorGLSL::writeExtensionBehavior(TIntermNode *root, ShCompileOptions
}
}
- const bool isMultiview = (iter.first == TExtension::OVR_multiview);
+ const bool isMultiview = (iter.first == TExtension::OVR_multiview2);
if (isMultiview && getShaderType() == GL_VERTEX_SHADER &&
(compileOptions & SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER) != 0u)
{
// Emit the NV_viewport_array2 extension in a vertex shader if the
- // SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is set and the OVR_multiview(2)
+ // SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER option is set and the OVR_multiview2(2)
// extension is requested.
sink << "#extension GL_NV_viewport_array2 : require\n";
}
diff --git a/chromium/third_party/angle/src/compiler/translator/Types.cpp b/chromium/third_party/angle/src/compiler/translator/Types.cpp
index 6fc5875fbb3..9d0374b170f 100644
--- a/chromium/third_party/angle/src/compiler/translator/Types.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/Types.cpp
@@ -756,7 +756,7 @@ void TType::createSamplerSymbols(const ImmutableString &namePrefix,
elementType.toArrayElementType();
for (unsigned int arrayIndex = 0u; arrayIndex < getOutermostArraySize(); ++arrayIndex)
{
- std::stringstream elementName;
+ std::stringstream elementName = sh::InitializeStream<std::stringstream>();
elementName << namePrefix << "_" << arrayIndex;
TStringStream elementApiName;
elementApiName << apiNamePrefix << "[" << arrayIndex << "]";
diff --git a/chromium/third_party/angle/src/compiler/translator/ValidateOutputs.cpp b/chromium/third_party/angle/src/compiler/translator/ValidateOutputs.cpp
index 81155237894..98802554d6c 100644
--- a/chromium/third_party/angle/src/compiler/translator/ValidateOutputs.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ValidateOutputs.cpp
@@ -119,7 +119,7 @@ void ValidateOutputsTraverser::validate(TDiagnostics *diagnostics) const
const size_t offsetLocation = location + elementIndex;
if ((*validOutputsToUse)[offsetLocation])
{
- std::stringstream strstr;
+ std::stringstream strstr = sh::InitializeStream<std::stringstream>();
strstr << "conflicting output locations with previously defined output '"
<< (*validOutputsToUse)[offsetLocation]->getName() << "'";
error(*symbol, strstr.str().c_str(), diagnostics);
diff --git a/chromium/third_party/angle/src/compiler/translator/ValidateVaryingLocations.cpp b/chromium/third_party/angle/src/compiler/translator/ValidateVaryingLocations.cpp
index 55f6dbeecaa..394e35c8d85 100644
--- a/chromium/third_party/angle/src/compiler/translator/ValidateVaryingLocations.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ValidateVaryingLocations.cpp
@@ -83,7 +83,7 @@ void ValidateShaderInterface(TDiagnostics *diagnostics,
const int offsetLocation = location + elementIndex;
if (locationMap.find(offsetLocation) != locationMap.end())
{
- std::stringstream strstr;
+ std::stringstream strstr = sh::InitializeStream<std::stringstream>();
strstr << "'" << varying->getName()
<< "' conflicting location with previously defined '"
<< locationMap[offsetLocation]->getName() << "'";
diff --git a/chromium/third_party/angle/src/compiler/translator/blocklayout.cpp b/chromium/third_party/angle/src/compiler/translator/blocklayout.cpp
index 58c4f7b50dd..7d0609ec823 100644
--- a/chromium/third_party/angle/src/compiler/translator/blocklayout.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/blocklayout.cpp
@@ -11,6 +11,7 @@
#include "common/mathutil.h"
#include "common/utilities.h"
+#include "compiler/translator/Common.h"
namespace sh
{
@@ -132,7 +133,7 @@ void TraverseArrayOfArraysVariable(const ShaderVariable &variable,
std::string CollapseNameStack(const std::vector<std::string> &nameStack)
{
- std::stringstream strstr;
+ std::stringstream strstr = sh::InitializeStream<std::stringstream>();
for (const std::string &part : nameStack)
{
strstr << part;
@@ -415,7 +416,7 @@ void VariableNameVisitor::exitArray(const ShaderVariable &arrayVar)
void VariableNameVisitor::enterArrayElement(const ShaderVariable &arrayVar,
unsigned int arrayElement)
{
- std::stringstream strstr;
+ std::stringstream strstr = sh::InitializeStream<std::stringstream>();
strstr << "[" << arrayElement << "]";
std::string elementString = strstr.str();
mNameStack.push_back(elementString);
diff --git a/chromium/third_party/angle/src/compiler/translator/builtin_symbols_hash_autogen.txt b/chromium/third_party/angle/src/compiler/translator/builtin_symbols_hash_autogen.txt
index 50754b56ce9..9a717b41644 100644
--- a/chromium/third_party/angle/src/compiler/translator/builtin_symbols_hash_autogen.txt
+++ b/chromium/third_party/angle/src/compiler/translator/builtin_symbols_hash_autogen.txt
@@ -1 +1 @@
-c0555364e16391744b56e1f5d9c614c0 \ No newline at end of file
+0af87b7f37d8a5260c859e9169a91f6a \ No newline at end of file
diff --git a/chromium/third_party/angle/src/compiler/translator/builtin_variables.json b/chromium/third_party/angle/src/compiler/translator/builtin_variables.json
index 3652bbc4e59..f9461b4bc6b 100644
--- a/chromium/third_party/angle/src/compiler/translator/builtin_variables.json
+++ b/chromium/third_party/angle/src/compiler/translator/builtin_variables.json
@@ -856,13 +856,13 @@
}
},
"Multiview":{
- "condition":"mResources.OVR_multiview && shaderType != GL_COMPUTE_SHADER",
+ "condition":"mResources.OVR_multiview2 && shaderType != GL_COMPUTE_SHADER",
"subgroups":{
"ESSL3":{
"variables":{
"gl_ViewID_OVR":{
"level":"ESSL3_BUILTINS",
- "extension":"OVR_multiview",
+ "extension":"OVR_multiview2",
"type":{
"basic":"UInt",
"precision":"High",
@@ -876,7 +876,7 @@
"gl_ViewID_OVR":{
"suffix":"ESSL1",
"level":"ESSL1_BUILTINS",
- "extension":"OVR_multiview",
+ "extension":"OVR_multiview2",
"type":{
"basic":"Int",
"precision":"High",
diff --git a/chromium/third_party/angle/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp b/chromium/third_party/angle/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp
index 2fccf55d111..c61e77a110e 100644
--- a/chromium/third_party/angle/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/emulated_builtin_functions_hlsl_autogen.cpp
@@ -2,7 +2,7 @@
// Generated by gen_emulated_builtin_function_tables.py using data from
// emulated_builtin_function_data_hlsl.json.
//
-// Copyright 2018 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.
//
diff --git a/chromium/third_party/angle/src/compiler/translator/gen_builtin_symbols.py b/chromium/third_party/angle/src/compiler/translator/gen_builtin_symbols.py
index e5193914fe6..ff14b0a73e6 100644
--- a/chromium/third_party/angle/src/compiler/translator/gen_builtin_symbols.py
+++ b/chromium/third_party/angle/src/compiler/translator/gen_builtin_symbols.py
@@ -15,34 +15,6 @@ import re
import os
import sys
-def set_working_dir():
- script_dir = os.path.dirname(os.path.abspath(__file__))
- os.chdir(script_dir)
-
-set_working_dir()
-
-variables_json_filename = 'builtin_variables.json'
-functions_txt_filename = 'builtin_function_declarations.txt'
-hash_filename = 'builtin_symbols_hash_autogen.txt'
-
-all_inputs = [os.path.abspath(__file__), variables_json_filename, functions_txt_filename]
-# This script takes a while to run since it searches for hash collisions of mangled names. To avoid
-# running it unnecessarily, we first check if we've already ran it with the same inputs.
-m = hashlib.md5()
-for input_path in all_inputs:
- with open(input_path, 'rU') as input_file:
- m.update(input_file.read())
-input_hash = m.hexdigest()
-if os.path.exists(hash_filename):
- with open(hash_filename) as hash_file:
- if input_hash == hash_file.read():
- print "Canceling ESSL static builtins code generator - generated hash matches inputs."
- sys.exit(0)
-
-parser = argparse.ArgumentParser()
-parser.add_argument('--dump-intermediate-json', help='Dump parsed function data as a JSON file builtin_functions.json', action="store_true")
-args = parser.parse_args()
-
template_immutablestringtest_cpp = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {function_data_source_name}.
//
@@ -328,6 +300,12 @@ basic_types_enumeration = [
'UImageCube'
]
+id_counter = 0
+
+def set_working_dir():
+ script_dir = os.path.dirname(os.path.abspath(__file__))
+ os.chdir(script_dir)
+
def get_basic_mangled_name(basic):
index = basic_types_enumeration.index(basic)
if index < 26:
@@ -381,7 +359,7 @@ class GroupedList:
def get_max_name_length(self):
return self.max_name_length
- def get_switch_code(self):
+ def get_switch_code(self, script_generated_hash_tests):
code = []
for level in levels:
if len(self.objs[level]) == 0:
@@ -398,7 +376,7 @@ class GroupedList:
switch = {}
for name, obj in objs.iteritems():
- name_hash = mangledNameHash(name)
+ name_hash = mangledNameHash(name, script_generated_hash_tests)
if name_hash not in switch:
switch[name_hash] = []
switch[name_hash].append(obj['hash_matched_code'])
@@ -575,7 +553,7 @@ class TType:
raise Exception('Unrecognized type: ' + str(glsl_header_type))
-def get_parsed_functions():
+def get_parsed_functions(functions_txt_filename):
def parse_function_parameters(parameters):
if parameters == '':
@@ -643,67 +621,6 @@ def get_parsed_functions():
return parsed_functions
-parsed_functions = get_parsed_functions()
-
-if args.dump_intermediate_json:
- with open('builtin_functions.json', 'w') as outfile:
- def serialize_obj(obj):
- if isinstance(obj, TType):
- return obj.data
- else:
- raise "Cannot serialize to JSON: " + str(obj)
- json.dump(parsed_functions, outfile, indent=4, separators=(',', ': '), default=serialize_obj)
-
-with open(variables_json_filename) as f:
- parsed_variables = json.load(f, object_pairs_hook=OrderedDict)
-
-# Declarations of symbol unique ids
-builtin_id_declarations = []
-
-# Definitions of symbol unique ids needed for those ids used outside of constexpr expressions.
-builtin_id_definitions = []
-
-# Declarations of name string variables
-name_declarations = set()
-
-# Declarations of builtin TVariables
-variable_declarations = []
-
-# Declarations of parameter arrays for builtin TFunctions. Map from C++ variable name to the full
-# declaration.
-parameter_declarations = {}
-
-# Declarations of builtin TFunctions
-function_declarations = []
-
-# Functions for querying the pointer to a specific TVariable.
-get_variable_declarations = []
-get_variable_definitions = []
-
-# Code for defining TVariables stored as members of TSymbolTable.
-declare_member_variables = []
-init_member_variables = []
-
-# Code for querying builtins.
-get_builtin_if_statements = GroupedList()
-
-# Declarations of UnmangledBuiltIn objects
-unmangled_builtin_declarations = set()
-
-# Code for querying builtin function unmangled names.
-unmangled_function_if_statements = GroupedList()
-
-# Code for testing that script-generated hashes match with runtime computed hashes.
-script_generated_hash_tests = OrderedDict()
-
-# Functions for testing whether a builtin belongs in group.
-is_in_group_definitions = []
-
-# Counts of variables with a certain name string:
-variable_name_count = {}
-
-id_counter = 0
-
fnvPrime = 16777619
def hash32(str):
fnvOffsetBasis = 0x811c9dc5
@@ -713,7 +630,7 @@ def hash32(str):
hash = (hash * fnvPrime) & 0xffffffff
return hash
-def mangledNameHash(str, save_test = True):
+def mangledNameHash(str, script_generated_hash_tests, save_test = True):
hash = hash32(str)
index = 0
max_six_bit_value = (1 << 6) - 1
@@ -776,27 +693,14 @@ def get_function_human_readable_name(function_name, parameters):
name += '_' + param.get_human_readable_name()
return name
-ttype_mangled_name_variants = []
-for basic_type in basic_types_enumeration:
- primary_sizes = [1]
- secondary_sizes = [1]
- if basic_type in ['Float', 'Int', 'UInt', 'Bool']:
- primary_sizes = [1, 2, 3, 4]
- if basic_type == 'Float':
- secondary_sizes = [1, 2, 3, 4]
- for primary_size in primary_sizes:
- for secondary_size in secondary_sizes:
- type = TType({'basic': basic_type, 'primarySize': primary_size, 'secondarySize': secondary_size})
- ttype_mangled_name_variants.append(type.get_mangled_name())
-
-def gen_parameters_variant_ids(str_len):
+def gen_parameters_variant_ids(str_len, ttype_mangled_name_variants):
# Note that this doesn't generate variants with array parameters or struct / interface block parameters. They are assumed to have been filtered out separately.
if str_len % 2 != 0:
raise Exception('Expecting parameters mangled name length to be divisible by two')
num_variants = pow(len(ttype_mangled_name_variants), str_len / 2)
return xrange(num_variants)
-def get_parameters_mangled_name_variant(variant_id, paren_location, total_length):
+def get_parameters_mangled_name_variant(variant_id, paren_location, total_length, ttype_mangled_name_variants):
str_len = total_length - paren_location - 1
if str_len % 2 != 0:
raise Exception('Expecting parameters mangled name length to be divisible by two')
@@ -813,8 +717,8 @@ def get_parameters_mangled_name_variant(variant_id, paren_location, total_length
# Calculate the mangled name hash of a common prefix string that's been pre-hashed with hash32()
# plus a variant of the parameters. This is faster than constructing the whole string and then
# calculating the hash for that.
-num_type_variants = len(ttype_mangled_name_variants)
-def get_mangled_name_variant_hash(prefix_hash32, variant_id, paren_location, total_length):
+def get_mangled_name_variant_hash(prefix_hash32, variant_id, paren_location, total_length,
+ num_type_variants, ttype_mangled_name_variants):
hash = prefix_hash32
parameter_count = (total_length - paren_location) >> 1
parameter_variant_id_base = variant_id
@@ -828,16 +732,13 @@ def get_mangled_name_variant_hash(prefix_hash32, variant_id, paren_location, tot
parameter_variant_id_base = parameter_variant_id_base / num_type_variants
return ((hash >> 13) ^ (hash & 0x1fff)) | (total_length << 19) | (paren_location << 25)
-# Sanity check for get_mangled_name_variant_hash:
-if get_mangled_name_variant_hash(hash32("atan("), 3, 4, len("atan(0123")) != mangledNameHash("atan(" + get_parameters_mangled_name_variant(3, 4, len("atan(0123"))):
- raise Exception("get_mangled_name_variant_hash sanity check failed")
-
-def mangled_name_hash_can_collide_with_different_parameters(function_variant_props):
+def mangled_name_hash_can_collide_with_different_parameters(function_variant_props, num_type_variants,
+ ttype_mangled_name_variants, script_generated_hash_tests):
# We exhaustively search through all possible lists of parameters and see if any other mangled
# name has the same hash.
mangled_name = function_variant_props['mangled_name']
mangled_name_len = len(mangled_name)
- hash = mangledNameHash(mangled_name)
+ hash = mangledNameHash(mangled_name, script_generated_hash_tests)
mangled_name_prefix = function_variant_props['name'] + '('
paren_location = len(mangled_name_prefix) - 1
prefix_hash32 = hash32(mangled_name_prefix)
@@ -846,8 +747,12 @@ def mangled_name_hash_can_collide_with_different_parameters(function_variant_pro
if (parameters_mangled_name_len > 6):
# This increases the complexity of searching for hash collisions considerably, so rather than doing it we just conservatively assume that a hash collision may be possible.
return True
- for variant_id in gen_parameters_variant_ids(parameters_mangled_name_len):
- if get_mangled_name_variant_hash(prefix_hash32, variant_id, paren_location, mangled_name_len) == hash and get_parameters_mangled_name_variant(variant_id, paren_location, mangled_name_len) != parameters_mangled_name:
+ for variant_id in gen_parameters_variant_ids(parameters_mangled_name_len, ttype_mangled_name_variants):
+ variant_hash = get_mangled_name_variant_hash(prefix_hash32, variant_id, paren_location, mangled_name_len,
+ num_type_variants, ttype_mangled_name_variants)
+ manged_name_variant = get_parameters_mangled_name_variant(variant_id, paren_location, mangled_name_len,
+ ttype_mangled_name_variants)
+ if variant_hash == hash and manged_name_variant != parameters_mangled_name:
return True
return False
@@ -880,7 +785,7 @@ def get_variable_name_to_store_parameters(parameters):
unique_name += param.get_mangled_name()
return unique_name
-def define_constexpr_variable(template_args):
+def define_constexpr_variable(template_args, variable_declarations):
template_variable_declaration = 'constexpr const TVariable kVar_{name_with_suffix}(BuiltInId::{name_with_suffix}, BuiltInName::{name}, SymbolType::BuiltIn, TExtension::{extension}, {type});'
variable_declarations.append(template_variable_declaration.format(**template_args))
@@ -928,11 +833,12 @@ def gen_function_variants(function_name, function_props):
function_variants.append(variant_props)
return function_variants
-defined_function_variants = set()
-defined_parameter_names = set()
-
-def process_single_function_group(condition, group_name, group):
+def process_single_function_group(condition, group_name, group, num_type_variants, parameter_declarations, ttype_mangled_name_variants,
+ name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations, defined_function_variants,
+ builtin_id_declarations, builtin_id_definitions, defined_parameter_names, variable_declarations, function_declarations,
+ script_generated_hash_tests, get_builtin_if_statements):
global id_counter
+
if 'functions' not in group:
return
@@ -1006,7 +912,7 @@ def process_single_function_group(condition, group_name, group):
param_template_args['id'] = id_counter
template_builtin_id_declaration = ' static constexpr const TSymbolUniqueId {name_with_suffix} = TSymbolUniqueId({id});'
builtin_id_declarations.append(template_builtin_id_declaration.format(**param_template_args))
- define_constexpr_variable(param_template_args)
+ define_constexpr_variable(param_template_args, variable_declarations)
defined_parameter_names.add(unique_param_name)
parameters_list.append('&BuiltInVariable::kVar_{name_with_suffix}'.format(**param_template_args));
@@ -1026,7 +932,8 @@ def process_single_function_group(condition, group_name, group):
# name and hash, then we can only check the mangled name length and the function name
# instead of checking the whole mangled name.
template_mangled_if = ''
- if mangled_name_hash_can_collide_with_different_parameters(template_args):
+ if mangled_name_hash_can_collide_with_different_parameters(template_args, num_type_variants,
+ ttype_mangled_name_variants, script_generated_hash_tests):
template_mangled_name_declaration = 'constexpr const ImmutableString {unique_name}("{mangled_name}");'
name_declarations.add(template_mangled_name_declaration.format(**template_args))
template_mangled_if = """if (name == BuiltInName::{unique_name})
@@ -1044,7 +951,11 @@ def process_single_function_group(condition, group_name, group):
id_counter += 1
-def process_function_group(group_name, group):
+def process_function_group(group_name, group, num_type_variants, parameter_declarations, ttype_mangled_name_variants,
+ name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations,
+ defined_function_variants, builtin_id_declarations, builtin_id_definitions, defined_parameter_names,
+ variable_declarations, function_declarations, script_generated_hash_tests, get_builtin_if_statements,
+ is_in_group_definitions):
global id_counter
first_id = id_counter
@@ -1052,11 +963,18 @@ def process_function_group(group_name, group):
if 'condition' in group:
condition = group['condition']
- process_single_function_group(condition, group_name, group)
+ process_single_function_group(condition, group_name, group, num_type_variants, parameter_declarations,
+ ttype_mangled_name_variants, name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations,
+ defined_function_variants, builtin_id_declarations, builtin_id_definitions, defined_parameter_names,
+ variable_declarations, function_declarations, script_generated_hash_tests, get_builtin_if_statements)
if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems():
- process_function_group(group_name + subgroup_name, subgroup)
+ process_function_group(group_name + subgroup_name, subgroup, num_type_variants, parameter_declarations,
+ ttype_mangled_name_variants, name_declarations, unmangled_function_if_statements,
+ unmangled_builtin_declarations, defined_function_variants, builtin_id_declarations,
+ builtin_id_definitions, defined_parameter_names, variable_declarations, function_declarations,
+ script_generated_hash_tests, get_builtin_if_statements, is_in_group_definitions)
if 'queryFunction' in group:
template_args = {
@@ -1071,12 +989,8 @@ def process_function_group(group_name, group):
}}"""
is_in_group_definitions.append(template_is_in_group_definition.format(**template_args))
-for group_name, group in parsed_functions.iteritems():
- process_function_group(group_name, group)
-
-def prune_parameters_arrays():
+def prune_parameters_arrays(parameter_declarations, function_declarations):
# We can share parameters arrays between functions in case one array is a subarray of another.
- global parameter_declarations
parameter_variable_name_replacements = {}
used_param_variable_names = set()
for param_variable_name, param_declaration in sorted(parameter_declarations.iteritems(), key=lambda item: -len(item[0])):
@@ -1088,14 +1002,16 @@ def prune_parameters_arrays():
break
if not replaced:
used_param_variable_names.add(param_variable_name)
- parameter_declarations = [value for key, value in parameter_declarations.iteritems() if key in used_param_variable_names]
for i in xrange(len(function_declarations)):
for replaced, replacement in parameter_variable_name_replacements.iteritems():
function_declarations[i] = function_declarations[i].replace('BuiltInParameters::' + replaced + ',', 'BuiltInParameters::' + replacement + ',')
-prune_parameters_arrays()
-def process_single_variable_group(condition, group_name, group):
+ return [value for key, value in parameter_declarations.iteritems() if key in used_param_variable_names]
+
+def process_single_variable_group(condition, group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations,
+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations,
+ get_variable_definitions, variable_name_count):
global id_counter
if 'variables' not in group:
return
@@ -1184,7 +1100,7 @@ def process_single_variable_group(condition, group_name, group):
else:
# Handle variables that can be stored as constexpr TVariable like
# gl_Position, gl_FragColor etc.
- define_constexpr_variable(template_args)
+ define_constexpr_variable(template_args, variable_declarations)
is_member = False
template_get_variable_declaration = 'const TVariable *{name_with_suffix}();'
@@ -1232,7 +1148,7 @@ def process_single_variable_group(condition, group_name, group):
id_counter += 1
-def count_variable_names(group):
+def count_variable_names(group, variable_name_count):
if 'variables' in group:
for name in group['variables'].iterkeys():
if name not in variable_name_count:
@@ -1241,9 +1157,12 @@ def count_variable_names(group):
variable_name_count[name] += 1
if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems():
- count_variable_names(subgroup)
+ count_variable_names(subgroup, variable_name_count)
-def process_variable_group(parent_condition, group_name, group):
+def process_variable_group(parent_condition, group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations,
+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations,
+ get_variable_definitions, variable_name_count):
+ global id_counter
condition = 'NO_CONDITION'
if 'condition' in group:
condition = group['condition']
@@ -1254,69 +1173,231 @@ def process_variable_group(parent_condition, group_name, group):
else:
condition = '({cond1}) && ({cond2})'.format(cond1 = parent_condition, cond2 = condition)
- process_single_variable_group(condition, group_name, group)
+ process_single_variable_group(condition, group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations,
+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations,
+ get_variable_definitions, variable_name_count)
if 'subgroups' in group:
for subgroup_name, subgroup in group['subgroups'].iteritems():
- process_variable_group(condition, subgroup_name, subgroup)
+ process_variable_group(condition, subgroup_name, subgroup, builtin_id_declarations, builtin_id_definitions, name_declarations,
+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations,
+ get_variable_definitions, variable_name_count)
+
+
+def main():
+
+ set_working_dir()
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--dump-intermediate-json', help='Dump parsed function data as a JSON file builtin_functions.json', action="store_true")
+ parser.add_argument('auto_script_command', nargs='?', default='')
+ args = parser.parse_args()
+
+ test_filename = '../../tests/compiler_tests/ImmutableString_test_autogen.cpp'
+ variables_json_filename = 'builtin_variables.json'
+ functions_txt_filename = 'builtin_function_declarations.txt'
+ hash_filename = 'builtin_symbols_hash_autogen.txt'
+
+ # auto_script parameters.
+ if args.auto_script_command != '':
+ inputs = [
+ functions_txt_filename,
+ variables_json_filename,
+ ]
+ outputs = [
+ 'ParseContext_autogen.h',
+ 'SymbolTable_autogen.cpp',
+ 'SymbolTable_autogen.h',
+ 'tree_util/BuiltIn_autogen.h',
+ test_filename,
+ hash_filename,
+ ]
+
+ if args.auto_script_command == 'inputs':
+ print ','.join(inputs)
+ elif args.auto_script_command == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+
+ all_inputs = [os.path.abspath(__file__), variables_json_filename, functions_txt_filename]
+ # This script takes a while to run since it searches for hash collisions of mangled names. To avoid
+ # running it unnecessarily, we first check if we've already ran it with the same inputs.
+ m = hashlib.md5()
+ for input_path in all_inputs:
+ with open(input_path, 'rU') as input_file:
+ m.update(input_file.read())
+ input_hash = m.hexdigest()
+ if os.path.exists(hash_filename):
+ with open(hash_filename) as hash_file:
+ if input_hash == hash_file.read():
+ print "Canceling ESSL static builtins code generator - generated hash matches inputs."
+ sys.exit(0)
+
+ # Declarations of symbol unique ids
+ builtin_id_declarations = []
+
+ # Definitions of symbol unique ids needed for those ids used outside of constexpr expressions.
+ builtin_id_definitions = []
+
+ # Declarations of name string variables
+ name_declarations = set()
+
+ # Declarations of builtin TVariables
+ variable_declarations = []
+
+ # Declarations of builtin TFunctions
+ function_declarations = []
+
+ # Functions for querying the pointer to a specific TVariable.
+ get_variable_declarations = []
+ get_variable_definitions = []
+
+ # Code for defining TVariables stored as members of TSymbolTable.
+ declare_member_variables = []
+ init_member_variables = []
+
+ # Code for querying builtins.
+ get_builtin_if_statements = GroupedList()
+
+ # Declarations of UnmangledBuiltIn objects
+ unmangled_builtin_declarations = set()
+
+ # Code for querying builtin function unmangled names.
+ unmangled_function_if_statements = GroupedList()
+
+ # Code for testing that script-generated hashes match with runtime computed hashes.
+ script_generated_hash_tests = OrderedDict()
+
+ # Functions for testing whether a builtin belongs in group.
+ is_in_group_definitions = []
+
+ # Counts of variables with a certain name string:
+ variable_name_count = {}
+
+ # Declarations of parameter arrays for builtin TFunctions. Map from C++ variable name to the full
+ # declaration.
+ parameter_declarations = {}
+
+ ttype_mangled_name_variants = []
+
+ defined_function_variants = set()
+ defined_parameter_names = set()
+
+
+ parsed_functions = get_parsed_functions(functions_txt_filename)
+
+ if args.dump_intermediate_json:
+ with open('builtin_functions.json', 'w') as outfile:
+ def serialize_obj(obj):
+ if isinstance(obj, TType):
+ return obj.data
+ else:
+ raise "Cannot serialize to JSON: " + str(obj)
+ json.dump(parsed_functions, outfile, indent=4, separators=(',', ': '), default=serialize_obj)
+
+ with open(variables_json_filename) as f:
+ parsed_variables = json.load(f, object_pairs_hook=OrderedDict)
+
+ for basic_type in basic_types_enumeration:
+ primary_sizes = [1]
+ secondary_sizes = [1]
+ if basic_type in ['Float', 'Int', 'UInt', 'Bool']:
+ primary_sizes = [1, 2, 3, 4]
+ if basic_type == 'Float':
+ secondary_sizes = [1, 2, 3, 4]
+ for primary_size in primary_sizes:
+ for secondary_size in secondary_sizes:
+ type = TType({'basic': basic_type, 'primarySize': primary_size, 'secondarySize': secondary_size})
+ ttype_mangled_name_variants.append(type.get_mangled_name())
+
+ num_type_variants = len(ttype_mangled_name_variants)
+
+ # Sanity check for get_mangled_name_variant_hash:
+ variant_hash = get_mangled_name_variant_hash(hash32("atan("), 3, 4, len("atan(0123"), num_type_variants,
+ ttype_mangled_name_variants)
+ mangled_name_hash = mangledNameHash("atan(" + get_parameters_mangled_name_variant(3, 4, len("atan(0123"),
+ ttype_mangled_name_variants), script_generated_hash_tests)
+ if variant_hash != mangled_name_hash:
+ raise Exception("get_mangled_name_variant_hash sanity check failed")
-for group_name, group in parsed_variables.iteritems():
- count_variable_names(group)
+ for group_name, group in parsed_functions.iteritems():
+ process_function_group(group_name, group, num_type_variants, parameter_declarations, ttype_mangled_name_variants,
+ name_declarations, unmangled_function_if_statements, unmangled_builtin_declarations,
+ defined_function_variants, builtin_id_declarations, builtin_id_definitions, defined_parameter_names,
+ variable_declarations, function_declarations, script_generated_hash_tests, get_builtin_if_statements,
+ is_in_group_definitions)
-for group_name, group in parsed_variables.iteritems():
- process_variable_group('NO_CONDITION', group_name, group)
+ parameter_declarations = prune_parameters_arrays(parameter_declarations, function_declarations)
-output_strings = {
- 'script_name': os.path.basename(__file__),
- 'copyright_year': date.today().year,
+ for group_name, group in parsed_variables.iteritems():
+ count_variable_names(group, variable_name_count)
- 'builtin_id_declarations': '\n'.join(builtin_id_declarations),
- 'builtin_id_definitions': '\n'.join(builtin_id_definitions),
- 'last_builtin_id': id_counter - 1,
- 'name_declarations': '\n'.join(sorted(list(name_declarations))),
+ for group_name, group in parsed_variables.iteritems():
+ process_variable_group('NO_CONDITION', group_name, group, builtin_id_declarations, builtin_id_definitions, name_declarations,
+ init_member_variables, get_variable_declarations, get_builtin_if_statements, declare_member_variables, variable_declarations,
+ get_variable_definitions, variable_name_count)
- 'function_data_source_name': functions_txt_filename,
- 'function_declarations': '\n'.join(function_declarations),
- 'parameter_declarations': '\n'.join(sorted(parameter_declarations)),
+ output_strings = {
+ 'script_name': os.path.basename(__file__),
+ 'copyright_year': date.today().year,
- 'is_in_group_definitions': '\n'.join(is_in_group_definitions),
+ 'builtin_id_declarations': '\n'.join(builtin_id_declarations),
+ 'builtin_id_definitions': '\n'.join(builtin_id_definitions),
+ 'last_builtin_id': id_counter - 1,
+ 'name_declarations': '\n'.join(sorted(list(name_declarations))),
- 'variable_data_source_name': variables_json_filename,
- 'variable_declarations': '\n'.join(sorted(variable_declarations)),
- 'get_variable_declarations': '\n'.join(sorted(get_variable_declarations)),
- 'get_variable_definitions': '\n'.join(sorted(get_variable_definitions)),
- 'unmangled_builtin_declarations': '\n'.join(sorted(unmangled_builtin_declarations)),
+ 'function_data_source_name': functions_txt_filename,
+ 'function_declarations': '\n'.join(function_declarations),
+ 'parameter_declarations': '\n'.join(sorted(parameter_declarations)),
- 'declare_member_variables': '\n'.join(declare_member_variables),
- 'init_member_variables': '\n'.join(init_member_variables),
+ 'is_in_group_definitions': '\n'.join(is_in_group_definitions),
- 'get_unmangled_builtin': unmangled_function_if_statements.get_switch_code(),
- 'get_builtin': get_builtin_if_statements.get_switch_code(),
- 'max_unmangled_name_length': unmangled_function_if_statements.get_max_name_length(),
- 'max_mangled_name_length': get_builtin_if_statements.get_max_name_length(),
+ 'variable_data_source_name': variables_json_filename,
+ 'variable_declarations': '\n'.join(sorted(variable_declarations)),
+ 'get_variable_declarations': '\n'.join(sorted(get_variable_declarations)),
+ 'get_variable_definitions': '\n'.join(sorted(get_variable_definitions)),
+ 'unmangled_builtin_declarations': '\n'.join(sorted(unmangled_builtin_declarations)),
- 'script_generated_hash_tests': '\n'.join(script_generated_hash_tests.iterkeys())
-}
+ 'declare_member_variables': '\n'.join(declare_member_variables),
+ 'init_member_variables': '\n'.join(init_member_variables),
-with open('../../tests/compiler_tests/ImmutableString_test_autogen.cpp', 'wt') as outfile_cpp:
- output_cpp = template_immutablestringtest_cpp.format(**output_strings)
- outfile_cpp.write(output_cpp)
+ 'get_unmangled_builtin': unmangled_function_if_statements.get_switch_code(script_generated_hash_tests),
+ 'get_builtin': get_builtin_if_statements.get_switch_code(script_generated_hash_tests),
+ 'max_unmangled_name_length': unmangled_function_if_statements.get_max_name_length(),
+ 'max_mangled_name_length': get_builtin_if_statements.get_max_name_length(),
-with open('tree_util/BuiltIn_autogen.h', 'wt') as outfile_header:
- output_header = template_builtin_header.format(**output_strings)
- outfile_header.write(output_header)
+ 'script_generated_hash_tests': '\n'.join(script_generated_hash_tests.iterkeys())
+ }
-with open('SymbolTable_autogen.cpp', 'wt') as outfile_cpp:
- output_cpp = template_symboltable_cpp.format(**output_strings)
- outfile_cpp.write(output_cpp)
+ with open(test_filename, 'wt') as outfile_cpp:
+ output_cpp = template_immutablestringtest_cpp.format(**output_strings)
+ outfile_cpp.write(output_cpp)
-with open('ParseContext_autogen.h', 'wt') as outfile_header:
- output_header = template_parsecontext_header.format(**output_strings)
- outfile_header.write(output_header)
+ with open('tree_util/BuiltIn_autogen.h', 'wt') as outfile_header:
+ output_header = template_builtin_header.format(**output_strings)
+ outfile_header.write(output_header)
+
+ with open('SymbolTable_autogen.cpp', 'wt') as outfile_cpp:
+ output_cpp = template_symboltable_cpp.format(**output_strings)
+ outfile_cpp.write(output_cpp)
+
+ with open('ParseContext_autogen.h', 'wt') as outfile_header:
+ output_header = template_parsecontext_header.format(**output_strings)
+ outfile_header.write(output_header)
+
+ with open('SymbolTable_autogen.h', 'wt') as outfile_h:
+ output_h = template_symboltable_h.format(**output_strings)
+ outfile_h.write(output_h)
+
+ with open(hash_filename, 'wt') as hash_file:
+ hash_file.write(input_hash)
+
+ return 0
-with open('SymbolTable_autogen.h', 'wt') as outfile_h:
- output_h = template_symboltable_h.format(**output_strings)
- outfile_h.write(output_h)
-with open(hash_filename, 'wt') as hash_file:
- hash_file.write(input_hash)
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/compiler/translator/gen_emulated_builtin_function_tables.py b/chromium/third_party/angle/src/compiler/translator/gen_emulated_builtin_function_tables.py
index 7bf6b610e2d..6f003a9b5e8 100644
--- a/chromium/third_party/angle/src/compiler/translator/gen_emulated_builtin_function_tables.py
+++ b/chromium/third_party/angle/src/compiler/translator/gen_emulated_builtin_function_tables.py
@@ -5,6 +5,7 @@
#
# gen_emulated_builtin_function_tables.py:
# Generator for the builtin function maps.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
import json
@@ -88,10 +89,6 @@ def enum_type(arg):
return 'UI' + arg_type[2:] + suffix
return arg_type.capitalize() + suffix
-input_script = "emulated_builtin_function_data_hlsl.json"
-hlsl_json = load_json(input_script)
-emulated_functions = []
-
def gen_emulated_function(data):
func = ""
@@ -109,17 +106,44 @@ def gen_emulated_function(data):
func += "},\n"
return [ func ]
-for item in hlsl_json:
- emulated_functions += gen_emulated_function(item)
-hlsl_fname = "emulated_builtin_functions_hlsl_autogen.cpp"
+def main():
+
+ input_script = "emulated_builtin_function_data_hlsl.json"
+ hlsl_fname = "emulated_builtin_functions_hlsl_autogen.cpp"
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [input_script]
+ outputs = [hlsl_fname]
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ hlsl_json = load_json(input_script)
+ emulated_functions = []
+
+ for item in hlsl_json:
+ emulated_functions += gen_emulated_function(item)
+
+ hlsl_gen = template_emulated_builtin_functions_hlsl.format(
+ script_name = sys.argv[0],
+ data_source_name = input_script,
+ copyright_year = date.today().year,
+ emulated_functions = "".join(emulated_functions))
+
+ with open(hlsl_fname, 'wt') as f:
+ f.write(hlsl_gen)
+ f.close()
+
+ return 0
-hlsl_gen = template_emulated_builtin_functions_hlsl.format(
- script_name = sys.argv[0],
- data_source_name = input_script,
- copyright_year = date.today().year,
- emulated_functions = "".join(emulated_functions))
-with open(hlsl_fname, 'wt') as f:
- f.write(hlsl_gen)
- f.close()
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/compiler/translator/glslang_lex.cpp b/chromium/third_party/angle/src/compiler/translator/glslang_lex.cpp
index 860eb3f0990..2bf0ab37b4d 100644
--- a/chromium/third_party/angle/src/compiler/translator/glslang_lex.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/glslang_lex.cpp
@@ -3895,7 +3895,7 @@ int ES2_ident_ES3_keyword_multiview_keyword(TParseContext *context, int token)
// not a reserved word in GLSL ES 1.00, so could be used as an identifier/type name
// except when multiview extension is enabled
- if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview))
+ if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview2))
{
yylval->lex.string = AllocatePoolCharArray(yytext, yyleng);
return check_type(yyscanner);
diff --git a/chromium/third_party/angle/src/compiler/translator/glslang_tab.cpp b/chromium/third_party/angle/src/compiler/translator/glslang_tab.cpp
index d26de9a6401..a60203b85cb 100644
--- a/chromium/third_party/angle/src/compiler/translator/glslang_tab.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/glslang_tab.cpp
@@ -416,12 +416,6 @@ extern void yyerror(YYLTYPE* yylloc, TParseContext* context, void *scanner, cons
} \
} while (0)
-#define ES3_OR_NEWER_OR_MULTIVIEW(TOKEN, LINE, REASON) do { \
- if (context->getShaderVersion() < 300 && !context->isExtensionEnabled(TExtension::OVR_multiview)) { \
- context->error(LINE, REASON " supported in GLSL ES 3.00 and above only", TOKEN); \
- } \
-} while (0)
-
#define ES3_1_ONLY(TOKEN, LINE, REASON) do { \
if (context->getShaderVersion() != 310) { \
context->error(LINE, REASON " supported in GLSL ES 3.10 only", TOKEN); \
@@ -3740,7 +3734,7 @@ yyreduce:
case 151:
{
- ES3_OR_NEWER_OR_MULTIVIEW("layout", (yylsp[-3]), "qualifier");
+ ES3_OR_NEWER("layout", (yylsp[-3]), "qualifier");
(yyval.interm.layoutQualifier) = (yyvsp[-1].interm.layoutQualifier);
}
diff --git a/chromium/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp b/chromium/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp
index ca4cf4a8ee5..ba19bd112ef 100644
--- a/chromium/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/tree_ops/EmulatePrecision.cpp
@@ -174,7 +174,7 @@ std::string RoundingHelperWriterGLSL::getTypeString(const char *glslType)
std::string RoundingHelperWriterESSL::getTypeString(const char *glslType)
{
- std::stringstream typeStrStr;
+ std::stringstream typeStrStr = sh::InitializeStream<std::stringstream>();
typeStrStr << "highp " << glslType;
return typeStrStr.str();
}
@@ -257,7 +257,7 @@ void RoundingHelperWriterGLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink)
void RoundingHelperWriterGLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink,
const unsigned int size)
{
- std::stringstream vecTypeStrStr;
+ std::stringstream vecTypeStrStr = sh::InitializeStream<std::stringstream>();
vecTypeStrStr << "vec" << size;
std::string vecType = getTypeString(vecTypeStrStr.str().c_str());
@@ -287,7 +287,7 @@ void RoundingHelperWriterGLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink,
const unsigned int rows,
const char *functionName)
{
- std::stringstream matTypeStrStr;
+ std::stringstream matTypeStrStr = sh::InitializeStream<std::stringstream>();
matTypeStrStr << "mat" << columns;
if (rows != columns)
{
@@ -379,7 +379,7 @@ void RoundingHelperWriterHLSL::writeFloatRoundingHelpers(TInfoSinkBase &sink)
void RoundingHelperWriterHLSL::writeVectorRoundingHelpers(TInfoSinkBase &sink,
const unsigned int size)
{
- std::stringstream vecTypeStrStr;
+ std::stringstream vecTypeStrStr = sh::InitializeStream<std::stringstream>();
vecTypeStrStr << "float" << size;
std::string vecType = vecTypeStrStr.str();
@@ -409,7 +409,7 @@ void RoundingHelperWriterHLSL::writeMatrixRoundingHelper(TInfoSinkBase &sink,
const unsigned int rows,
const char *functionName)
{
- std::stringstream matTypeStrStr;
+ std::stringstream matTypeStrStr = sh::InitializeStream<std::stringstream>();
matTypeStrStr << "float" << columns << "x" << rows;
std::string matType = matTypeStrStr.str();
@@ -744,7 +744,7 @@ TIntermAggregate *EmulatePrecision::createCompoundAssignmentFunctionCallNode(TIn
TIntermTyped *right,
const char *opNameStr)
{
- std::stringstream strstr;
+ std::stringstream strstr = sh::InitializeStream<std::stringstream>();
if (left->getPrecision() == EbpMedium)
strstr << "angle_compound_" << opNameStr << "_frm";
else
diff --git a/chromium/third_party/angle/src/gpu_info_util/SystemInfo.cpp b/chromium/third_party/angle/src/gpu_info_util/SystemInfo.cpp
index dc6fc0a471d..08a2c39a536 100644
--- a/chromium/third_party/angle/src/gpu_info_util/SystemInfo.cpp
+++ b/chromium/third_party/angle/src/gpu_info_util/SystemInfo.cpp
@@ -9,6 +9,7 @@
#include "gpu_info_util/SystemInfo.h"
#include <cstring>
+#include <iostream>
#include <sstream>
#include "common/debug.h"
@@ -16,7 +17,35 @@
namespace angle
{
-
+namespace
+{
+std::string VendorName(VendorID vendor)
+{
+ switch (vendor)
+ {
+ case kVendorID_AMD:
+ return "AMD";
+ case kVendorID_Intel:
+ return "Intel";
+ case kVendorID_ImgTec:
+ return "ImgTec";
+ case kVendorID_NVIDIA:
+ return "NVIDIA";
+ case kVendorID_Qualcomm:
+ return "Qualcomm";
+ case kVendorID_Vivante:
+ return "Vivante";
+ case kVendorID_VeriSilicon:
+ return "VeriSilicon";
+ case kVendorID_VMWare:
+ return "VMWare";
+ case kVendorID_Kazan:
+ return "Kazan";
+ default:
+ return "Unknown (" + std::to_string(vendor) + ")";
+ }
+}
+} // anonymous namespace
GPUDeviceInfo::GPUDeviceInfo() = default;
GPUDeviceInfo::~GPUDeviceInfo() = default;
@@ -29,6 +58,42 @@ SystemInfo::~SystemInfo() = default;
SystemInfo::SystemInfo(const SystemInfo &other) = default;
+bool SystemInfo::hasNVIDIAGPU() const
+{
+ for (const GPUDeviceInfo &gpu : gpus)
+ {
+ if (IsNVIDIA(gpu.vendorId))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool SystemInfo::hasIntelGPU() const
+{
+ for (const GPUDeviceInfo &gpu : gpus)
+ {
+ if (IsIntel(gpu.vendorId))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool SystemInfo::hasAMDGPU() const
+{
+ for (const GPUDeviceInfo &gpu : gpus)
+ {
+ if (IsAMD(gpu.vendorId))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
bool IsAMD(VendorID vendorId)
{
return vendorId == kVendorID_AMD;
@@ -54,9 +119,9 @@ bool IsIntel(VendorID vendorId)
return vendorId == kVendorID_Intel;
}
-bool IsNvidia(VendorID vendorId)
+bool IsNVIDIA(VendorID vendorId)
{
- return vendorId == kVendorID_Nvidia;
+ return vendorId == kVendorID_NVIDIA;
}
bool IsQualcomm(VendorID vendorId)
@@ -69,6 +134,11 @@ bool IsVeriSilicon(VendorID vendorId)
return vendorId == kVendorID_VeriSilicon;
}
+bool IsVMWare(VendorID vendorId)
+{
+ return vendorId == kVendorID_VMWare;
+}
+
bool IsVivante(VendorID vendorId)
{
return vendorId == kVendorID_Vivante;
@@ -187,10 +257,61 @@ void FindPrimaryGPU(SystemInfo *info)
}
}
- // Assume that a combination of AMD or Nvidia with Intel means Optimus or AMD Switchable
+ // Assume that a combination of NVIDIA or AMD with Intel means Optimus or AMD Switchable
info->primaryGPUIndex = primary;
- info->isOptimus = hasIntel && IsNvidia(info->gpus[primary].vendorId);
+ info->isOptimus = hasIntel && IsNVIDIA(info->gpus[primary].vendorId);
info->isAMDSwitchable = hasIntel && IsAMD(info->gpus[primary].vendorId);
}
+void PrintSystemInfo(const SystemInfo &info)
+{
+ std::cout << info.gpus.size() << " GPUs:\n";
+
+ for (size_t i = 0; i < info.gpus.size(); i++)
+ {
+ const auto &gpu = info.gpus[i];
+
+ std::cout << " " << i << " - " << VendorName(gpu.vendorId) << " device id: 0x" << std::hex
+ << std::uppercase << gpu.deviceId << std::dec << "\n";
+ if (!gpu.driverVendor.empty())
+ {
+ std::cout << " Driver Vendor: " << gpu.driverVendor << "\n";
+ }
+ if (!gpu.driverVersion.empty())
+ {
+ std::cout << " Driver Version: " << gpu.driverVersion << "\n";
+ }
+ if (!gpu.driverDate.empty())
+ {
+ std::cout << " Driver Date: " << gpu.driverDate << "\n";
+ }
+ }
+
+ std::cout << "\n";
+ std::cout << "Active GPU: " << info.activeGPUIndex << "\n";
+ std::cout << "Primary GPU: " << info.primaryGPUIndex << "\n";
+
+ std::cout << "\n";
+ std::cout << "Optimus: " << (info.isOptimus ? "true" : "false") << "\n";
+ std::cout << "AMD Switchable: " << (info.isAMDSwitchable ? "true" : "false") << "\n";
+
+ std::cout << "\n";
+ if (!info.machineManufacturer.empty())
+ {
+ std::cout << "Machine Manufacturer: " << info.machineManufacturer << "\n";
+ }
+ if (!info.machineModelName.empty())
+ {
+ std::cout << "Machine Model: " << info.machineModelName << "\n";
+ }
+ if (!info.machineModelVersion.empty())
+ {
+ std::cout << "Machine Model Version: " << info.machineModelVersion << "\n";
+ }
+ if (!info.primaryDisplayDeviceId.empty())
+ {
+ std::cout << "Primary Display Device: " << info.primaryDisplayDeviceId << "\n";
+ }
+ std::cout << std::endl;
+}
} // namespace angle
diff --git a/chromium/third_party/angle/src/gpu_info_util/SystemInfo.h b/chromium/third_party/angle/src/gpu_info_util/SystemInfo.h
index ac4e50fd8f8..f8d4ff7ea73 100644
--- a/chromium/third_party/angle/src/gpu_info_util/SystemInfo.h
+++ b/chromium/third_party/angle/src/gpu_info_util/SystemInfo.h
@@ -52,6 +52,10 @@ struct SystemInfo
SystemInfo(const SystemInfo &other);
+ bool hasNVIDIAGPU() const;
+ bool hasIntelGPU() const;
+ bool hasAMDGPU() const;
+
std::vector<GPUDeviceInfo> gpus;
// Index of the primary GPU (the discrete one on dual GPU systems) in `gpus`.
@@ -64,11 +68,13 @@ struct SystemInfo
bool isOptimus = false;
bool isAMDSwitchable = false;
- // Only available on Android, when added by the feature support utility
+ // Only available on Android
std::string machineManufacturer;
- // Only available on macOS
+ // Only available on macOS and Android
std::string machineModelName;
+
+ // Only available on macOS
std::string machineModelVersion;
// Only available on Windows, set even on failure.
@@ -85,8 +91,9 @@ constexpr VendorID kVendorID_AMD = 0x1002;
constexpr VendorID kVendorID_ARM = 0x13B5;
constexpr VendorID kVendorID_ImgTec = 0x1010;
constexpr VendorID kVendorID_Intel = 0x8086;
-constexpr VendorID kVendorID_Nvidia = 0x10DE;
+constexpr VendorID kVendorID_NVIDIA = 0x10DE;
constexpr VendorID kVendorID_Qualcomm = 0x5143;
+constexpr VendorID kVendorID_VMWare = 0x15ad;
// Known non-PCI (i.e. Khronos-registered) vendor IDs
constexpr VendorID kVendorID_Vivante = 0x10001;
@@ -99,11 +106,14 @@ bool IsARM(VendorID vendorId);
bool IsImgTec(VendorID vendorId);
bool IsIntel(VendorID vendorId);
bool IsKazan(VendorID vendorId);
-bool IsNvidia(VendorID vendorId);
+bool IsNVIDIA(VendorID vendorId);
bool IsQualcomm(VendorID vendorId);
bool IsVeriSilicon(VendorID vendorId);
+bool IsVMWare(VendorID vendorId);
bool IsVivante(VendorID vendorId);
+// Dumps the system info to stdout.
+void PrintSystemInfo(const SystemInfo &info);
} // namespace angle
#endif // GPU_INFO_UTIL_SYSTEM_INFO_H_
diff --git a/chromium/third_party/angle/src/gpu_info_util/SystemInfo_android.cpp b/chromium/third_party/angle/src/gpu_info_util/SystemInfo_android.cpp
index 552ca409449..743da00a0b4 100644
--- a/chromium/third_party/angle/src/gpu_info_util/SystemInfo_android.cpp
+++ b/chromium/third_party/angle/src/gpu_info_util/SystemInfo_android.cpp
@@ -10,6 +10,7 @@
#include <vulkan/vulkan.h>
#include "gpu_info_util/SystemInfo_internal.h"
+#include <sys/system_properties.h>
#include <cstring>
#include <fstream>
@@ -110,8 +111,29 @@ std::string FormatString(const char *fmt, ...)
return std::string(&buffer[0], len);
}
+bool GetAndroidSystemProperty(const std::string &propertyName, std::string *value)
+{
+ // PROP_VALUE_MAX from <sys/system_properties.h>
+ std::vector<char> propertyBuf(PROP_VALUE_MAX);
+ int len = __system_property_get(propertyName.c_str(), propertyBuf.data());
+ if (len <= 0)
+ {
+ return false;
+ }
+ *value = std::string(propertyBuf.data());
+ return true;
+}
+
bool GetSystemInfo(SystemInfo *info)
{
+ bool isFullyPopulated = true;
+
+ isFullyPopulated =
+ GetAndroidSystemProperty("ro.product.manufacturer", &info->machineManufacturer) &&
+ isFullyPopulated;
+ isFullyPopulated =
+ GetAndroidSystemProperty("ro.product.model", &info->machineModelName) && isFullyPopulated;
+
// This implementation builds on top of the Vulkan API, but cannot assume the existence of the
// Vulkan library. ANGLE can be installed on versions of Android as old as Ice Cream Sandwich.
// Therefore, we need to use dlopen()/dlsym() in order to see if Vulkan is installed on the
@@ -179,7 +201,7 @@ bool GetSystemInfo(SystemInfo *info)
gpu.driverVersion = FormatString("0x%x", properties.driverVersion);
gpu.detailedDriverVersion.major = properties.driverVersion;
break;
- case kVendorID_Nvidia:
+ case kVendorID_NVIDIA:
gpu.driverVendor = "NVIDIA Corporation";
gpu.driverVersion = FormatString("%d.%d.%d.%d", properties.driverVersion >> 22,
(properties.driverVersion >> 14) & 0XFF,
@@ -228,7 +250,7 @@ bool GetSystemInfo(SystemInfo *info)
gpu.driverDate = "";
}
- return true;
+ return isFullyPopulated;
}
} // namespace angle
diff --git a/chromium/third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp b/chromium/third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp
index 98f000b0696..b4d6aff4a38 100644
--- a/chromium/third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp
+++ b/chromium/third_party/angle/src/gpu_info_util/SystemInfo_linux.cpp
@@ -108,7 +108,7 @@ bool GetSystemInfo(SystemInfo *info)
}
}
- if (IsNvidia(gpu->vendorId))
+ if (IsNVIDIA(gpu->vendorId))
{
std::string version;
if (GetNvidiaDriverVersionWithXNVCtrl(&version))
@@ -127,7 +127,7 @@ bool GetSystemInfo(SystemInfo *info)
if (GetNvidiaDriverVersionWithXNVCtrl(&version))
{
GPUDeviceInfo nvidiaInfo;
- nvidiaInfo.vendorId = kVendorID_Nvidia;
+ nvidiaInfo.vendorId = kVendorID_NVIDIA;
nvidiaInfo.deviceId = 0;
gpu->driverVendor = "Nvidia";
gpu->driverVersion = std::move(version);
diff --git a/chromium/third_party/angle/src/image_util/loadimage.cpp b/chromium/third_party/angle/src/image_util/loadimage.cpp
index 56ad3b32e3a..b057017e839 100644
--- a/chromium/third_party/angle/src/image_util/loadimage.cpp
+++ b/chromium/third_party/angle/src/image_util/loadimage.cpp
@@ -1180,6 +1180,36 @@ void LoadG8R24ToR24G8(size_t width,
}
}
+void LoadD24S8ToD32FS8X24(size_t width,
+ size_t height,
+ size_t depth,
+ const uint8_t *input,
+ size_t inputRowPitch,
+ size_t inputDepthPitch,
+ uint8_t *output,
+ size_t outputRowPitch,
+ size_t outputDepthPitch)
+{
+ for (size_t z = 0; z < depth; z++)
+ {
+ for (size_t y = 0; y < height; y++)
+ {
+ const uint32_t *source =
+ priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);
+ float *destDepth =
+ priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);
+ uint32_t *destStencil =
+ priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch) +
+ 1;
+ for (size_t x = 0; x < width; x++)
+ {
+ destDepth[x * 2] = (source[x] & 0xFFFFFF) / static_cast<float>(0xFFFFFF);
+ destStencil[x * 2] = source[x] & 0xFF000000;
+ }
+ }
+ }
+}
+
void LoadD32FToD32F(size_t width,
size_t height,
size_t depth,
@@ -1206,6 +1236,36 @@ void LoadD32FToD32F(size_t width,
}
}
+void LoadD32FS8X24ToD24S8(size_t width,
+ size_t height,
+ size_t depth,
+ const uint8_t *input,
+ size_t inputRowPitch,
+ size_t inputDepthPitch,
+ uint8_t *output,
+ size_t outputRowPitch,
+ size_t outputDepthPitch)
+{
+ for (size_t z = 0; z < depth; z++)
+ {
+ for (size_t y = 0; y < height; y++)
+ {
+ const float *sourceDepth =
+ priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
+ const uint32_t *sourceStencil =
+ priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch) + 1;
+ uint32_t *dest =
+ priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);
+ for (size_t x = 0; x < width; x++)
+ {
+ uint32_t d = static_cast<uint32_t>(gl::clamp01(sourceDepth[x * 2]) * 0xFFFFFF);
+ uint32_t s = sourceStencil[x * 2] & 0xFF000000;
+ dest[x] = d | s;
+ }
+ }
+ }
+}
+
void LoadD32FS8X24ToD32FS8X24(size_t width,
size_t height,
size_t depth,
@@ -1267,6 +1327,34 @@ void LoadRGB32FToRGBA16F(size_t width,
}
}
+void LoadRGB32FToRGB16F(size_t width,
+ size_t height,
+ size_t depth,
+ const uint8_t *input,
+ size_t inputRowPitch,
+ size_t inputDepthPitch,
+ uint8_t *output,
+ size_t outputRowPitch,
+ size_t outputDepthPitch)
+{
+ for (size_t z = 0; z < depth; z++)
+ {
+ for (size_t y = 0; y < height; y++)
+ {
+ const float *source =
+ priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);
+ uint16_t *dest =
+ priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);
+ for (size_t x = 0; x < width; x++)
+ {
+ dest[x * 3 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);
+ dest[x * 3 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);
+ dest[x * 3 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);
+ }
+ }
+ }
+}
+
void LoadR32ToR16(size_t width,
size_t height,
size_t depth,
diff --git a/chromium/third_party/angle/src/image_util/loadimage.h b/chromium/third_party/angle/src/image_util/loadimage.h
index ab43054674e..485c6a49566 100644
--- a/chromium/third_party/angle/src/image_util/loadimage.h
+++ b/chromium/third_party/angle/src/image_util/loadimage.h
@@ -385,6 +385,16 @@ void LoadG8R24ToR24G8(size_t width,
size_t outputRowPitch,
size_t outputDepthPitch);
+void LoadD24S8ToD32FS8X24(size_t width,
+ size_t height,
+ size_t depth,
+ const uint8_t *input,
+ size_t inputRowPitch,
+ size_t inputDepthPitch,
+ uint8_t *output,
+ size_t outputRowPitch,
+ size_t outputDepthPitch);
+
void LoadD32FToD32F(size_t width,
size_t height,
size_t depth,
@@ -395,6 +405,16 @@ void LoadD32FToD32F(size_t width,
size_t outputRowPitch,
size_t outputDepthPitch);
+void LoadD32FS8X24ToD24S8(size_t width,
+ size_t height,
+ size_t depth,
+ const uint8_t *input,
+ size_t inputRowPitch,
+ size_t inputDepthPitch,
+ uint8_t *output,
+ size_t outputRowPitch,
+ size_t outputDepthPitch);
+
void LoadD32FS8X24ToD32FS8X24(size_t width,
size_t height,
size_t depth,
@@ -448,6 +468,16 @@ void LoadRGB32FToRGBA16F(size_t width,
size_t outputRowPitch,
size_t outputDepthPitch);
+void LoadRGB32FToRGB16F(size_t width,
+ size_t height,
+ size_t depth,
+ const uint8_t *input,
+ size_t inputRowPitch,
+ size_t inputDepthPitch,
+ uint8_t *output,
+ size_t outputRowPitch,
+ size_t outputDepthPitch);
+
template <size_t blockWidth, size_t blockHeight, size_t blockSize>
inline void LoadCompressedToNative(size_t width,
size_t height,
diff --git a/chromium/third_party/angle/src/libANGLE/Caps.cpp b/chromium/third_party/angle/src/libANGLE/Caps.cpp
index a49a93a1773..69774816ab7 100644
--- a/chromium/third_party/angle/src/libANGLE/Caps.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Caps.cpp
@@ -197,7 +197,7 @@ Extensions::Extensions()
standardDerivatives(false),
shaderTextureLOD(false),
fragDepth(false),
- multiview(false),
+ multiview2(false),
maxViews(1u),
textureUsage(false),
translatedShaderSource(false),
@@ -208,6 +208,10 @@ Extensions::Extensions()
eglImageExternal(false),
eglImageExternalEssl3(false),
eglSync(false),
+ memoryObject(false),
+ memoryObjectFd(false),
+ semaphore(false),
+ semaphoreFd(false),
eglStreamConsumerExternal(false),
unpackSubimage(false),
packSubimage(false),
@@ -687,7 +691,7 @@ static bool DetermineColorBufferFloatRGBASupport(const TextureCapsMap &textureCa
GL_RGBA32F,
};
- return GetFormatSupport(textureCaps, requiredFormats, true, false, true, false);
+ return GetFormatSupport(textureCaps, requiredFormats, true, false, true, true);
}
// Check for GL_EXT_color_buffer_float
@@ -861,7 +865,7 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_OES_standard_derivatives"] = enableableExtension(&Extensions::standardDerivatives);
map["GL_EXT_shader_texture_lod"] = enableableExtension(&Extensions::shaderTextureLOD);
map["GL_EXT_frag_depth"] = enableableExtension(&Extensions::fragDepth);
- map["GL_ANGLE_multiview"] = enableableExtension(&Extensions::multiview);
+ map["GL_OVR_multiview2"] = enableableExtension(&Extensions::multiview2);
map["GL_ANGLE_texture_usage"] = enableableExtension(&Extensions::textureUsage);
map["GL_ANGLE_translated_shader_source"] = esOnlyExtension(&Extensions::translatedShaderSource);
map["GL_OES_fbo_render_mipmap"] = enableableExtension(&Extensions::fboRenderMipmap);
@@ -871,6 +875,10 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_OES_EGL_image_external"] = enableableExtension(&Extensions::eglImageExternal);
map["GL_OES_EGL_image_external_essl3"] = enableableExtension(&Extensions::eglImageExternalEssl3);
map["GL_OES_EGL_sync"] = esOnlyExtension(&Extensions::eglSync);
+ map["GL_EXT_memory_object"] = enableableExtension(&Extensions::memoryObject);
+ map["GL_EXT_memory_object_fd"] = enableableExtension(&Extensions::memoryObjectFd);
+ map["GL_EXT_semaphore"] = enableableExtension(&Extensions::semaphore);
+ map["GL_EXT_semaphore_fd"] = enableableExtension(&Extensions::semaphoreFd);
map["GL_NV_EGL_stream_consumer_external"] = enableableExtension(&Extensions::eglStreamConsumerExternal);
map["GL_EXT_unpack_subimage"] = enableableExtension(&Extensions::unpackSubimage);
map["GL_NV_pack_subimage"] = enableableExtension(&Extensions::packSubimage);
@@ -914,6 +922,7 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_ANGLE_texture_multisample"] = enableableExtension(&Extensions::textureMultisample);
map["GL_ANGLE_multi_draw"] = enableableExtension(&Extensions::multiDraw);
map["GL_ANGLE_provoking_vertex"] = enableableExtension(&Extensions::provokingVertex);
+ map["GL_CHROMIUM_lose_context"] = enableableExtension(&Extensions::loseContextCHROMIUM);
// GLES1 extensinos
map["GL_OES_point_size_array"] = enableableExtension(&Extensions::pointSizeArray);
map["GL_OES_texture_cube_map"] = enableableExtension(&Extensions::textureCubeMap);
@@ -1071,6 +1080,8 @@ Caps::Caps()
maxGeometryTotalOutputComponents(0),
maxGeometryShaderInvocations(0),
+ subPixelBits(4),
+
// GLES1 emulation: Table 6.20 / 6.22 (ES 1.1 spec)
maxMultitextureUnits(0),
maxClipPlanes(0),
diff --git a/chromium/third_party/angle/src/libANGLE/Caps.h b/chromium/third_party/angle/src/libANGLE/Caps.h
index bbd17dd0955..dc81ae4edea 100644
--- a/chromium/third_party/angle/src/libANGLE/Caps.h
+++ b/chromium/third_party/angle/src/libANGLE/Caps.h
@@ -302,8 +302,8 @@ struct Extensions
// GL_EXT_frag_depth
bool fragDepth;
- // ANGLE_multiview
- bool multiview;
+ // OVR_multiview2
+ bool multiview2;
GLuint maxViews;
// GL_ANGLE_texture_usage
@@ -333,6 +333,18 @@ struct Extensions
// GL_OES_EGL_sync
bool eglSync;
+ // GL_EXT_memory_object
+ bool memoryObject;
+
+ // GL_EXT_memory_object_fd
+ bool memoryObjectFd;
+
+ // GL_EXT_semaphore
+ bool semaphore;
+
+ // GL_EXT_semaphore_fd
+ bool semaphoreFd;
+
// NV_EGL_stream_consumer_external
bool eglStreamConsumerExternal;
@@ -480,6 +492,9 @@ struct Extensions
// GL_ANGLE_provoking_vertex
bool provokingVertex = false;
+
+ // GL_CHROMIUM_lose_context
+ bool loseContextCHROMIUM = false;
};
struct ExtensionInfo
@@ -681,6 +696,8 @@ struct Caps
GLuint maxGeometryTotalOutputComponents;
GLuint maxGeometryShaderInvocations;
+ GLuint subPixelBits;
+
// GLES1 emulation: Caps for ES 1.1. Taken from Table 6.20 / 6.22 in the OpenGL ES 1.1 spec.
GLuint maxMultitextureUnits;
GLuint maxClipPlanes;
diff --git a/chromium/third_party/angle/src/libANGLE/Compiler.cpp b/chromium/third_party/angle/src/libANGLE/Compiler.cpp
index 3e27478f2e2..22bc4706265 100644
--- a/chromium/third_party/angle/src/libANGLE/Compiler.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Compiler.cpp
@@ -92,9 +92,9 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const State &state)
mResources.FragmentPrecisionHigh = 1;
mResources.EXT_frag_depth = extensions.fragDepth;
- // OVR_multiview state
- mResources.OVR_multiview = extensions.multiview;
- mResources.MaxViewsOVR = extensions.maxViews;
+ // OVR_multiview2 state
+ mResources.OVR_multiview2 = extensions.multiview2;
+ mResources.MaxViewsOVR = extensions.maxViews;
// GLSL ES 3.0 constants
mResources.MaxVertexOutputVectors = caps.maxVertexOutputComponents / 4;
diff --git a/chromium/third_party/angle/src/libANGLE/Config.cpp b/chromium/third_party/angle/src/libANGLE/Config.cpp
index 386b7bcb336..4134226d052 100644
--- a/chromium/third_party/angle/src/libANGLE/Config.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Config.cpp
@@ -34,7 +34,7 @@ Config::Config()
alphaMaskSize(0),
bindToTextureRGB(EGL_FALSE),
bindToTextureRGBA(EGL_FALSE),
- colorBufferType(EGL_NONE),
+ colorBufferType(EGL_RGB_BUFFER),
configCaveat(EGL_NONE),
configID(0),
conformant(0),
@@ -273,7 +273,7 @@ std::vector<const Config *> ConfigSet::filter(const AttributeMap &attributeMap)
match = config.configID == attributeValue;
break;
case EGL_LEVEL:
- match = config.level >= attributeValue;
+ match = config.level == attributeValue;
break;
case EGL_NATIVE_RENDERABLE:
match = config.nativeRenderable == static_cast<EGLBoolean>(attributeValue);
@@ -294,13 +294,22 @@ std::vector<const Config *> ConfigSet::filter(const AttributeMap &attributeMap)
match = config.transparentType == static_cast<EGLenum>(attributeValue);
break;
case EGL_TRANSPARENT_BLUE_VALUE:
- match = config.transparentBlueValue == attributeValue;
+ if (attributeMap.get(EGL_TRANSPARENT_TYPE, EGL_NONE) != EGL_NONE)
+ {
+ match = config.transparentBlueValue == attributeValue;
+ }
break;
case EGL_TRANSPARENT_GREEN_VALUE:
- match = config.transparentGreenValue == attributeValue;
+ if (attributeMap.get(EGL_TRANSPARENT_TYPE, EGL_NONE) != EGL_NONE)
+ {
+ match = config.transparentGreenValue == attributeValue;
+ }
break;
case EGL_TRANSPARENT_RED_VALUE:
- match = config.transparentRedValue == attributeValue;
+ if (attributeMap.get(EGL_TRANSPARENT_TYPE, EGL_NONE) != EGL_NONE)
+ {
+ match = config.transparentRedValue == attributeValue;
+ }
break;
case EGL_BIND_TO_TEXTURE_RGB:
match = config.bindToTextureRGB == static_cast<EGLBoolean>(attributeValue);
diff --git a/chromium/third_party/angle/src/libANGLE/Context.cpp b/chromium/third_party/angle/src/libANGLE/Context.cpp
index 1ccbcdd320f..bc3dc77165b 100644
--- a/chromium/third_party/angle/src/libANGLE/Context.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Context.cpp
@@ -26,6 +26,7 @@
#include "libANGLE/Fence.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/FramebufferAttachment.h"
+#include "libANGLE/MemoryObject.h"
#include "libANGLE/Path.h"
#include "libANGLE/Program.h"
#include "libANGLE/ProgramPipeline.h"
@@ -291,14 +292,14 @@ Context::Context(rx::EGLImplFactory *implFactory,
mClientType(EGL_OPENGL_ES_API),
mHasBeenCurrent(false),
mContextLost(false),
- mResetStatus(GL_NO_ERROR),
+ mResetStatus(GraphicsResetStatus::NoError),
mContextLostForced(false),
mResetStrategy(GetResetStrategy(attribs)),
mRobustAccess(GetRobustAccess(attribs)),
mSurfacelessSupported(displayExtensions.surfacelessContext),
mExplicitContextAvailable(clientExtensions.explicitContext),
mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
- mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
+ mDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
mWebGLContext(GetWebGLContext(attribs)),
mBufferAccessValidationEnabled(false),
mExtensionsEnabled(GetExtensionsEnabled(attribs, mWebGLContext)),
@@ -547,6 +548,7 @@ egl::Error Context::onDestroy(const egl::Display *display)
mState.mPathManager->release(this);
mState.mFramebufferManager->release(this);
mState.mProgramPipelineManager->release(this);
+ mState.mMemoryObjectManager->release(this);
mThreadPool.reset();
@@ -569,7 +571,7 @@ EGLLabelKHR Context::getLabel() const
egl::Error Context::makeCurrent(egl::Display *display, egl::Surface *surface)
{
- mCurrentDisplay = display;
+ mDisplay = display;
if (!mHasBeenCurrent)
{
@@ -727,6 +729,11 @@ GLuint Context::createShaderProgramv(ShaderType type, GLsizei count, const GLcha
return 0u;
}
+GLuint Context::createMemoryObject()
+{
+ return mState.mMemoryObjectManager->createMemoryObject(mImplementation.get());
+}
+
void Context::deleteBuffer(GLuint bufferName)
{
Buffer *buffer = mState.mBufferManager->getBuffer(bufferName);
@@ -787,6 +794,11 @@ void Context::deleteProgramPipeline(GLuint pipeline)
mState.mProgramPipelineManager->deleteObject(this, pipeline);
}
+void Context::deleteMemoryObject(GLuint memoryObject)
+{
+ mState.mMemoryObjectManager->deleteMemoryObject(this, memoryObject);
+}
+
void Context::deletePaths(GLuint first, GLsizei range)
{
mState.mPathManager->deletePaths(first, range);
@@ -891,6 +903,14 @@ void Context::pathStencilFunc(GLenum func, GLint ref, GLuint mask)
mState.setPathStencilFunc(func, ref, mask);
}
+// GL_CHROMIUM_lose_context
+void Context::loseContext(GraphicsResetStatus current, GraphicsResetStatus other)
+{
+ // TODO(geofflang): mark the rest of the share group lost. Requires access to the entire share
+ // group from a context. http://anglebug.com/3379
+ markContextLost(current);
+}
+
void Context::deleteFramebuffer(GLuint framebuffer)
{
if (mState.mFramebufferManager->getFramebuffer(framebuffer))
@@ -1100,6 +1120,7 @@ void Context::bindSampler(GLuint textureUnit, GLuint samplerHandle)
mState.mSamplerManager->checkSamplerAllocation(mImplementation.get(), samplerHandle);
mState.setSamplerBinding(this, textureUnit, sampler);
mSamplerObserverBindings[textureUnit].bind(sampler);
+ mStateCache.onActiveTextureChange(this);
}
void Context::bindImageTexture(GLuint unit,
@@ -1213,6 +1234,16 @@ void Context::getQueryivRobust(QueryType target,
getQueryiv(target, pname, params);
}
+void Context::getUnsignedBytev(GLenum pname, GLubyte *data)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::getUnsignedBytei_v(GLenum target, GLuint index, GLubyte *data)
+{
+ UNIMPLEMENTED();
+}
+
void Context::getQueryObjectiv(GLuint id, GLenum pname, GLint *params)
{
ANGLE_CONTEXT_TRY(GetQueryObjectParameter(this, getQuery(id), pname, params));
@@ -1302,12 +1333,17 @@ Query *Context::getQuery(GLuint handle) const
return mQueryMap.query(handle);
}
-Texture *Context::getTargetTexture(TextureType type) const
+Texture *Context::getTextureByType(TextureType type) const
{
ASSERT(ValidTextureTarget(this, type) || ValidTextureExternalTarget(this, type));
return mState.getTargetTexture(type);
}
+Texture *Context::getTextureByTarget(TextureTarget target) const
+{
+ return getTextureByType(TextureTargetToType(target));
+}
+
Texture *Context::getSamplerTexture(unsigned int sampler, TextureType type) const
{
return mState.getSamplerTexture(sampler, type);
@@ -1440,7 +1476,7 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mState.mCaps.maxDrawBuffers;
break;
case GL_SUBPIXEL_BITS:
- *params = 4;
+ *params = mState.mCaps.subPixelBits;
break;
case GL_MAX_TEXTURE_SIZE:
*params = mState.mCaps.max2DTextureSize;
@@ -1561,8 +1597,8 @@ void Context::getIntegervImpl(GLenum pname, GLint *params)
*params = mState.mExtensions.maxLabelLength;
break;
- // GL_ANGLE_multiview
- case GL_MAX_VIEWS_ANGLE:
+ // GL_OVR_multiview2
+ case GL_MAX_VIEWS_OVR:
*params = mState.mExtensions.maxViews;
break;
@@ -2008,7 +2044,7 @@ void Context::getRenderbufferParameterivRobust(GLenum target,
void Context::getTexParameterfv(TextureType target, GLenum pname, GLfloat *params)
{
- const Texture *const texture = getTargetTexture(target);
+ const Texture *const texture = getTextureByType(target);
QueryTexParameterfv(texture, pname, params);
}
@@ -2023,19 +2059,19 @@ void Context::getTexParameterfvRobust(TextureType target,
void Context::getTexParameteriv(TextureType target, GLenum pname, GLint *params)
{
- const Texture *const texture = getTargetTexture(target);
+ const Texture *const texture = getTextureByType(target);
QueryTexParameteriv(texture, pname, params);
}
void Context::getTexParameterIiv(TextureType target, GLenum pname, GLint *params)
{
- const Texture *const texture = getTargetTexture(target);
+ const Texture *const texture = getTextureByType(target);
QueryTexParameterIiv(texture, pname, params);
}
void Context::getTexParameterIuiv(TextureType target, GLenum pname, GLuint *params)
{
- const Texture *const texture = getTargetTexture(target);
+ const Texture *const texture = getTextureByType(target);
QueryTexParameterIuiv(texture, pname, params);
}
@@ -2068,7 +2104,7 @@ void Context::getTexParameterIuivRobust(TextureType target,
void Context::getTexLevelParameteriv(TextureTarget target, GLint level, GLenum pname, GLint *params)
{
- Texture *texture = getTargetTexture(TextureTargetToType(target));
+ Texture *texture = getTextureByTarget(target);
QueryTexLevelParameteriv(texture, target, level, pname, params);
}
@@ -2087,7 +2123,7 @@ void Context::getTexLevelParameterfv(TextureTarget target,
GLenum pname,
GLfloat *params)
{
- Texture *texture = getTargetTexture(TextureTargetToType(target));
+ Texture *texture = getTextureByTarget(target);
QueryTexLevelParameterfv(texture, target, level, pname, params);
}
@@ -2103,13 +2139,13 @@ void Context::getTexLevelParameterfvRobust(TextureTarget target,
void Context::texParameterf(TextureType target, GLenum pname, GLfloat param)
{
- Texture *const texture = getTargetTexture(target);
+ Texture *const texture = getTextureByType(target);
SetTexParameterf(this, texture, pname, param);
}
void Context::texParameterfv(TextureType target, GLenum pname, const GLfloat *params)
{
- Texture *const texture = getTargetTexture(target);
+ Texture *const texture = getTextureByType(target);
SetTexParameterfv(this, texture, pname, params);
}
@@ -2123,25 +2159,25 @@ void Context::texParameterfvRobust(TextureType target,
void Context::texParameteri(TextureType target, GLenum pname, GLint param)
{
- Texture *const texture = getTargetTexture(target);
+ Texture *const texture = getTextureByType(target);
SetTexParameteri(this, texture, pname, param);
}
void Context::texParameteriv(TextureType target, GLenum pname, const GLint *params)
{
- Texture *const texture = getTargetTexture(target);
+ Texture *const texture = getTextureByType(target);
SetTexParameteriv(this, texture, pname, params);
}
void Context::texParameterIiv(TextureType target, GLenum pname, const GLint *params)
{
- Texture *const texture = getTargetTexture(target);
+ Texture *const texture = getTextureByType(target);
SetTexParameterIiv(this, texture, pname, params);
}
void Context::texParameterIuiv(TextureType target, GLenum pname, const GLuint *params)
{
- Texture *const texture = getTargetTexture(target);
+ Texture *const texture = getTextureByType(target);
SetTexParameterIuiv(this, texture, pname, params);
}
@@ -2580,11 +2616,12 @@ GLenum Context::getError()
}
// NOTE: this function should not assume that this context is current!
-void Context::markContextLost()
+void Context::markContextLost(GraphicsResetStatus status)
{
+ ASSERT(status != GraphicsResetStatus::NoError);
if (mResetStrategy == GL_LOSE_CONTEXT_ON_RESET_EXT)
{
- mResetStatus = GL_UNKNOWN_CONTEXT_RESET_EXT;
+ mResetStatus = status;
mContextLostForced = true;
}
mContextLost = true;
@@ -2596,7 +2633,7 @@ GLenum Context::getGraphicsResetStatus()
// as it will allow us to skip all the calls.
if (mResetStrategy == GL_NO_RESET_NOTIFICATION_EXT)
{
- if (!mContextLost && mImplementation->getResetStatus() != GL_NO_ERROR)
+ if (!mContextLost && mImplementation->getResetStatus() != GraphicsResetStatus::NoError)
{
mContextLost = true;
}
@@ -2612,15 +2649,15 @@ GLenum Context::getGraphicsResetStatus()
// once the device has finished resetting.
if (!mContextLost)
{
- ASSERT(mResetStatus == GL_NO_ERROR);
+ ASSERT(mResetStatus == GraphicsResetStatus::NoError);
mResetStatus = mImplementation->getResetStatus();
- if (mResetStatus != GL_NO_ERROR)
+ if (mResetStatus != GraphicsResetStatus::NoError)
{
mContextLost = true;
}
}
- else if (!mContextLostForced && mResetStatus != GL_NO_ERROR)
+ else if (!mContextLostForced && mResetStatus != GraphicsResetStatus::NoError)
{
// If markContextLost was used to mark the context lost then
// assume that is not recoverable, and continue to report the
@@ -2628,7 +2665,7 @@ GLenum Context::getGraphicsResetStatus()
mResetStatus = mImplementation->getResetStatus();
}
- return mResetStatus;
+ return ToGLenum(mResetStatus);
}
bool Context::isResetNotificationEnabled()
@@ -3140,7 +3177,7 @@ Extensions Context::generateSupportedExtensions() const
supportedExtensions.colorBufferFloat = false;
supportedExtensions.eglImageExternalEssl3 = false;
supportedExtensions.textureNorm16 = false;
- supportedExtensions.multiview = false;
+ supportedExtensions.multiview2 = false;
supportedExtensions.maxViews = 1u;
supportedExtensions.copyTexture3d = false;
supportedExtensions.textureMultisample = false;
@@ -3213,14 +3250,17 @@ Extensions Context::generateSupportedExtensions() const
}
// If EGL_KHR_fence_sync is not enabled, don't expose GL_OES_EGL_sync.
- ASSERT(mCurrentDisplay);
- if (!mCurrentDisplay->getExtensions().fenceSync)
+ ASSERT(mDisplay);
+ if (!mDisplay->getExtensions().fenceSync)
{
supportedExtensions.eglSync = false;
}
supportedExtensions.memorySize = true;
+ // GL_CHROMIUM_lose_context is implemented in the frontend
+ supportedExtensions.loseContextCHROMIUM = true;
+
return supportedExtensions;
}
@@ -3679,7 +3719,7 @@ void Context::copyTexImage2D(TextureTarget target,
Rectangle sourceArea(x, y, width, height);
Framebuffer *framebuffer = mState.getReadFramebuffer();
- Texture *texture = getTargetTexture(TextureTargetToType(target));
+ Texture *texture = getTextureByTarget(target);
ANGLE_CONTEXT_TRY(
texture->copyImage(this, target, level, sourceArea, internalformat, framebuffer));
}
@@ -3704,13 +3744,14 @@ void Context::copyTexSubImage2D(TextureTarget target,
Offset destOffset(xoffset, yoffset, 0);
Rectangle sourceArea(x, y, width, height);
+ ImageIndex index = ImageIndex::MakeFromTarget(target, level);
+
Framebuffer *framebuffer = mState.getReadFramebuffer();
- Texture *texture = getTargetTexture(TextureTargetToType(target));
- ANGLE_CONTEXT_TRY(
- texture->copySubImage(this, target, level, destOffset, sourceArea, framebuffer));
+ Texture *texture = getTextureByTarget(target);
+ ANGLE_CONTEXT_TRY(texture->copySubImage(this, index, destOffset, sourceArea, framebuffer));
}
-void Context::copyTexSubImage3D(TextureType target,
+void Context::copyTexSubImage3D(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -3731,10 +3772,11 @@ void Context::copyTexSubImage3D(TextureType target,
Offset destOffset(xoffset, yoffset, zoffset);
Rectangle sourceArea(x, y, width, height);
+ ImageIndex index = ImageIndex::MakeFromType(TextureTargetToType(target), level, zoffset);
+
Framebuffer *framebuffer = mState.getReadFramebuffer();
- Texture *texture = getTargetTexture(target);
- ANGLE_CONTEXT_TRY(texture->copySubImage(this, NonCubeTextureTypeToTarget(target), level,
- destOffset, sourceArea, framebuffer));
+ Texture *texture = getTextureByTarget(target);
+ ANGLE_CONTEXT_TRY(texture->copySubImage(this, index, destOffset, sourceArea, framebuffer));
}
void Context::framebufferTexture2D(GLenum target,
@@ -3806,12 +3848,12 @@ void Context::framebufferTextureLayer(GLenum target,
mState.setObjectDirty(target);
}
-void Context::framebufferTextureMultiviewLayered(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
+void Context::framebufferTextureMultiview(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews)
{
Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
ASSERT(framebuffer);
@@ -3831,34 +3873,8 @@ void Context::framebufferTextureMultiviewLayered(GLenum target,
ASSERT(level == 0);
index = ImageIndex::Make2DMultisampleArrayRange(baseViewIndex, numViews);
}
- framebuffer->setAttachmentMultiviewLayered(this, GL_TEXTURE, attachment, index, textureObj,
- numViews, baseViewIndex);
- }
- else
- {
- framebuffer->resetAttachment(this, attachment);
- }
-
- mState.setObjectDirty(target);
-}
-
-void Context::framebufferTextureMultiviewSideBySide(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
- ASSERT(framebuffer);
-
- if (texture != 0)
- {
- Texture *textureObj = getTexture(texture);
-
- ImageIndex index = ImageIndex::Make2D(level);
- framebuffer->setAttachmentMultiviewSideBySide(this, GL_TEXTURE, attachment, index,
- textureObj, numViews, viewportOffsets);
+ framebuffer->setAttachmentMultiview(this, GL_TEXTURE, attachment, index, textureObj,
+ numViews, baseViewIndex);
}
else
{
@@ -3972,7 +3988,7 @@ void Context::texImage2D(TextureTarget target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Extents size(width, height, 1);
- Texture *texture = getTargetTexture(TextureTargetToType(target));
+ Texture *texture = getTextureByTarget(target);
ANGLE_CONTEXT_TRY(texture->setImage(this, mState.getUnpackState(), target, level,
internalformat, size, format, type,
static_cast<const uint8_t *>(pixels)));
@@ -3992,7 +4008,7 @@ void Context::texImage2DRobust(TextureTarget target,
texImage2D(target, level, internalformat, width, height, border, format, type, pixels);
}
-void Context::texImage3D(TextureType target,
+void Context::texImage3D(TextureTarget target,
GLint level,
GLint internalformat,
GLsizei width,
@@ -4006,13 +4022,13 @@ void Context::texImage3D(TextureType target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Extents size(width, height, depth);
- Texture *texture = getTargetTexture(target);
- ANGLE_CONTEXT_TRY(texture->setImage(this, mState.getUnpackState(),
- NonCubeTextureTypeToTarget(target), level, internalformat,
- size, format, type, static_cast<const uint8_t *>(pixels)));
+ Texture *texture = getTextureByTarget(target);
+ ANGLE_CONTEXT_TRY(texture->setImage(this, mState.getUnpackState(), target, level,
+ internalformat, size, format, type,
+ static_cast<const uint8_t *>(pixels)));
}
-void Context::texImage3DRobust(TextureType target,
+void Context::texImage3DRobust(TextureTarget target,
GLint level,
GLint internalformat,
GLsizei width,
@@ -4046,7 +4062,7 @@ void Context::texSubImage2D(TextureTarget target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Box area(xoffset, yoffset, 0, width, height, 1);
- Texture *texture = getTargetTexture(TextureTargetToType(target));
+ Texture *texture = getTextureByTarget(target);
gl::Buffer *unpackBuffer = mState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
@@ -4069,7 +4085,7 @@ void Context::texSubImage2DRobust(TextureTarget target,
texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
}
-void Context::texSubImage3D(TextureType target,
+void Context::texSubImage3D(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -4090,16 +4106,16 @@ void Context::texSubImage3D(TextureType target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Box area(xoffset, yoffset, zoffset, width, height, depth);
- Texture *texture = getTargetTexture(target);
+ Texture *texture = getTextureByTarget(target);
gl::Buffer *unpackBuffer = mState.getTargetBuffer(gl::BufferBinding::PixelUnpack);
- ANGLE_CONTEXT_TRY(texture->setSubImage(this, mState.getUnpackState(), unpackBuffer,
- NonCubeTextureTypeToTarget(target), level, area, format,
- type, static_cast<const uint8_t *>(pixels)));
+ ANGLE_CONTEXT_TRY(texture->setSubImage(this, mState.getUnpackState(), unpackBuffer, target,
+ level, area, format, type,
+ static_cast<const uint8_t *>(pixels)));
}
-void Context::texSubImage3DRobust(TextureType target,
+void Context::texSubImage3DRobust(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -4128,7 +4144,7 @@ void Context::compressedTexImage2D(TextureTarget target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Extents size(width, height, 1);
- Texture *texture = getTargetTexture(TextureTargetToType(target));
+ Texture *texture = getTextureByTarget(target);
ANGLE_CONTEXT_TRY(texture->setCompressedImage(this, mState.getUnpackState(), target, level,
internalformat, size, imageSize,
static_cast<const uint8_t *>(data)));
@@ -4147,7 +4163,7 @@ void Context::compressedTexImage2DRobust(TextureTarget target,
compressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
}
-void Context::compressedTexImage3D(TextureType target,
+void Context::compressedTexImage3D(TextureTarget target,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -4160,13 +4176,13 @@ void Context::compressedTexImage3D(TextureType target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Extents size(width, height, depth);
- Texture *texture = getTargetTexture(target);
- ANGLE_CONTEXT_TRY(texture->setCompressedImage(
- this, mState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, internalformat,
- size, imageSize, static_cast<const uint8_t *>(data)));
+ Texture *texture = getTextureByTarget(target);
+ ANGLE_CONTEXT_TRY(texture->setCompressedImage(this, mState.getUnpackState(), target, level,
+ internalformat, size, imageSize,
+ static_cast<const uint8_t *>(data)));
}
-void Context::compressedTexImage3DRobust(TextureType target,
+void Context::compressedTexImage3DRobust(TextureTarget target,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -4194,7 +4210,7 @@ void Context::compressedTexSubImage2D(TextureTarget target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Box area(xoffset, yoffset, 0, width, height, 1);
- Texture *texture = getTargetTexture(TextureTargetToType(target));
+ Texture *texture = getTextureByTarget(target);
ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(this, mState.getUnpackState(), target, level,
area, format, imageSize,
static_cast<const uint8_t *>(data)));
@@ -4215,7 +4231,7 @@ void Context::compressedTexSubImage2DRobust(TextureTarget target,
data);
}
-void Context::compressedTexSubImage3D(TextureType target,
+void Context::compressedTexSubImage3D(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -4236,13 +4252,13 @@ void Context::compressedTexSubImage3D(TextureType target,
ANGLE_CONTEXT_TRY(syncStateForTexImage());
Box area(xoffset, yoffset, zoffset, width, height, depth);
- Texture *texture = getTargetTexture(target);
- ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(
- this, mState.getUnpackState(), NonCubeTextureTypeToTarget(target), level, area, format,
- imageSize, static_cast<const uint8_t *>(data)));
+ Texture *texture = getTextureByTarget(target);
+ ANGLE_CONTEXT_TRY(texture->setCompressedSubImage(this, mState.getUnpackState(), target, level,
+ area, format, imageSize,
+ static_cast<const uint8_t *>(data)));
}
-void Context::compressedTexSubImage3DRobust(TextureType target,
+void Context::compressedTexSubImage3DRobust(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -4261,7 +4277,7 @@ void Context::compressedTexSubImage3DRobust(TextureType target,
void Context::generateMipmap(TextureType target)
{
- Texture *texture = getTargetTexture(target);
+ Texture *texture = getTextureByType(target);
ANGLE_CONTEXT_TRY(texture->generateMipmap(this));
}
@@ -5134,7 +5150,7 @@ void Context::texStorage2DMultisample(TextureType target,
GLboolean fixedsamplelocations)
{
Extents size(width, height, 1);
- Texture *texture = getTargetTexture(target);
+ Texture *texture = getTextureByType(target);
ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
ConvertToBool(fixedsamplelocations)));
}
@@ -5148,7 +5164,7 @@ void Context::texStorage3DMultisample(TextureType target,
GLboolean fixedsamplelocations)
{
Extents size(width, height, depth);
- Texture *texture = getTargetTexture(target);
+ Texture *texture = getTextureByType(target);
ANGLE_CONTEXT_TRY(texture->setStorageMultisample(this, target, samples, internalformat, size,
ConvertToBool(fixedsamplelocations)));
}
@@ -5268,7 +5284,7 @@ void Context::texStorage2D(TextureType target,
GLsizei height)
{
Extents size(width, height, 1);
- Texture *texture = getTargetTexture(target);
+ Texture *texture = getTextureByType(target);
ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
}
@@ -5280,7 +5296,7 @@ void Context::texStorage3D(TextureType target,
GLsizei depth)
{
Extents size(width, height, depth);
- Texture *texture = getTargetTexture(target);
+ Texture *texture = getTextureByType(target);
ANGLE_CONTEXT_TRY(texture->setStorage(this, target, levels, internalFormat, size));
}
@@ -5671,6 +5687,11 @@ void Context::getProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params)
UNIMPLEMENTED();
}
+MemoryObject *Context::getMemoryObject(GLuint handle) const
+{
+ return mState.mMemoryObjectManager->getMemoryObject(handle);
+}
+
void Context::getProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog)
{
Program *programObject = getProgramResolveLink(program);
@@ -7086,9 +7107,161 @@ GLboolean Context::testFenceNV(GLuint fence)
return result;
}
+void Context::deleteMemoryObjects(GLsizei n, const GLuint *memoryObjects)
+{
+ for (int i = 0; i < n; i++)
+ {
+ deleteMemoryObject(memoryObjects[i]);
+ }
+}
+
+GLboolean Context::isMemoryObject(GLuint memoryObject)
+{
+ if (memoryObject == 0)
+ {
+ return GL_FALSE;
+ }
+
+ return (getMemoryObject(memoryObject) ? GL_TRUE : GL_FALSE);
+}
+
+void Context::createMemoryObjects(GLsizei n, GLuint *memoryObjects)
+{
+ for (int i = 0; i < n; i++)
+ {
+ memoryObjects[i] = createMemoryObject();
+ }
+}
+
+void Context::memoryObjectParameteriv(GLuint memoryObject, GLenum pname, const GLint *params)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::getMemoryObjectParameteriv(GLuint memoryObject, GLenum pname, GLint *params)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::texStorageMem2D(TextureType target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset)
+{
+ MemoryObject *memoryObject = getMemoryObject(memory);
+ ASSERT(memoryObject);
+ Extents size(width, height, 1);
+ Texture *texture = getTextureByType(target);
+ ANGLE_CONTEXT_TRY(texture->setStorageExternalMemory(this, target, levels, internalFormat, size,
+ memoryObject, offset));
+}
+
+void Context::texStorageMem2DMultisample(TextureType target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::texStorageMem3D(TextureType target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::texStorageMem3DMultisample(TextureType target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::bufferStorageMem(TextureType target, GLsizeiptr size, GLuint memory, GLuint64 offset)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::importMemoryFd(GLuint memory, GLuint64 size, HandleType handleType, GLint fd)
+{
+ MemoryObject *memoryObject = getMemoryObject(memory);
+ ASSERT(memoryObject != nullptr);
+ ANGLE_CONTEXT_TRY(memoryObject->importFd(this, size, handleType, fd));
+}
+
+void Context::genSemaphores(GLsizei n, GLuint *semaphores)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::deleteSemaphores(GLsizei n, const GLuint *semaphores)
+{
+ UNIMPLEMENTED();
+}
+
+GLboolean Context::isSemaphore(GLuint semaphore)
+{
+ UNIMPLEMENTED();
+ return GL_FALSE;
+}
+
+void Context::semaphoreParameterui64v(GLuint semaphore, GLenum pname, const GLuint64 *params)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::getSemaphoreParameterui64v(GLuint semaphore, GLenum pname, GLuint64 *params)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::waitSemaphore(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::signalSemaphore(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts)
+{
+ UNIMPLEMENTED();
+}
+
+void Context::importSemaphoreFd(GLuint semaphore, HandleType handleType, GLint fd)
+{
+ UNIMPLEMENTED();
+}
+
void Context::eGLImageTargetTexture2D(TextureType target, GLeglImageOES image)
{
- Texture *texture = getTargetTexture(target);
+ Texture *texture = getTextureByType(target);
egl::Image *imageObject = static_cast<egl::Image *>(image);
ANGLE_CONTEXT_TRY(texture->setEGLImageTarget(this, target, imageObject));
}
@@ -7542,7 +7715,7 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
return true;
}
- if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
+ if (getExtensions().multiview2 && pname == GL_MAX_VIEWS_OVR)
{
*type = GL_INT;
*numParams = 1;
@@ -7954,6 +8127,7 @@ void Context::maxShaderCompilerThreads(GLuint count)
mThreadPool = angle::WorkerThreadPool::Create(count > 0);
}
mThreadPool->setMaxThreads(count);
+ mImplementation->setMaxShaderCompilerThreads(count);
}
bool Context::isGLES1() const
@@ -8014,6 +8188,7 @@ void Context::onSubjectStateChange(const Context *context,
{
ASSERT(index < kSamplerMaxSubjectIndex);
mState.setSamplerDirty(index - kSampler0SubjectIndex);
+ mState.onActiveTextureStateChange(this, index - kSampler0SubjectIndex);
}
break;
}
@@ -8054,7 +8229,7 @@ void ErrorSet::handleError(GLenum errorCode,
{
if (errorCode == GL_OUT_OF_MEMORY && mContext->getWorkarounds().loseContextOnOutOfMemory)
{
- mContext->markContextLost();
+ mContext->markContextLost(GraphicsResetStatus::UnknownContextReset);
}
std::stringstream errorStream;
diff --git a/chromium/third_party/angle/src/libANGLE/Context.h b/chromium/third_party/angle/src/libANGLE/Context.h
index 86cd54849ec..3bb2694a732 100644
--- a/chromium/third_party/angle/src/libANGLE/Context.h
+++ b/chromium/third_party/angle/src/libANGLE/Context.h
@@ -53,6 +53,7 @@ class FenceNV;
class Framebuffer;
class GLES1Renderer;
class MemoryProgramCache;
+class MemoryObject;
class Program;
class ProgramPipeline;
class Query;
@@ -312,6 +313,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLuint genPaths(GLsizei range);
GLuint createProgramPipeline();
GLuint createShaderProgramv(ShaderType type, GLsizei count, const GLchar *const *strings);
+ GLuint createMemoryObject();
void deleteBuffer(GLuint buffer);
void deleteShader(GLuint shader);
@@ -320,6 +322,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
void deleteRenderbuffer(GLuint renderbuffer);
void deletePaths(GLuint first, GLsizei range);
void deleteProgramPipeline(GLuint pipeline);
+ void deleteMemoryObject(GLuint memoryObject);
// CHROMIUM_path_rendering
bool isPath(GLuint path) const;
@@ -336,6 +339,9 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
void getPathParameteriv(GLuint path, GLenum pname, GLint *value);
void pathStencilFunc(GLenum func, GLint ref, GLuint mask);
+ // GL_CHROMIUM_lose_context
+ void loseContext(GraphicsResetStatus current, GraphicsResetStatus other);
+
// Framebuffers are owned by the Context, so these methods do not pass through
GLuint createFramebuffer();
void deleteFramebuffer(GLuint framebuffer);
@@ -349,6 +355,71 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
void setFenceNV(GLuint fence, GLenum condition);
GLboolean testFenceNV(GLuint fence);
+ // GL_EXT_memory_object
+ void deleteMemoryObjects(GLsizei n, const GLuint *memoryObjects);
+ GLboolean isMemoryObject(GLuint memoryObject);
+ void createMemoryObjects(GLsizei n, GLuint *memoryObjects);
+ void memoryObjectParameteriv(GLuint memoryObject, GLenum pname, const GLint *params);
+ void getMemoryObjectParameteriv(GLuint memoryObject, GLenum pname, GLint *params);
+ void texStorageMem2D(TextureType target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset);
+ void texStorageMem2DMultisample(TextureType target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
+ void texStorageMem3D(TextureType target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset);
+ void texStorageMem3DMultisample(TextureType target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
+ void bufferStorageMem(TextureType target, GLsizeiptr size, GLuint memory, GLuint64 offset);
+
+ // GL_EXT_memory_object_fd
+ void importMemoryFd(GLuint memory, GLuint64 size, HandleType handleType, GLint fd);
+
+ // GL_EXT_semaphore
+ void genSemaphores(GLsizei n, GLuint *semaphores);
+ void deleteSemaphores(GLsizei n, const GLuint *semaphores);
+ GLboolean isSemaphore(GLuint semaphore);
+ void semaphoreParameterui64v(GLuint semaphore, GLenum pname, const GLuint64 *params);
+ void getSemaphoreParameterui64v(GLuint semaphore, GLenum pname, GLuint64 *params);
+ void waitSemaphore(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts);
+ void signalSemaphore(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts);
+
+ // GL_EXT_semaphore_fd
+ void importSemaphoreFd(GLuint semaphore, HandleType handleType, GLint fd);
+
// GLES1 emulation: Interface to entry points
ANGLE_GLES1_CONTEXT_API
@@ -590,6 +661,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
Query *getQuery(GLuint handle) const;
TransformFeedback *getTransformFeedback(GLuint handle) const;
ProgramPipeline *getProgramPipeline(GLuint handle) const;
+ MemoryObject *getMemoryObject(GLuint handle) const;
void objectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar *label);
void objectPtrLabel(const void *ptr, GLsizei length, const GLchar *label);
@@ -600,7 +672,8 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLchar *label) const;
void getObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label) const;
- Texture *getTargetTexture(TextureType type) const;
+ Texture *getTextureByType(TextureType type) const;
+ Texture *getTextureByTarget(TextureTarget target) const;
Texture *getSamplerTexture(unsigned int sampler, TextureType type) const;
Compiler *getCompiler() const;
@@ -643,6 +716,8 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLsizei bufSize,
GLsizei *length,
GLint64 *data);
+ void getUnsignedBytev(GLenum pname, GLubyte *data);
+ void getUnsignedBytei_v(GLenum target, GLuint index, GLubyte *data);
void activeShaderProgram(GLuint pipeline, GLuint program);
void activeTexture(GLenum texture);
@@ -850,7 +925,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLsizei width,
GLsizei height);
- void copyTexSubImage3D(TextureType target,
+ void copyTexSubImage3D(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -876,18 +951,13 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLuint texture,
GLint level,
GLint layer);
- void framebufferTextureMultiviewLayered(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews);
- void framebufferTextureMultiviewSideBySide(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets);
+
+ void framebufferTextureMultiview(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews);
void drawBuffers(GLsizei n, const GLenum *bufs);
void readBuffer(GLenum mode);
@@ -921,7 +991,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLenum type,
GLsizei bufSize,
const void *pixels);
- void texImage3D(TextureType target,
+ void texImage3D(TextureTarget target,
GLint level,
GLint internalformat,
GLsizei width,
@@ -931,7 +1001,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLenum format,
GLenum type,
const void *pixels);
- void texImage3DRobust(TextureType target,
+ void texImage3DRobust(TextureTarget target,
GLint level,
GLint internalformat,
GLsizei width,
@@ -961,7 +1031,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLenum type,
GLsizei bufSize,
const void *pixels);
- void texSubImage3D(TextureType target,
+ void texSubImage3D(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -972,7 +1042,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLenum format,
GLenum type,
const void *pixels);
- void texSubImage3DRobust(TextureType target,
+ void texSubImage3DRobust(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -1001,7 +1071,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLsizei imageSize,
GLsizei dataSize,
const GLvoid *data);
- void compressedTexImage3D(TextureType target,
+ void compressedTexImage3D(TextureTarget target,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -1010,7 +1080,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLint border,
GLsizei imageSize,
const void *data);
- void compressedTexImage3DRobust(TextureType target,
+ void compressedTexImage3DRobust(TextureTarget target,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -1039,7 +1109,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLsizei imageSize,
GLsizei dataSize,
const GLvoid *data);
- void compressedTexSubImage3D(TextureType target,
+ void compressedTexSubImage3D(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -1050,7 +1120,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
GLenum format,
GLsizei imageSize,
const void *data);
- void compressedTexSubImage3DRobust(TextureType target,
+ void compressedTexSubImage3DRobust(TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -1691,7 +1761,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
void validationError(GLenum errorCode, const char *message);
GLenum getError();
- void markContextLost();
+ void markContextLost(GraphicsResetStatus status);
bool isContextLost() const { return mContextLost; }
@@ -1725,7 +1795,7 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
MemoryProgramCache *getMemoryProgramCache() const { return mMemoryProgramCache; }
bool hasBeenCurrent() const { return mHasBeenCurrent; }
- egl::Display *getCurrentDisplay() const { return mCurrentDisplay; }
+ egl::Display *getDisplay() const { return mDisplay; }
egl::Surface *getCurrentDrawSurface() const { return mCurrentSurface; }
egl::Surface *getCurrentReadSurface() const { return mCurrentSurface; }
@@ -1910,14 +1980,14 @@ class Context final : public egl::LabeledObject, angle::NonCopyable, public angl
// Current/lost context flags
bool mHasBeenCurrent;
bool mContextLost;
- GLenum mResetStatus;
+ GraphicsResetStatus mResetStatus;
bool mContextLostForced;
GLenum mResetStrategy;
const bool mRobustAccess;
const bool mSurfacelessSupported;
const bool mExplicitContextAvailable;
egl::Surface *mCurrentSurface;
- egl::Display *mCurrentDisplay;
+ egl::Display *mDisplay;
const bool mWebGLContext;
bool mBufferAccessValidationEnabled;
const bool mExtensionsEnabled;
diff --git a/chromium/third_party/angle/src/libANGLE/Display.cpp b/chromium/third_party/angle/src/libANGLE/Display.cpp
index 19bf5455a24..1e6667e0559 100644
--- a/chromium/third_party/angle/src/libANGLE/Display.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Display.cpp
@@ -494,6 +494,7 @@ void Display::setAttributes(rx::DisplayImpl *impl, const AttributeMap &attribMap
Error Display::initialize()
{
+ ASSERT(mImplementation != nullptr);
mImplementation->setBlobCache(&mBlobCache);
// TODO(jmadill): Store Platform in Display and init here.
@@ -516,8 +517,6 @@ Error Display::initialize()
SCOPED_ANGLE_HISTOGRAM_TIMER("GPU.ANGLE.DisplayInitializeMS");
TRACE_EVENT0("gpu.angle", "egl::Display::initialize");
- ASSERT(mImplementation != nullptr);
-
if (isInitialized())
{
return NoError();
@@ -654,6 +653,33 @@ std::vector<const Config *> Display::getConfigs(const egl::AttributeMap &attribs
return mConfigSet.filter(attribs);
}
+std::vector<const Config *> Display::chooseConfig(const egl::AttributeMap &attribs) const
+{
+ egl::AttributeMap attribsWithDefaults = AttributeMap();
+
+ // Insert default values for attributes that have either an Exact or Mask selection criteria,
+ // and a default value that matters (e.g. isn't EGL_DONT_CARE):
+ attribsWithDefaults.insert(EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER);
+ attribsWithDefaults.insert(EGL_LEVEL, 0);
+ attribsWithDefaults.insert(EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT);
+ attribsWithDefaults.insert(EGL_SURFACE_TYPE, EGL_WINDOW_BIT);
+ attribsWithDefaults.insert(EGL_TRANSPARENT_TYPE, EGL_NONE);
+ if (getExtensions().pixelFormatFloat)
+ {
+ attribsWithDefaults.insert(EGL_COLOR_COMPONENT_TYPE_EXT,
+ EGL_COLOR_COMPONENT_TYPE_FIXED_EXT);
+ }
+
+ // Add the caller-specified values (Note: the poorly-named insert() method will replace any
+ // of the default values from above):
+ for (auto attribIter = attribs.begin(); attribIter != attribs.end(); attribIter++)
+ {
+ attribsWithDefaults.insert(attribIter->first, attribIter->second);
+ }
+
+ return mConfigSet.filter(attribsWithDefaults);
+}
+
Error Display::createWindowSurface(const Config *configuration,
EGLNativeWindowType window,
const AttributeMap &attribs,
@@ -869,7 +895,10 @@ Error Display::createContext(const Config *configuration,
return NoError();
}
-Error Display::createSync(EGLenum type, const AttributeMap &attribs, Sync **outSync)
+Error Display::createSync(const gl::Context *currentContext,
+ EGLenum type,
+ const AttributeMap &attribs,
+ Sync **outSync)
{
ASSERT(isInitialized());
@@ -881,7 +910,7 @@ Error Display::createSync(EGLenum type, const AttributeMap &attribs, Sync **outS
angle::UniqueObjectPointer<egl::Sync, Display> syncPtr(new Sync(mImplementation, type, attribs),
this);
- ANGLE_TRY(syncPtr->initialize(this));
+ ANGLE_TRY(syncPtr->initialize(this, currentContext));
Sync *sync = syncPtr.release();
@@ -1038,7 +1067,7 @@ void Display::notifyDeviceLost()
for (ContextSet::iterator context = mContextSet.begin(); context != mContextSet.end();
context++)
{
- (*context)->markContextLost();
+ (*context)->markContextLost(gl::GraphicsResetStatus::UnknownContextReset);
}
mDeviceLost = true;
@@ -1400,14 +1429,4 @@ EGLint Display::programCacheResize(EGLint limit, EGLenum mode)
}
}
-Error Display::clientWaitSync(Sync *sync, EGLint flags, EGLTime timeout, EGLint *outResult)
-{
- return sync->clientWait(this, flags, timeout, outResult);
-}
-
-Error Display::waitSync(Sync *sync, EGLint flags)
-{
- return sync->serverWait(this, flags);
-}
-
} // namespace egl
diff --git a/chromium/third_party/angle/src/libANGLE/Display.h b/chromium/third_party/angle/src/libANGLE/Display.h
index 7c4851e3e76..e5866ff99c8 100644
--- a/chromium/third_party/angle/src/libANGLE/Display.h
+++ b/chromium/third_party/angle/src/libANGLE/Display.h
@@ -77,6 +77,7 @@ class Display final : public LabeledObject, angle::NonCopyable
static const std::string &GetClientExtensionString();
std::vector<const Config *> getConfigs(const AttributeMap &attribs) const;
+ std::vector<const Config *> chooseConfig(const AttributeMap &attribs) const;
Error createWindowSurface(const Config *configuration,
EGLNativeWindowType window,
@@ -108,7 +109,10 @@ class Display final : public LabeledObject, angle::NonCopyable
const AttributeMap &attribs,
gl::Context **outContext);
- Error createSync(EGLenum type, const AttributeMap &attribs, Sync **outSync);
+ Error createSync(const gl::Context *currentContext,
+ EGLenum type,
+ const AttributeMap &attribs,
+ Sync **outSync);
Error makeCurrent(Surface *drawSurface, Surface *readSurface, gl::Context *context);
@@ -169,9 +173,6 @@ class Display final : public LabeledObject, angle::NonCopyable
EGLint binarysize);
EGLint programCacheResize(EGLint limit, EGLenum mode);
- Error clientWaitSync(Sync *sync, EGLint flags, EGLTime timeout, EGLint *outResult);
- Error waitSync(Sync *sync, EGLint flags);
-
const AttributeMap &getAttributeMap() const { return mAttributeMap; }
EGLNativeDisplayType getNativeDisplayId() const { return mDisplayId; }
diff --git a/chromium/third_party/angle/src/libANGLE/EGLSync.cpp b/chromium/third_party/angle/src/libANGLE/EGLSync.cpp
index 153b2b87faf..f43401386ba 100644
--- a/chromium/third_party/angle/src/libANGLE/EGLSync.cpp
+++ b/chromium/third_party/angle/src/libANGLE/EGLSync.cpp
@@ -30,19 +30,23 @@ void Sync::onDestroy(const Display *display)
Sync::~Sync() {}
-Error Sync::initialize(const Display *display)
+Error Sync::initialize(const Display *display, const gl::Context *context)
{
- return mFence->initialize(display, mType);
+ return mFence->initialize(display, context, mType);
}
-Error Sync::clientWait(const Display *display, EGLint flags, EGLTime timeout, EGLint *outResult)
+Error Sync::clientWait(const Display *display,
+ const gl::Context *context,
+ EGLint flags,
+ EGLTime timeout,
+ EGLint *outResult)
{
- return mFence->clientWait(display, flags, timeout, outResult);
+ return mFence->clientWait(display, context, flags, timeout, outResult);
}
-Error Sync::serverWait(const Display *display, EGLint flags)
+Error Sync::serverWait(const Display *display, const gl::Context *context, EGLint flags)
{
- return mFence->serverWait(display, flags);
+ return mFence->serverWait(display, context, flags);
}
Error Sync::getStatus(const Display *display, EGLint *outStatus) const
diff --git a/chromium/third_party/angle/src/libANGLE/EGLSync.h b/chromium/third_party/angle/src/libANGLE/EGLSync.h
index eca0ed83a11..0a40ebe6e7f 100644
--- a/chromium/third_party/angle/src/libANGLE/EGLSync.h
+++ b/chromium/third_party/angle/src/libANGLE/EGLSync.h
@@ -22,6 +22,11 @@ class EGLImplFactory;
class EGLSyncImpl;
} // namespace rx
+namespace gl
+{
+class Context;
+} // namespace gl
+
namespace egl
{
class Sync final : public angle::RefCountObject<Display, angle::Result>
@@ -32,9 +37,13 @@ class Sync final : public angle::RefCountObject<Display, angle::Result>
void onDestroy(const Display *display) override;
- Error initialize(const Display *display);
- Error clientWait(const Display *display, EGLint flags, EGLTime timeout, EGLint *outResult);
- Error serverWait(const Display *display, EGLint flags);
+ Error initialize(const Display *display, const gl::Context *context);
+ Error clientWait(const Display *display,
+ const gl::Context *context,
+ EGLint flags,
+ EGLTime timeout,
+ EGLint *outResult);
+ Error serverWait(const Display *display, const gl::Context *context, EGLint flags);
Error getStatus(const Display *display, EGLint *outStatus) const;
EGLenum getType() const { return mType; }
diff --git a/chromium/third_party/angle/src/libANGLE/ErrorStrings.h b/chromium/third_party/angle/src/libANGLE/ErrorStrings.h
index 473fe011615..74beeb63727 100644
--- a/chromium/third_party/angle/src/libANGLE/ErrorStrings.h
+++ b/chromium/third_party/angle/src/libANGLE/ErrorStrings.h
@@ -216,6 +216,7 @@ MSG kInvalidFramebufferLayer = "Framebuffer layer cannot be less than 0 or great
MSG kInvalidFramebufferName = "name is not a valid framebuffer.";
MSG kInvalidFramebufferTarget = "Invalid framebuffer target.";
MSG kInvalidFramebufferTextureLevel = "Mipmap level must be 0 when attaching a texture.";
+MSG kInvalidHandleType = "Invalid handle type.";
MSG kInvalidImageAccess = "access is not one of the supported tokens.";
MSG kInvalidImageFormat = "format is not one of supported image unit formats.";
MSG kInvalidIndentifier = "Invalid identifier.";
@@ -282,6 +283,7 @@ MSG kInvalidRenderbufferName = "name is not a valid renderbuffer.";
MSG kInvalidRenderbufferTarget = "Invalid renderbuffer target.";
MSG kInvalidRenderbufferTextureParameter = "Invalid parameter name for renderbuffer attachment.";
MSG kInvalidRenderbufferWidthHeight = "Renderbuffer width and height cannot be negative and cannot exceed maximum texture size.";
+MSG kInvalidResetStatus = "Reset status is not valid";
MSG kInvalidSampleMaskNumber = "MaskNumber cannot be greater than or equal to the value of MAX_SAMPLE_MASK_WORDS.";
MSG kInvalidSampler = "Sampler is not valid";
MSG kInvalidSamplerName = "name is not a valid sampler.";
@@ -438,6 +440,7 @@ MSG kStrideExceedsWebGLLimit = "Stride is over the maximum stride allowed by Web
MSG kStrideMustBeMultipleOfType = "Stride must be a multiple of the passed in datatype.";
MSG kSyncMissing = "Sync object does not exist.";
MSG kTargetMustBeTexture2DMultisampleArrayOES = "Target must be TEXTURE_2D_MULTISAMPLE_ARRAY_OES.";
+MSG kTextureFormatMismatch = "Passed in texture target and format must match the one originally used to define the texture.";
MSG kTextureIsImmutable = "Texture is immutable.";
MSG kTextureIsNotImmutable = "Texture is not immutable.";
MSG kTextureNotBound = "A texture must be bound.";
@@ -447,6 +450,7 @@ MSG kTextureSizeTooSmall = "Texture dimensions must all be greater than zero.";
MSG kTextureTargetMismatch = "Textarget must match the texture target type.";
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.";
MSG kTextureWidthOrHeightOutOfRange = "Width and height must be less than or equal to GL_MAX_TEXTURE_SIZE.";
MSG kTransfomFeedbackAlreadyActive = "Transform feedback is already active.";
MSG kTransformFeedbackActiveDelete = "Attempt to delete an active transform feedback.";
@@ -462,7 +466,6 @@ MSG kTransformFeedbackProgramBinary = "Cannot change program binary while progra
MSG kTransformFeedbackTargetActive = "Target is TRANSFORM_FEEDBACK_BUFFER and transform feedback is currently active.";
MSG kTransformFeedbackUseProgram = "Cannot change active program while transform feedback is unpaused.";
MSG kTransformFeedbackVaryingIndexOutOfRange = "Index must be less than the transform feedback varying count in the program.";
-MSG kTypeMismatch = "Passed in texture target and format must match the one originally used to define the texture.";
MSG kTypeNotUnsignedShortByte = "Only UNSIGNED_SHORT and UNSIGNED_BYTE types are supported.";
MSG kUniformBufferBoundForTransformFeedback = "It is undefined behavior to use an uniform buffer that is bound for transform feedback.";
MSG kUniformBufferOffsetAlignment = "Offset must be multiple of value of UNIFORM_BUFFER_OFFSET_ALIGNMENT.";
diff --git a/chromium/third_party/angle/src/libANGLE/Framebuffer.cpp b/chromium/third_party/angle/src/libANGLE/Framebuffer.cpp
index 11e1d900502..cfc8cd02d89 100644
--- a/chromium/third_party/angle/src/libANGLE/Framebuffer.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Framebuffer.cpp
@@ -49,12 +49,7 @@ bool CheckMultiviewStateMatchesForCompleteness(const FramebufferAttachment *firs
{
return false;
}
- if (firstAttachment->getMultiviewLayout() != secondAttachment->getMultiviewLayout())
- {
- return false;
- }
- if (firstAttachment->getMultiviewViewportOffsets() !=
- secondAttachment->getMultiviewViewportOffsets())
+ if (firstAttachment->isMultiview() != secondAttachment->isMultiview())
{
return false;
}
@@ -585,24 +580,14 @@ bool FramebufferState::hasStencil() const
return (mStencilAttachment.isAttached() && mStencilAttachment.getStencilSize() > 0);
}
-const std::vector<Offset> *FramebufferState::getViewportOffsets() const
-{
- const FramebufferAttachment *attachment = getFirstNonNullAttachment();
- if (attachment == nullptr)
- {
- return nullptr;
- }
- return &attachment->getMultiviewViewportOffsets();
-}
-
-GLenum FramebufferState::getMultiviewLayout() const
+bool FramebufferState::isMultiview() const
{
const FramebufferAttachment *attachment = getFirstNonNullAttachment();
if (attachment == nullptr)
{
- return GL_NONE;
+ return false;
}
- return attachment->getMultiviewLayout();
+ return attachment->isMultiview();
}
int FramebufferState::getBaseViewIndex() const
@@ -652,26 +637,20 @@ Framebuffer::Framebuffer(const Context *context, egl::Surface *surface)
setAttachmentImpl(context, GL_FRAMEBUFFER_DEFAULT, GL_BACK, ImageIndex(), surface,
FramebufferAttachment::kDefaultNumViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
+ FramebufferAttachment::kDefaultBaseViewIndex, false);
if (surface->getConfig()->depthSize > 0)
{
setAttachmentImpl(context, GL_FRAMEBUFFER_DEFAULT, GL_DEPTH, ImageIndex(), surface,
FramebufferAttachment::kDefaultNumViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
+ FramebufferAttachment::kDefaultBaseViewIndex, false);
}
if (surface->getConfig()->stencilSize > 0)
{
setAttachmentImpl(context, GL_FRAMEBUFFER_DEFAULT, GL_STENCIL, ImageIndex(), surface,
FramebufferAttachment::kDefaultNumViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
+ FramebufferAttachment::kDefaultBaseViewIndex, false);
}
SetComponentTypeMask(getDrawbufferWriteType(0), 0, &mState.mDrawBufferTypeMask);
}
@@ -1060,7 +1039,7 @@ GLenum Framebuffer::checkStatusWithGLFrontEnd(const Context *context)
if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment, &colorAttachment))
{
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
+ return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR;
}
hasRenderbuffer = hasRenderbuffer || (colorAttachment.type() == GL_RENDERBUFFER);
@@ -1120,7 +1099,7 @@ GLenum Framebuffer::checkStatusWithGLFrontEnd(const Context *context)
if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment, &depthAttachment))
{
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
+ return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR;
}
hasRenderbuffer = hasRenderbuffer || (depthAttachment.type() == GL_RENDERBUFFER);
@@ -1165,7 +1144,7 @@ GLenum Framebuffer::checkStatusWithGLFrontEnd(const Context *context)
if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment, &stencilAttachment))
{
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
+ return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR;
}
hasRenderbuffer = hasRenderbuffer || (stencilAttachment.type() == GL_RENDERBUFFER);
@@ -1214,7 +1193,7 @@ GLenum Framebuffer::checkStatusWithGLFrontEnd(const Context *context)
if (!CheckMultiviewStateMatchesForCompleteness(firstAttachment,
&mState.mWebGLDepthStencilAttachment))
{
- return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_ANGLE;
+ return GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR;
}
}
else if (mState.mStencilAttachment.isAttached() &&
@@ -1349,7 +1328,31 @@ angle::Result Framebuffer::clear(const Context *context, GLbitfield mask)
return angle::Result::Continue;
}
- ANGLE_TRY(mImpl->clear(context, mask));
+ // Remove clear bits that are ineffective. An effective clear changes at least one fragment. If
+ // color/depth/stencil masks make the clear ineffective we skip it altogether.
+
+ // If all color channels are masked, don't attempt to clear color.
+ if (context->getState().getBlendState().allChannelsMasked())
+ {
+ mask &= ~GL_COLOR_BUFFER_BIT;
+ }
+
+ // If depth write is disabled, don't attempt to clear depth.
+ if (!context->getState().getDepthStencilState().depthMask)
+ {
+ mask &= ~GL_DEPTH_BUFFER_BIT;
+ }
+
+ // If all stencil bits are masked, don't attempt to clear stencil.
+ if (context->getState().getDepthStencilState().stencilWritemask == 0)
+ {
+ mask &= ~GL_STENCIL_BUFFER_BIT;
+ }
+
+ if (mask != 0)
+ {
+ ANGLE_TRY(mImpl->clear(context, mask));
+ }
return angle::Result::Continue;
}
@@ -1364,6 +1367,23 @@ angle::Result Framebuffer::clearBufferfv(const Context *context,
return angle::Result::Continue;
}
+ if (buffer == GL_DEPTH)
+ {
+ // If depth write is disabled, don't attempt to clear depth.
+ if (!context->getState().getDepthStencilState().depthMask)
+ {
+ return angle::Result::Continue;
+ }
+ }
+ else
+ {
+ // If all color channels are masked, don't attempt to clear color.
+ if (context->getState().getBlendState().allChannelsMasked())
+ {
+ return angle::Result::Continue;
+ }
+ }
+
ANGLE_TRY(mImpl->clearBufferfv(context, buffer, drawbuffer, values));
return angle::Result::Continue;
@@ -1379,6 +1399,12 @@ angle::Result Framebuffer::clearBufferuiv(const Context *context,
return angle::Result::Continue;
}
+ // If all color channels are masked, don't attempt to clear color.
+ if (context->getState().getBlendState().allChannelsMasked())
+ {
+ return angle::Result::Continue;
+ }
+
ANGLE_TRY(mImpl->clearBufferuiv(context, buffer, drawbuffer, values));
return angle::Result::Continue;
@@ -1394,6 +1420,23 @@ angle::Result Framebuffer::clearBufferiv(const Context *context,
return angle::Result::Continue;
}
+ if (buffer == GL_STENCIL)
+ {
+ // If all stencil bits are masked, don't attempt to clear stencil.
+ if (context->getState().getDepthStencilState().stencilWritemask == 0)
+ {
+ return angle::Result::Continue;
+ }
+ }
+ else
+ {
+ // If all color channels are masked, don't attempt to clear color.
+ if (context->getState().getBlendState().allChannelsMasked())
+ {
+ return angle::Result::Continue;
+ }
+ }
+
ANGLE_TRY(mImpl->clearBufferiv(context, buffer, drawbuffer, values));
return angle::Result::Continue;
@@ -1410,7 +1453,22 @@ angle::Result Framebuffer::clearBufferfi(const Context *context,
return angle::Result::Continue;
}
- ANGLE_TRY(mImpl->clearBufferfi(context, buffer, drawbuffer, depth, stencil));
+ bool clearDepth = context->getState().getDepthStencilState().depthMask;
+ bool clearStencil = context->getState().getDepthStencilState().stencilWritemask != 0;
+
+ if (clearDepth && clearStencil)
+ {
+ ASSERT(buffer == GL_DEPTH_STENCIL);
+ ANGLE_TRY(mImpl->clearBufferfi(context, GL_DEPTH_STENCIL, drawbuffer, depth, stencil));
+ }
+ else if (clearDepth && !clearStencil)
+ {
+ ANGLE_TRY(mImpl->clearBufferfv(context, GL_DEPTH, drawbuffer, &depth));
+ }
+ else if (!clearDepth && clearStencil)
+ {
+ ANGLE_TRY(mImpl->clearBufferiv(context, GL_STENCIL, drawbuffer, &stencil));
+ }
return angle::Result::Continue;
}
@@ -1535,9 +1593,7 @@ void Framebuffer::setAttachment(const Context *context,
{
setAttachment(context, type, binding, textureIndex, resource,
FramebufferAttachment::kDefaultNumViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- FramebufferAttachment::kDefaultMultiviewLayout,
- FramebufferAttachment::kDefaultViewportOffsets);
+ FramebufferAttachment::kDefaultBaseViewIndex, false);
}
void Framebuffer::setAttachment(const Context *context,
@@ -1547,14 +1603,13 @@ void Framebuffer::setAttachment(const Context *context,
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
+ bool isMultiview)
{
// Context may be null in unit tests.
if (!context || !context->isWebGL1())
{
setAttachmentImpl(context, type, binding, textureIndex, resource, numViews, baseViewIndex,
- multiviewLayout, viewportOffsets);
+ isMultiview);
return;
}
@@ -1564,61 +1619,42 @@ void Framebuffer::setAttachment(const Context *context,
case GL_DEPTH_STENCIL_ATTACHMENT:
mState.mWebGLDepthStencilAttachment.attach(context, type, binding, textureIndex,
resource, numViews, baseViewIndex,
- multiviewLayout, viewportOffsets);
+ isMultiview);
break;
case GL_DEPTH:
case GL_DEPTH_ATTACHMENT:
mState.mWebGLDepthAttachment.attach(context, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
+ numViews, baseViewIndex, isMultiview);
break;
case GL_STENCIL:
case GL_STENCIL_ATTACHMENT:
mState.mWebGLStencilAttachment.attach(context, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
+ numViews, baseViewIndex, isMultiview);
break;
default:
setAttachmentImpl(context, type, binding, textureIndex, resource, numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
+ baseViewIndex, isMultiview);
return;
}
- commitWebGL1DepthStencilIfConsistent(context, numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
-}
-
-void Framebuffer::setAttachmentMultiviewLayered(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLint baseViewIndex)
-{
- setAttachment(context, type, binding, textureIndex, resource, numViews, baseViewIndex,
- GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE,
- FramebufferAttachment::kDefaultViewportOffsets);
+ commitWebGL1DepthStencilIfConsistent(context, numViews, baseViewIndex, isMultiview);
}
-void Framebuffer::setAttachmentMultiviewSideBySide(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- const GLint *viewportOffsets)
+void Framebuffer::setAttachmentMultiview(const Context *context,
+ GLenum type,
+ GLenum binding,
+ const ImageIndex &textureIndex,
+ FramebufferAttachmentObject *resource,
+ GLsizei numViews,
+ GLint baseViewIndex)
{
- setAttachment(context, type, binding, textureIndex, resource, numViews,
- FramebufferAttachment::kDefaultBaseViewIndex,
- GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE, viewportOffsets);
+ setAttachment(context, type, binding, textureIndex, resource, numViews, baseViewIndex, true);
}
void Framebuffer::commitWebGL1DepthStencilIfConsistent(const Context *context,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
+ bool isMultiview)
{
int count = 0;
@@ -1656,37 +1692,35 @@ void Framebuffer::commitWebGL1DepthStencilIfConsistent(const Context *context,
const auto &depth = mState.mWebGLDepthAttachment;
setAttachmentImpl(context, depth.type(), GL_DEPTH_ATTACHMENT,
getImageIndexIfTextureAttachment(depth), depth.getResource(), numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
+ baseViewIndex, isMultiview);
setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex(), nullptr, numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
+ baseViewIndex, isMultiview);
}
else if (mState.mWebGLStencilAttachment.isAttached())
{
const auto &stencil = mState.mWebGLStencilAttachment;
setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex(), nullptr, numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
+ baseViewIndex, isMultiview);
setAttachmentImpl(context, stencil.type(), GL_STENCIL_ATTACHMENT,
getImageIndexIfTextureAttachment(stencil), stencil.getResource(),
- numViews, baseViewIndex, multiviewLayout, viewportOffsets);
+ numViews, baseViewIndex, isMultiview);
}
else if (mState.mWebGLDepthStencilAttachment.isAttached())
{
const auto &depthStencil = mState.mWebGLDepthStencilAttachment;
setAttachmentImpl(context, depthStencil.type(), GL_DEPTH_ATTACHMENT,
getImageIndexIfTextureAttachment(depthStencil),
- depthStencil.getResource(), numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
+ depthStencil.getResource(), numViews, baseViewIndex, isMultiview);
setAttachmentImpl(context, depthStencil.type(), GL_STENCIL_ATTACHMENT,
getImageIndexIfTextureAttachment(depthStencil),
- depthStencil.getResource(), numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
+ depthStencil.getResource(), numViews, baseViewIndex, isMultiview);
}
else
{
setAttachmentImpl(context, GL_NONE, GL_DEPTH_ATTACHMENT, ImageIndex(), nullptr, numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
+ baseViewIndex, isMultiview);
setAttachmentImpl(context, GL_NONE, GL_STENCIL_ATTACHMENT, ImageIndex(), nullptr, numViews,
- baseViewIndex, multiviewLayout, viewportOffsets);
+ baseViewIndex, isMultiview);
}
}
@@ -1697,8 +1731,7 @@ void Framebuffer::setAttachmentImpl(const Context *context,
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
+ bool isMultiview)
{
switch (binding)
{
@@ -1719,12 +1752,10 @@ void Framebuffer::setAttachmentImpl(const Context *context,
updateAttachment(context, &mState.mDepthAttachment, DIRTY_BIT_DEPTH_ATTACHMENT,
&mDirtyDepthAttachmentBinding, type, binding, textureIndex,
- attachmentObj, numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
+ attachmentObj, numViews, baseViewIndex, isMultiview);
updateAttachment(context, &mState.mStencilAttachment, DIRTY_BIT_STENCIL_ATTACHMENT,
&mDirtyStencilAttachmentBinding, type, binding, textureIndex,
- attachmentObj, numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
+ attachmentObj, numViews, baseViewIndex, isMultiview);
break;
}
@@ -1732,20 +1763,20 @@ void Framebuffer::setAttachmentImpl(const Context *context,
case GL_DEPTH_ATTACHMENT:
updateAttachment(context, &mState.mDepthAttachment, DIRTY_BIT_DEPTH_ATTACHMENT,
&mDirtyDepthAttachmentBinding, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout, viewportOffsets);
+ numViews, baseViewIndex, isMultiview);
break;
case GL_STENCIL:
case GL_STENCIL_ATTACHMENT:
updateAttachment(context, &mState.mStencilAttachment, DIRTY_BIT_STENCIL_ATTACHMENT,
&mDirtyStencilAttachmentBinding, type, binding, textureIndex, resource,
- numViews, baseViewIndex, multiviewLayout, viewportOffsets);
+ numViews, baseViewIndex, isMultiview);
break;
case GL_BACK:
updateAttachment(context, &mState.mColorAttachments[0], DIRTY_BIT_COLOR_ATTACHMENT_0,
&mDirtyColorAttachmentBindings[0], type, binding, textureIndex,
- resource, numViews, baseViewIndex, multiviewLayout, viewportOffsets);
+ resource, numViews, baseViewIndex, isMultiview);
break;
default:
@@ -1755,15 +1786,16 @@ void Framebuffer::setAttachmentImpl(const Context *context,
size_t dirtyBit = DIRTY_BIT_COLOR_ATTACHMENT_0 + colorIndex;
updateAttachment(context, &mState.mColorAttachments[colorIndex], dirtyBit,
&mDirtyColorAttachmentBindings[colorIndex], type, binding,
- textureIndex, resource, numViews, baseViewIndex, multiviewLayout,
- viewportOffsets);
+ textureIndex, resource, numViews, baseViewIndex, isMultiview);
if (!resource)
{
+ mColorAttachmentBits.reset(colorIndex);
mFloat32ColorAttachmentBits.reset(colorIndex);
}
else
{
+ mColorAttachmentBits.set(colorIndex);
updateFloat32ColorAttachmentBits(
colorIndex, resource->getAttachmentFormat(binding, textureIndex).info);
}
@@ -1789,11 +1821,10 @@ void Framebuffer::updateAttachment(const Context *context,
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
+ bool isMultiview)
{
attachment->attach(context, type, binding, textureIndex, resource, numViews, baseViewIndex,
- multiviewLayout, viewportOffsets);
+ isMultiview);
mDirtyBits.set(dirtyBit);
mState.mResourceNeedsInit.set(dirtyBit, attachment->initState() == InitState::MayNeedInit);
onDirtyBinding->bind(resource);
@@ -1865,8 +1896,9 @@ FramebufferAttachment *Framebuffer::getAttachmentFromSubjectIndex(angle::Subject
}
}
-bool Framebuffer::formsRenderingFeedbackLoopWith(const State &state) const
+bool Framebuffer::formsRenderingFeedbackLoopWith(const Context *context) const
{
+ const State &state = context->getState();
const Program *program = state.getProgram();
// TODO(jmadill): Default framebuffer feedback loops.
@@ -1875,39 +1907,53 @@ bool Framebuffer::formsRenderingFeedbackLoopWith(const State &state) const
return false;
}
- // The bitset will skip inactive draw buffers.
- for (size_t drawIndex : mState.mEnabledDrawBuffers)
+ const FramebufferAttachment *depth = getDepthbuffer();
+ const FramebufferAttachment *stencil = getStencilbuffer();
+
+ const bool checkDepth = depth && depth->type() == GL_TEXTURE;
+ // Skip the feedback loop check for stencil if depth/stencil point to the same resource.
+ const bool checkStencil =
+ (stencil && stencil->type() == GL_TEXTURE) && (!depth || *stencil != *depth);
+
+ const gl::ActiveTextureMask &activeTextures = program->getActiveSamplersMask();
+ const gl::ActiveTexturePointerArray &textures = state.getActiveTexturesCache();
+
+ for (size_t textureUnit : activeTextures)
{
- const FramebufferAttachment &attachment = mState.mColorAttachments[drawIndex];
- ASSERT(attachment.isAttached());
- if (attachment.type() == GL_TEXTURE)
+ Texture *texture = textures[textureUnit];
+
+ if (texture == nullptr)
+ {
+ continue;
+ }
+
+ // Depth and stencil attachment form feedback loops
+ // Regardless of if enabled or masked.
+ if (checkDepth)
{
- // Validate the feedback loop.
- if (program->samplesFromTexture(state, attachment.id()))
+ if (texture->id() == depth->id())
{
return true;
}
}
- }
- // Validate depth-stencil feedback loop. This is independent of Depth/Stencil state.
- const FramebufferAttachment *depth = getDepthbuffer();
- if (depth && depth->type() == GL_TEXTURE)
- {
- if (program->samplesFromTexture(state, depth->id()))
+ if (checkStencil)
{
- return true;
+ if (texture->id() == stencil->id())
+ {
+ return true;
+ }
}
- }
- const FramebufferAttachment *stencil = getStencilbuffer();
- if (stencil && stencil->type() == GL_TEXTURE)
- {
- // Skip the feedback loop check if depth/stencil point to the same resource.
- if (!depth || *stencil != *depth)
+ // Check if any color attachment forms a feedback loop.
+ for (size_t drawIndex : mColorAttachmentBits)
{
- if (program->samplesFromTexture(state, stencil->id()))
+ const FramebufferAttachment &attachment = mState.mColorAttachments[drawIndex];
+ ASSERT(attachment.isAttached());
+
+ if (attachment.isTextureWithId(texture->id()))
{
+ // TODO(jmadill): Check for appropriate overlap.
return true;
}
}
@@ -2012,20 +2058,14 @@ GLint Framebuffer::getBaseViewIndex() const
return mState.getBaseViewIndex();
}
-const std::vector<Offset> *Framebuffer::getViewportOffsets() const
-{
- return mState.getViewportOffsets();
-}
-
-GLenum Framebuffer::getMultiviewLayout() const
+bool Framebuffer::isMultiview() const
{
- return mState.getMultiviewLayout();
+ return mState.isMultiview();
}
bool Framebuffer::readDisallowedByMultiview() const
{
- return (mState.getMultiviewLayout() != GL_NONE && mState.getNumViews() > 1) ||
- mState.getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE;
+ return (mState.isMultiview() && mState.getNumViews() > 1);
}
angle::Result Framebuffer::ensureClearAttachmentsInitialized(const Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/Framebuffer.h b/chromium/third_party/angle/src/libANGLE/Framebuffer.h
index 219384bdfd6..15ee359ee73 100644
--- a/chromium/third_party/angle/src/libANGLE/Framebuffer.h
+++ b/chromium/third_party/angle/src/libANGLE/Framebuffer.h
@@ -95,7 +95,7 @@ class FramebufferState final : angle::NonCopyable
bool hasDepth() const;
bool hasStencil() const;
- GLenum getMultiviewLayout() const;
+ bool isMultiview() const;
ANGLE_INLINE GLsizei getNumViews() const
{
@@ -107,7 +107,6 @@ class FramebufferState final : angle::NonCopyable
return attachment->getNumViews();
}
- const std::vector<Offset> *getViewportOffsets() const;
GLint getBaseViewIndex() const;
GLuint id() const { return mId; }
@@ -175,20 +174,13 @@ class Framebuffer final : public angle::ObserverInterface,
GLenum binding,
const ImageIndex &textureIndex,
FramebufferAttachmentObject *resource);
- void setAttachmentMultiviewLayered(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- GLint baseViewIndex);
- void setAttachmentMultiviewSideBySide(const Context *context,
- GLenum type,
- GLenum binding,
- const ImageIndex &textureIndex,
- FramebufferAttachmentObject *resource,
- GLsizei numViews,
- const GLint *viewportOffsets);
+ void setAttachmentMultiview(const Context *context,
+ GLenum type,
+ GLenum binding,
+ const ImageIndex &textureIndex,
+ FramebufferAttachmentObject *resource,
+ GLsizei numViews,
+ GLint baseViewIndex);
void resetAttachment(const Context *context, GLenum binding);
bool detachTexture(const Context *context, GLuint texture);
@@ -206,11 +198,10 @@ class Framebuffer final : public angle::ObserverInterface,
const FramebufferAttachment *getFirstNonNullAttachment() const;
const FramebufferAttachment *getAttachment(const Context *context, GLenum attachment) const;
- GLenum getMultiviewLayout() const;
+ bool isMultiview() const;
bool readDisallowedByMultiview() const;
GLsizei getNumViews() const;
GLint getBaseViewIndex() const;
- const std::vector<Offset> *getViewportOffsets() const;
size_t getDrawbufferStateCount() const;
GLenum getDrawBufferState(size_t drawBuffer) const;
@@ -351,7 +342,7 @@ class Framebuffer final : public angle::ObserverInterface,
angle::SubjectIndex index,
angle::SubjectMessage message) override;
- bool formsRenderingFeedbackLoopWith(const State &state) const;
+ bool formsRenderingFeedbackLoopWith(const Context *context) const;
bool formsCopyingFeedbackLoopWith(GLuint copyTextureID,
GLint copyTextureLevel,
GLint copyTextureLayer) const;
@@ -379,13 +370,11 @@ class Framebuffer final : public angle::ObserverInterface,
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
+ bool isMultiview);
void commitWebGL1DepthStencilIfConsistent(const Context *context,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
+ bool isMultiview);
void setAttachmentImpl(const Context *context,
GLenum type,
GLenum binding,
@@ -393,8 +382,7 @@ class Framebuffer final : public angle::ObserverInterface,
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
+ bool isMultiview);
void updateAttachment(const Context *context,
FramebufferAttachment *attachment,
size_t dirtyBit,
@@ -405,8 +393,7 @@ class Framebuffer final : public angle::ObserverInterface,
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
+ bool isMultiview);
void markDrawAttachmentsInitialized(bool color, bool depth, bool stencil);
void markBufferInitialized(GLenum bufferType, GLint bufferIndex);
@@ -439,6 +426,7 @@ class Framebuffer final : public angle::ObserverInterface,
DirtyBits mDirtyBits;
DrawBufferMask mFloat32ColorAttachmentBits;
+ DrawBufferMask mColorAttachmentBits;
// The dirty bits guard is checked when we get a dependent state change message. We verify that
// we don't set a dirty bit that isn't already set, when inside the dirty bits syncState.
diff --git a/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.cpp b/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.cpp
index 4f8f6c44ed9..8238541dfd7 100644
--- a/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.cpp
+++ b/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.cpp
@@ -22,36 +22,10 @@
namespace gl
{
-namespace
-{
-
-std::vector<Offset> TransformViewportOffsetArrayToVectorOfOffsets(const GLint *viewportOffsets,
- GLsizei numViews)
-{
- const size_t numViewsAsSizeT = static_cast<size_t>(numViews);
- std::vector<Offset> offsetVector;
- offsetVector.reserve(numViewsAsSizeT);
- for (size_t i = 0u; i < numViewsAsSizeT; ++i)
- {
- offsetVector.emplace_back(Offset(viewportOffsets[i * 2u], viewportOffsets[i * 2u + 1u], 0));
- }
- return offsetVector;
-}
-
-} // namespace
-
////// FramebufferAttachment::Target Implementation //////
-const GLsizei FramebufferAttachment::kDefaultNumViews = 1;
-const GLenum FramebufferAttachment::kDefaultMultiviewLayout = GL_NONE;
-const GLint FramebufferAttachment::kDefaultBaseViewIndex = 0;
-const GLint FramebufferAttachment::kDefaultViewportOffsets[2] = {0};
-
-std::vector<Offset> FramebufferAttachment::GetDefaultViewportOffsetVector()
-{
- return TransformViewportOffsetArrayToVectorOfOffsets(
- FramebufferAttachment::kDefaultViewportOffsets, FramebufferAttachment::kDefaultNumViews);
-}
+const GLsizei FramebufferAttachment::kDefaultNumViews = 1;
+const GLint FramebufferAttachment::kDefaultBaseViewIndex = 0;
FramebufferAttachment::Target::Target() : mBinding(GL_NONE), mTextureIndex() {}
@@ -76,9 +50,8 @@ FramebufferAttachment::FramebufferAttachment()
: mType(GL_NONE),
mResource(nullptr),
mNumViews(kDefaultNumViews),
- mMultiviewLayout(kDefaultMultiviewLayout),
- mBaseViewIndex(kDefaultBaseViewIndex),
- mViewportOffsets(GetDefaultViewportOffsetVector())
+ mIsMultiview(false),
+ mBaseViewIndex(kDefaultBaseViewIndex)
{}
FramebufferAttachment::FramebufferAttachment(const Context *context,
@@ -89,7 +62,7 @@ FramebufferAttachment::FramebufferAttachment(const Context *context,
: mResource(nullptr)
{
attach(context, type, binding, textureIndex, resource, kDefaultNumViews, kDefaultBaseViewIndex,
- kDefaultMultiviewLayout, kDefaultViewportOffsets);
+ false);
}
FramebufferAttachment::FramebufferAttachment(FramebufferAttachment &&other)
@@ -104,9 +77,8 @@ FramebufferAttachment &FramebufferAttachment::operator=(FramebufferAttachment &&
std::swap(mTarget, other.mTarget);
std::swap(mResource, other.mResource);
std::swap(mNumViews, other.mNumViews);
- std::swap(mMultiviewLayout, other.mMultiviewLayout);
+ std::swap(mIsMultiview, other.mIsMultiview);
std::swap(mBaseViewIndex, other.mBaseViewIndex);
- std::swap(mViewportOffsets, other.mViewportOffsets);
return *this;
}
@@ -123,10 +95,9 @@ void FramebufferAttachment::detach(const Context *context)
mResource->onDetach(context);
mResource = nullptr;
}
- mNumViews = kDefaultNumViews;
- mMultiviewLayout = kDefaultMultiviewLayout;
- mBaseViewIndex = kDefaultBaseViewIndex;
- mViewportOffsets = GetDefaultViewportOffsetVector();
+ mNumViews = kDefaultNumViews;
+ mIsMultiview = false;
+ mBaseViewIndex = kDefaultBaseViewIndex;
// not technically necessary, could omit for performance
mTarget = Target();
@@ -139,8 +110,7 @@ void FramebufferAttachment::attach(const Context *context,
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets)
+ bool isMultiview)
{
if (resource == nullptr)
{
@@ -148,19 +118,11 @@ void FramebufferAttachment::attach(const Context *context,
return;
}
- mType = type;
- mTarget = Target(binding, textureIndex);
- mNumViews = numViews;
- mBaseViewIndex = baseViewIndex;
- mMultiviewLayout = multiviewLayout;
- if (multiviewLayout == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE)
- {
- mViewportOffsets = TransformViewportOffsetArrayToVectorOfOffsets(viewportOffsets, numViews);
- }
- else
- {
- mViewportOffsets = GetDefaultViewportOffsetVector();
- }
+ mType = type;
+ mTarget = Target(binding, textureIndex);
+ mNumViews = numViews;
+ mBaseViewIndex = baseViewIndex;
+ mIsMultiview = isMultiview;
resource->onAttach(context);
if (mResource != nullptr)
@@ -249,9 +211,9 @@ bool FramebufferAttachment::isLayered() const
return mTarget.textureIndex().isLayered();
}
-GLenum FramebufferAttachment::getMultiviewLayout() const
+bool FramebufferAttachment::isMultiview() const
{
- return mMultiviewLayout;
+ return mIsMultiview;
}
GLint FramebufferAttachment::getBaseViewIndex() const
@@ -259,11 +221,6 @@ GLint FramebufferAttachment::getBaseViewIndex() const
return mBaseViewIndex;
}
-const std::vector<Offset> &FramebufferAttachment::getMultiviewViewportOffsets() const
-{
- return mViewportOffsets;
-}
-
Texture *FramebufferAttachment::getTexture() const
{
return rx::GetAs<Texture>(mResource);
@@ -287,8 +244,7 @@ FramebufferAttachmentObject *FramebufferAttachment::getResource() const
bool FramebufferAttachment::operator==(const FramebufferAttachment &other) const
{
if (mResource != other.mResource || mType != other.mType || mNumViews != other.mNumViews ||
- mMultiviewLayout != other.mMultiviewLayout || mBaseViewIndex != other.mBaseViewIndex ||
- mViewportOffsets != other.mViewportOffsets)
+ mIsMultiview != other.mIsMultiview || mBaseViewIndex != other.mBaseViewIndex)
{
return false;
}
diff --git a/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.h b/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.h
index c910769179e..10d8c990b57 100644
--- a/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.h
+++ b/chromium/third_party/angle/src/libANGLE/FramebufferAttachment.h
@@ -79,8 +79,7 @@ class FramebufferAttachment final
FramebufferAttachmentObject *resource,
GLsizei numViews,
GLuint baseViewIndex,
- GLenum multiviewLayout,
- const GLint *viewportOffsets);
+ bool isMultiview);
// Helper methods
GLuint getRedSize() const;
@@ -113,9 +112,8 @@ class FramebufferAttachment final
GLsizei getNumViews() const { return mNumViews; }
- GLenum getMultiviewLayout() const;
+ bool isMultiview() const;
GLint getBaseViewIndex() const;
- const std::vector<Offset> &getMultiviewViewportOffsets() const;
// The size of the underlying resource the attachment points to. The 'depth' value will
// correspond to a 3D texture depth or the layer count of a 2D array texture. For Surfaces and
@@ -148,11 +146,8 @@ class FramebufferAttachment final
bool operator==(const FramebufferAttachment &other) const;
bool operator!=(const FramebufferAttachment &other) const;
- static std::vector<Offset> GetDefaultViewportOffsetVector();
static const GLsizei kDefaultNumViews;
- static const GLenum kDefaultMultiviewLayout;
static const GLint kDefaultBaseViewIndex;
- static const GLint kDefaultViewportOffsets[2];
private:
angle::Result getRenderTargetImpl(const Context *context,
@@ -184,9 +179,8 @@ class FramebufferAttachment final
Target mTarget;
FramebufferAttachmentObject *mResource;
GLsizei mNumViews;
- GLenum mMultiviewLayout;
+ bool mIsMultiview;
GLint mBaseViewIndex;
- std::vector<Offset> mViewportOffsets;
};
// A base class for objects that FBO Attachments may point to.
diff --git a/chromium/third_party/angle/src/libANGLE/Image.cpp b/chromium/third_party/angle/src/libANGLE/Image.cpp
index 12062a0fff7..d94d311a96e 100644
--- a/chromium/third_party/angle/src/libANGLE/Image.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Image.cpp
@@ -47,7 +47,7 @@ gl::ImageIndex GetImageIndex(EGLenum eglTarget, const egl::AttributeMap &attribs
const Display *DisplayFromContext(const gl::Context *context)
{
- return (context ? context->getCurrentDisplay() : nullptr);
+ return (context ? context->getDisplay() : nullptr);
}
} // anonymous namespace
diff --git a/chromium/third_party/angle/src/libANGLE/LoggingAnnotator.cpp b/chromium/third_party/angle/src/libANGLE/LoggingAnnotator.cpp
index cabf9cd3981..1ef177a76de 100644
--- a/chromium/third_party/angle/src/libANGLE/LoggingAnnotator.cpp
+++ b/chromium/third_party/angle/src/libANGLE/LoggingAnnotator.cpp
@@ -41,6 +41,7 @@ void LoggingAnnotator::logMessage(const gl::LogMessage &msg) const
{
switch (msg.getSeverity())
{
+ case gl::LOG_FATAL:
case gl::LOG_ERR:
plat->logError(plat, msg.getMessage().c_str());
break;
diff --git a/chromium/third_party/angle/src/libANGLE/MemoryObject.cpp b/chromium/third_party/angle/src/libANGLE/MemoryObject.cpp
new file mode 100644
index 00000000000..fcb2e961b3b
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/MemoryObject.cpp
@@ -0,0 +1,36 @@
+//
+// 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.
+//
+// MemoryObject.h: Implements the gl::MemoryObject class [EXT_external_objects]
+
+#include "libANGLE/MemoryObject.h"
+
+#include "common/angleutils.h"
+#include "libANGLE/renderer/GLImplFactory.h"
+#include "libANGLE/renderer/MemoryObjectImpl.h"
+
+namespace gl
+{
+
+MemoryObject::MemoryObject(rx::GLImplFactory *factory, GLuint id)
+ : RefCountObject(id), mImplementation(factory->createMemoryObject())
+{}
+
+MemoryObject::~MemoryObject() {}
+
+void MemoryObject::onDestroy(const Context *context)
+{
+ mImplementation->onDestroy(context);
+}
+
+angle::Result MemoryObject::importFd(Context *context,
+ GLuint64 size,
+ HandleType handleType,
+ GLint fd)
+{
+ return mImplementation->importFd(context, size, handleType, fd);
+}
+
+} // namespace gl
diff --git a/chromium/third_party/angle/src/libANGLE/MemoryObject.h b/chromium/third_party/angle/src/libANGLE/MemoryObject.h
new file mode 100644
index 00000000000..1bc1d40145a
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/MemoryObject.h
@@ -0,0 +1,45 @@
+//
+// 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.
+//
+// MemoryObject.h: Defines the gl::MemoryObject class [EXT_external_objects]
+
+#ifndef LIBANGLE_MEMORYOBJECT_H_
+#define LIBANGLE_MEMORYOBJECT_H_
+
+#include "angle_gl.h"
+#include "common/PackedEnums.h"
+#include "common/angleutils.h"
+#include "libANGLE/Error.h"
+#include "libANGLE/RefCountObject.h"
+
+namespace rx
+{
+class GLImplFactory;
+class MemoryObjectImpl;
+} // namespace rx
+
+namespace gl
+{
+class Context;
+
+class MemoryObject final : public RefCountObject
+{
+ public:
+ MemoryObject(rx::GLImplFactory *factory, GLuint id);
+ ~MemoryObject() override;
+
+ void onDestroy(const Context *context) override;
+
+ rx::MemoryObjectImpl *getImplementation() const { return mImplementation.get(); }
+
+ angle::Result importFd(Context *context, GLuint64 size, HandleType handleType, GLint fd);
+
+ private:
+ std::unique_ptr<rx::MemoryObjectImpl> mImplementation;
+};
+
+} // namespace gl
+
+#endif // LIBANGLE_MEMORYOBJECT_H_
diff --git a/chromium/third_party/angle/src/libANGLE/Program.cpp b/chromium/third_party/angle/src/libANGLE/Program.cpp
index 514c3755874..c675165098c 100644
--- a/chromium/third_party/angle/src/libANGLE/Program.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Program.cpp
@@ -4234,29 +4234,6 @@ void Program::getUniformInternal(const Context *context,
}
}
-bool Program::samplesFromTexture(const gl::State &state, GLuint textureID) const
-{
- ASSERT(mLinkResolved);
- // Must be called after samplers are validated.
- ASSERT(mCachedValidateSamplersResult.valid() && mCachedValidateSamplersResult.value());
-
- for (const auto &binding : mState.mSamplerBindings)
- {
- TextureType textureType = binding.textureType;
- for (const auto &unit : binding.boundTextureUnits)
- {
- GLenum programTextureID = state.getSamplerTextureId(unit, textureType);
- if (programTextureID == textureID)
- {
- // TODO(jmadill): Check for appropriate overlap.
- return true;
- }
- }
- }
-
- return false;
-}
-
angle::Result Program::syncState(const Context *context)
{
if (mDirtyBits.any())
diff --git a/chromium/third_party/angle/src/libANGLE/Program.h b/chromium/third_party/angle/src/libANGLE/Program.h
index 79bcb212408..80d25fefcad 100644
--- a/chromium/third_party/angle/src/libANGLE/Program.h
+++ b/chromium/third_party/angle/src/libANGLE/Program.h
@@ -783,7 +783,6 @@ class Program final : angle::NonCopyable, public LabeledObject
}
bool isValidated() const;
- bool samplesFromTexture(const State &state, GLuint textureID) const;
const AttributesMask &getActiveAttribLocationsMask() const
{
diff --git a/chromium/third_party/angle/src/libANGLE/ResourceManager.cpp b/chromium/third_party/angle/src/libANGLE/ResourceManager.cpp
index cc008cafa43..1bc8c8cba56 100644
--- a/chromium/third_party/angle/src/libANGLE/ResourceManager.cpp
+++ b/chromium/third_party/angle/src/libANGLE/ResourceManager.cpp
@@ -12,6 +12,7 @@
#include "libANGLE/Buffer.h"
#include "libANGLE/Context.h"
#include "libANGLE/Fence.h"
+#include "libANGLE/MemoryObject.h"
#include "libANGLE/Path.h"
#include "libANGLE/Program.h"
#include "libANGLE/ProgramPipeline.h"
@@ -476,4 +477,53 @@ ProgramPipeline *ProgramPipelineManager::getProgramPipeline(GLuint handle) const
return mObjectMap.query(handle);
}
+// MemoryObjectManager Implementation.
+
+MemoryObjectManager::MemoryObjectManager() {}
+
+MemoryObjectManager::~MemoryObjectManager()
+{
+ ASSERT(mMemoryObjects.empty());
+}
+
+void MemoryObjectManager::reset(const Context *context)
+{
+ while (!mMemoryObjects.empty())
+ {
+ deleteMemoryObject(context, mMemoryObjects.begin()->first);
+ }
+ mMemoryObjects.clear();
+}
+
+GLuint MemoryObjectManager::createMemoryObject(rx::GLImplFactory *factory)
+{
+ GLuint handle = mHandleAllocator.allocate();
+ MemoryObject *memoryObject = new MemoryObject(factory, handle);
+ memoryObject->addRef();
+ mMemoryObjects.assign(handle, memoryObject);
+ return handle;
+}
+
+void MemoryObjectManager::deleteMemoryObject(const Context *context, GLuint handle)
+{
+ MemoryObject *memoryObject = nullptr;
+ if (!mMemoryObjects.erase(handle, &memoryObject))
+ {
+ return;
+ }
+
+ // Requires an explicit this-> because of C++ template rules.
+ this->mHandleAllocator.release(handle);
+
+ if (memoryObject)
+ {
+ memoryObject->release(context);
+ }
+}
+
+MemoryObject *MemoryObjectManager::getMemoryObject(GLuint handle) const
+{
+ return mMemoryObjects.query(handle);
+}
+
} // namespace gl
diff --git a/chromium/third_party/angle/src/libANGLE/ResourceManager.h b/chromium/third_party/angle/src/libANGLE/ResourceManager.h
index 498c135bdc3..208e289591d 100644
--- a/chromium/third_party/angle/src/libANGLE/ResourceManager.h
+++ b/chromium/third_party/angle/src/libANGLE/ResourceManager.h
@@ -30,6 +30,7 @@ class Context;
class Sync;
class Framebuffer;
struct Limitations;
+class MemoryObject;
class Path;
class Program;
class ProgramPipeline;
@@ -304,6 +305,24 @@ class ProgramPipelineManager
~ProgramPipelineManager() override {}
};
+class MemoryObjectManager : public ResourceManagerBase<HandleAllocator>
+{
+ public:
+ MemoryObjectManager();
+
+ GLuint createMemoryObject(rx::GLImplFactory *factory);
+ void deleteMemoryObject(const Context *context, GLuint handle);
+ MemoryObject *getMemoryObject(GLuint handle) const;
+
+ protected:
+ ~MemoryObjectManager() override;
+
+ private:
+ void reset(const Context *context) override;
+
+ ResourceMap<MemoryObject> mMemoryObjects;
+};
+
} // namespace gl
#endif // LIBANGLE_RESOURCEMANAGER_H_
diff --git a/chromium/third_party/angle/src/libANGLE/Sampler.cpp b/chromium/third_party/angle/src/libANGLE/Sampler.cpp
index 63ca3f8a31a..c8a43d36ada 100644
--- a/chromium/third_party/angle/src/libANGLE/Sampler.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Sampler.cpp
@@ -36,9 +36,10 @@ const std::string &Sampler::getLabel() const
return mLabel;
}
-void Sampler::setMinFilter(GLenum minFilter)
+void Sampler::setMinFilter(const Context *context, GLenum minFilter)
{
mState.setMinFilter(minFilter);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getMinFilter() const
@@ -46,9 +47,10 @@ GLenum Sampler::getMinFilter() const
return mState.getMinFilter();
}
-void Sampler::setMagFilter(GLenum magFilter)
+void Sampler::setMagFilter(const Context *context, GLenum magFilter)
{
mState.setMagFilter(magFilter);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getMagFilter() const
@@ -56,9 +58,10 @@ GLenum Sampler::getMagFilter() const
return mState.getMagFilter();
}
-void Sampler::setWrapS(GLenum wrapS)
+void Sampler::setWrapS(const Context *context, GLenum wrapS)
{
mState.setWrapS(wrapS);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getWrapS() const
@@ -66,9 +69,10 @@ GLenum Sampler::getWrapS() const
return mState.getWrapS();
}
-void Sampler::setWrapT(GLenum wrapT)
+void Sampler::setWrapT(const Context *context, GLenum wrapT)
{
mState.setWrapT(wrapT);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getWrapT() const
@@ -76,9 +80,10 @@ GLenum Sampler::getWrapT() const
return mState.getWrapT();
}
-void Sampler::setWrapR(GLenum wrapR)
+void Sampler::setWrapR(const Context *context, GLenum wrapR)
{
mState.setWrapR(wrapR);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getWrapR() const
@@ -86,9 +91,10 @@ GLenum Sampler::getWrapR() const
return mState.getWrapR();
}
-void Sampler::setMaxAnisotropy(float maxAnisotropy)
+void Sampler::setMaxAnisotropy(const Context *context, float maxAnisotropy)
{
mState.setMaxAnisotropy(maxAnisotropy);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
float Sampler::getMaxAnisotropy() const
@@ -96,9 +102,10 @@ float Sampler::getMaxAnisotropy() const
return mState.getMaxAnisotropy();
}
-void Sampler::setMinLod(GLfloat minLod)
+void Sampler::setMinLod(const Context *context, GLfloat minLod)
{
mState.setMinLod(minLod);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLfloat Sampler::getMinLod() const
@@ -106,9 +113,10 @@ GLfloat Sampler::getMinLod() const
return mState.getMinLod();
}
-void Sampler::setMaxLod(GLfloat maxLod)
+void Sampler::setMaxLod(const Context *context, GLfloat maxLod)
{
mState.setMaxLod(maxLod);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLfloat Sampler::getMaxLod() const
@@ -116,9 +124,10 @@ GLfloat Sampler::getMaxLod() const
return mState.getMaxLod();
}
-void Sampler::setCompareMode(GLenum compareMode)
+void Sampler::setCompareMode(const Context *context, GLenum compareMode)
{
mState.setCompareMode(compareMode);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getCompareMode() const
@@ -126,9 +135,10 @@ GLenum Sampler::getCompareMode() const
return mState.getCompareMode();
}
-void Sampler::setCompareFunc(GLenum compareFunc)
+void Sampler::setCompareFunc(const Context *context, GLenum compareFunc)
{
mState.setCompareFunc(compareFunc);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getCompareFunc() const
@@ -136,9 +146,10 @@ GLenum Sampler::getCompareFunc() const
return mState.getCompareFunc();
}
-void Sampler::setSRGBDecode(GLenum sRGBDecode)
+void Sampler::setSRGBDecode(const Context *context, GLenum sRGBDecode)
{
mState.setSRGBDecode(sRGBDecode);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
GLenum Sampler::getSRGBDecode() const
@@ -146,9 +157,10 @@ GLenum Sampler::getSRGBDecode() const
return mState.getSRGBDecode();
}
-void Sampler::setBorderColor(const ColorGeneric &color)
+void Sampler::setBorderColor(const Context *context, const ColorGeneric &color)
{
mState.setBorderColor(color);
+ onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
const ColorGeneric &Sampler::getBorderColor() const
diff --git a/chromium/third_party/angle/src/libANGLE/Sampler.h b/chromium/third_party/angle/src/libANGLE/Sampler.h
index 4d17a6f9050..ba8c604cb1a 100644
--- a/chromium/third_party/angle/src/libANGLE/Sampler.h
+++ b/chromium/third_party/angle/src/libANGLE/Sampler.h
@@ -35,40 +35,40 @@ class Sampler final : public RefCountObject, public LabeledObject, public angle:
void setLabel(const Context *context, const std::string &label) override;
const std::string &getLabel() const override;
- void setMinFilter(GLenum minFilter);
+ void setMinFilter(const Context *context, GLenum minFilter);
GLenum getMinFilter() const;
- void setMagFilter(GLenum magFilter);
+ void setMagFilter(const Context *context, GLenum magFilter);
GLenum getMagFilter() const;
- void setWrapS(GLenum wrapS);
+ void setWrapS(const Context *context, GLenum wrapS);
GLenum getWrapS() const;
- void setWrapT(GLenum wrapT);
+ void setWrapT(const Context *context, GLenum wrapT);
GLenum getWrapT() const;
- void setWrapR(GLenum wrapR);
+ void setWrapR(const Context *context, GLenum wrapR);
GLenum getWrapR() const;
- void setMaxAnisotropy(float maxAnisotropy);
+ void setMaxAnisotropy(const Context *context, float maxAnisotropy);
float getMaxAnisotropy() const;
- void setMinLod(GLfloat minLod);
+ void setMinLod(const Context *context, GLfloat minLod);
GLfloat getMinLod() const;
- void setMaxLod(GLfloat maxLod);
+ void setMaxLod(const Context *context, GLfloat maxLod);
GLfloat getMaxLod() const;
- void setCompareMode(GLenum compareMode);
+ void setCompareMode(const Context *context, GLenum compareMode);
GLenum getCompareMode() const;
- void setCompareFunc(GLenum compareFunc);
+ void setCompareFunc(const Context *context, GLenum compareFunc);
GLenum getCompareFunc() const;
- void setSRGBDecode(GLenum sRGBDecode);
+ void setSRGBDecode(const Context *context, GLenum sRGBDecode);
GLenum getSRGBDecode() const;
- void setBorderColor(const ColorGeneric &color);
+ void setBorderColor(const Context *context, const ColorGeneric &color);
const ColorGeneric &getBorderColor() const;
const SamplerState &getSamplerState() const;
diff --git a/chromium/third_party/angle/src/libANGLE/Shader.cpp b/chromium/third_party/angle/src/libANGLE/Shader.cpp
index 2e715b27067..6cd1a01a68a 100644
--- a/chromium/third_party/angle/src/libANGLE/Shader.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Shader.cpp
@@ -20,7 +20,6 @@
#include "libANGLE/Constants.h"
#include "libANGLE/Context.h"
#include "libANGLE/ResourceManager.h"
-#include "libANGLE/WorkerThread.h"
#include "libANGLE/renderer/GLImplFactory.h"
#include "libANGLE/renderer/ShaderImpl.h"
@@ -108,47 +107,10 @@ class ScopedExit final : angle::NonCopyable
std::function<void()> mExit;
};
-using CompileImplFunctor = std::function<void(const std::string &, std::string &)>;
-class CompileTask : public angle::Closure
+struct Shader::CompilingState
{
- public:
- CompileTask(ShHandle handle,
- std::string &&sourcePath,
- std::string &&source,
- ShCompileOptions options,
- CompileImplFunctor &&functor)
- : mHandle(handle),
- mSourcePath(sourcePath),
- mSource(source),
- mOptions(options),
- mCompileImplFunctor(functor),
- mResult(false)
- {}
- void operator()() override
- {
- std::vector<const char *> srcStrings;
- if (!mSourcePath.empty())
- {
- srcStrings.push_back(mSourcePath.c_str());
- }
- srcStrings.push_back(mSource.c_str());
- mResult = sh::Compile(mHandle, &srcStrings[0], srcStrings.size(), mOptions);
- if (mResult)
- {
- mCompileImplFunctor(sh::GetObjectCode(mHandle), mInfoLog);
- }
- }
- bool getResult() { return mResult; }
- const std::string &getInfoLog() { return mInfoLog; }
-
- private:
- ShHandle mHandle;
- std::string mSourcePath;
- std::string mSource;
- ShCompileOptions mOptions;
- CompileImplFunctor mCompileImplFunctor;
- bool mResult;
- std::string mInfoLog;
+ std::shared_ptr<rx::WaitableCompileEvent> compileEvent;
+ ShCompilerInstance shCompilerInstance;
};
ShaderState::ShaderState(ShaderType shaderType)
@@ -359,17 +321,10 @@ void Shader::compile(const Context *context)
mState.mCompileStatus = CompileStatus::COMPILE_REQUESTED;
mBoundCompiler.set(context, context->getCompiler());
- // Cache the compile source and options for compilation. Must be done now, since the source
- // can change before the link call or another call that resolves the compile.
-
- std::stringstream sourceStream;
- std::string sourcePath;
- ShCompileOptions options =
- mImplementation->prepareSourceAndReturnOptions(context, &sourceStream, &sourcePath);
- options |= (SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_DRAW_ID);
- auto source = sourceStream.str();
+ ShCompileOptions options = (SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_DRAW_ID);
- // Add default options to WebGL shaders to prevent unexpected behavior during compilation.
+ // Add default options to WebGL shaders to prevent unexpected behavior during
+ // compilation.
if (context->getExtensions().webglCompatibility)
{
options |= SH_INIT_GL_POSITION;
@@ -379,9 +334,9 @@ void Shader::compile(const Context *context)
options |= SH_INIT_SHARED_VARIABLES;
}
- // Some targets (eg D3D11 Feature Level 9_3 and below) do not support non-constant loop indexes
- // in fragment shaders. Shader compilation will fail. To provide a better error message we can
- // instruct the compiler to pre-validate.
+ // Some targets (eg D3D11 Feature Level 9_3 and below) do not support non-constant loop
+ // indexes in fragment shaders. Shader compilation will fail. To provide a better error
+ // message we can instruct the compiler to pre-validate.
if (mRendererLimitations.shadersRequireIndexedLoopValidation)
{
options |= SH_VALIDATE_LOOP_INDEXING;
@@ -390,27 +345,15 @@ void Shader::compile(const Context *context)
mCurrentMaxComputeWorkGroupInvocations = context->getCaps().maxComputeWorkGroupInvocations;
ASSERT(mBoundCompiler.get());
- mShCompilerInstance = mBoundCompiler->getInstance(mState.mShaderType);
- ShHandle compilerHandle = mShCompilerInstance.getHandle();
+ ShCompilerInstance compilerInstance = mBoundCompiler->getInstance(mState.mShaderType);
+ ShHandle compilerHandle = compilerInstance.getHandle();
ASSERT(compilerHandle);
- mCompilerResourcesString = mShCompilerInstance.getBuiltinResourcesString();
+ mCompilerResourcesString = compilerInstance.getBuiltinResourcesString();
- mWorkerPool = context->getWorkerThreadPool();
- std::function<void(const std::string &, std::string &)> compileImplFunctor;
- if (mWorkerPool->isAsync())
- {
- compileImplFunctor = [this](const std::string &source, std::string &infoLog) {
- mImplementation->compileAsync(source, infoLog);
- };
- }
- else
- {
- compileImplFunctor = [](const std::string &source, std::string &infoLog) {};
- }
- mCompileTask =
- std::make_shared<CompileTask>(compilerHandle, std::move(sourcePath), std::move(source),
- options, std::move(compileImplFunctor));
- mCompileEvent = mWorkerPool->postWorkerTask(mCompileTask);
+ mCompilingState.reset(new CompilingState());
+ mCompilingState->shCompilerInstance = std::move(compilerInstance);
+ mCompilingState->compileEvent =
+ mImplementation->compile(context, &(mCompilingState->shCompilerInstance), options);
}
void Shader::resolveCompile()
@@ -420,22 +363,20 @@ void Shader::resolveCompile()
return;
}
- ASSERT(mCompileEvent.get());
- ASSERT(mCompileTask.get());
-
- mCompileEvent->wait();
+ ASSERT(mCompilingState.get());
- mCompileEvent.reset();
- mWorkerPool.reset();
+ mCompilingState->compileEvent->wait();
- bool compiled = mCompileTask->getResult();
- mInfoLog += mCompileTask->getInfoLog();
- mCompileTask.reset();
+ mInfoLog += mCompilingState->compileEvent->getInfoLog();
- ScopedExit exit([this]() { mBoundCompiler->putInstance(std::move(mShCompilerInstance)); });
+ ScopedExit exit([this]() {
+ mBoundCompiler->putInstance(std::move(mCompilingState->shCompilerInstance));
+ mCompilingState->compileEvent.reset();
+ mCompilingState.reset();
+ });
- ShHandle compilerHandle = mShCompilerInstance.getHandle();
- if (!compiled)
+ ShHandle compilerHandle = mCompilingState->shCompilerInstance.getHandle();
+ if (!mCompilingState->compileEvent->getResult())
{
mInfoLog += sh::GetInfoLog(compilerHandle);
WARN() << std::endl << mInfoLog;
@@ -552,7 +493,7 @@ void Shader::resolveCompile()
ASSERT(!mState.mTranslatedSource.empty());
- bool success = mImplementation->postTranslateCompile(&mShCompilerInstance, &mInfoLog);
+ bool success = mCompilingState->compileEvent->postTranslate(&mInfoLog);
mState.mCompileStatus = success ? CompileStatus::COMPILED : CompileStatus::NOT_COMPILED;
}
@@ -594,7 +535,7 @@ bool Shader::isCompiled()
bool Shader::isCompleted()
{
- return (!mState.compilePending() || mCompileEvent->isReady());
+ return (!mState.compilePending() || mCompilingState->compileEvent->isReady());
}
int Shader::getShaderVersion()
diff --git a/chromium/third_party/angle/src/libANGLE/Shader.h b/chromium/third_party/angle/src/libANGLE/Shader.h
index 2ac053037d7..c3d04dd54c3 100644
--- a/chromium/third_party/angle/src/libANGLE/Shader.h
+++ b/chromium/third_party/angle/src/libANGLE/Shader.h
@@ -31,6 +31,7 @@ namespace rx
class GLImplFactory;
class ShaderImpl;
class ShaderSh;
+class WaitableCompileEvent;
} // namespace rx
namespace angle
@@ -189,6 +190,8 @@ class Shader final : angle::NonCopyable, public LabeledObject
const std::string &getCompilerResourcesString() const;
private:
+ struct CompilingState;
+
~Shader() override;
static void GetSourceImpl(const std::string &source,
GLsizei bufSize,
@@ -208,10 +211,7 @@ class Shader final : angle::NonCopyable, public LabeledObject
// We keep a reference to the translator in order to defer compiles while preserving settings.
BindingPointer<Compiler> mBoundCompiler;
- ShCompilerInstance mShCompilerInstance;
- std::shared_ptr<CompileTask> mCompileTask;
- std::shared_ptr<angle::WorkerThreadPool> mWorkerPool;
- std::shared_ptr<angle::WaitableEvent> mCompileEvent;
+ std::unique_ptr<CompilingState> mCompilingState;
std::string mCompilerResourcesString;
ShaderProgramManager *mResourceManager;
diff --git a/chromium/third_party/angle/src/libANGLE/State.cpp b/chromium/third_party/angle/src/libANGLE/State.cpp
index e3e88df50ff..7223bb9de93 100644
--- a/chromium/third_party/angle/src/libANGLE/State.cpp
+++ b/chromium/third_party/angle/src/libANGLE/State.cpp
@@ -256,6 +256,8 @@ State::State(ContextID contextIn,
mPathManager(AllocateOrGetSharedResourceManager(shareContextState, &State::mPathManager)),
mFramebufferManager(new FramebufferManager()),
mProgramPipelineManager(new ProgramPipelineManager()),
+ mMemoryObjectManager(
+ AllocateOrGetSharedResourceManager(shareContextState, &State::mMemoryObjectManager)),
mMaxDrawBuffers(0),
mMaxCombinedTextureImageUnits(0),
mDepthClearValue(0),
@@ -540,9 +542,12 @@ ANGLE_INLINE void State::updateActiveTextureState(const Context *context,
if (mProgram)
{
+ const SamplerState &samplerState =
+ sampler ? sampler->getSamplerState() : texture->getSamplerState();
mTexturesIncompatibleWithSamplers[textureIndex] =
!texture->getTextureState().compatibleWithSamplerFormat(
- mProgram->getState().getSamplerFormatForTextureUnitIndex(textureIndex));
+ mProgram->getState().getSamplerFormatForTextureUnitIndex(textureIndex),
+ samplerState);
}
else
{
@@ -704,7 +709,7 @@ void State::setStencilTest(bool enabled)
void State::setStencilParams(GLenum stencilFunc, GLint stencilRef, GLuint stencilMask)
{
mDepthStencil.stencilFunc = stencilFunc;
- mStencilRef = (stencilRef > 0) ? stencilRef : 0;
+ mStencilRef = gl::clamp(stencilRef, 0, std::numeric_limits<uint8_t>::max());
mDepthStencil.stencilMask = stencilMask;
mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_FRONT);
}
@@ -714,7 +719,7 @@ void State::setStencilBackParams(GLenum stencilBackFunc,
GLuint stencilBackMask)
{
mDepthStencil.stencilBackFunc = stencilBackFunc;
- mStencilBackRef = (stencilBackRef > 0) ? stencilBackRef : 0;
+ mStencilBackRef = gl::clamp(stencilBackRef, 0, std::numeric_limits<uint8_t>::max());
mDepthStencil.stencilBackMask = stencilBackMask;
mDirtyBits.set(DIRTY_BIT_STENCIL_FUNCS_BACK);
}
@@ -1139,8 +1144,11 @@ void State::detachTexture(const Context *context, const TextureMap &zeroTextures
// Zero textures are the "default" textures instead of NULL
Texture *zeroTexture = zeroTextures[type].get();
ASSERT(zeroTexture != nullptr);
+ if (mCompleteTextureBindings[bindingIndex].getSubject() == binding.get())
+ {
+ updateActiveTexture(context, bindingIndex, zeroTexture);
+ }
binding.set(context, zeroTexture);
- updateActiveTexture(context, bindingIndex, zeroTexture);
}
}
}
@@ -1193,6 +1201,7 @@ void State::setSamplerBinding(const Context *context, GLuint textureUnit, Sample
// This is overly conservative as it assumes the sampler has never been bound.
setSamplerDirty(textureUnit);
onActiveTextureChange(context, textureUnit);
+ onActiveTextureStateChange(context, textureUnit);
}
void State::detachSampler(const Context *context, GLuint sampler)
@@ -1201,12 +1210,11 @@ void State::detachSampler(const Context *context, GLuint sampler)
// If a sampler object that is currently bound to one or more texture units is
// deleted, it is as though BindSampler is called once for each texture unit to
// which the sampler is bound, with unit set to the texture unit and sampler set to zero.
- for (BindingPointer<Sampler> &samplerBinding : mSamplers)
+ for (size_t i = 0; i < mSamplers.size(); i++)
{
- if (samplerBinding.id() == sampler)
+ if (mSamplers[i].id() == sampler)
{
- samplerBinding.set(context, nullptr);
- mDirtyBits.set(DIRTY_BIT_SAMPLER_BINDINGS);
+ setSamplerBinding(context, i, nullptr);
}
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/State.h b/chromium/third_party/angle/src/libANGLE/State.h
index e91050143d8..bec9a5e09cb 100644
--- a/chromium/third_party/angle/src/libANGLE/State.h
+++ b/chromium/third_party/angle/src/libANGLE/State.h
@@ -34,6 +34,7 @@ class BufferManager;
struct Caps;
class Context;
class FramebufferManager;
+class MemoryObjectManager;
class PathManager;
class ProgramPipelineManager;
class Query;
@@ -574,7 +575,11 @@ class State : angle::NonCopyable
const DirtyBits &getDirtyBits() const { return mDirtyBits; }
void clearDirtyBits() { mDirtyBits.reset(); }
void clearDirtyBits(const DirtyBits &bitset) { mDirtyBits &= ~bitset; }
- void setAllDirtyBits() { mDirtyBits.set(); }
+ void setAllDirtyBits()
+ {
+ mDirtyBits.set();
+ mDirtyCurrentValues.set();
+ }
using DirtyObjects = angle::BitSet<DIRTY_OBJECT_MAX>;
void clearDirtyObjects() { mDirtyObjects.reset(); }
@@ -709,6 +714,7 @@ class State : angle::NonCopyable
PathManager *mPathManager;
FramebufferManager *mFramebufferManager;
ProgramPipelineManager *mProgramPipelineManager;
+ MemoryObjectManager *mMemoryObjectManager;
// Cached values from Context's caps
GLuint mMaxDrawBuffers;
diff --git a/chromium/third_party/angle/src/libANGLE/Surface.cpp b/chromium/third_party/angle/src/libANGLE/Surface.cpp
index d0baffbefa4..6daec4f653b 100644
--- a/chromium/third_party/angle/src/libANGLE/Surface.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Surface.cpp
@@ -185,7 +185,7 @@ Error Surface::setIsCurrent(const gl::Context *context, bool isCurrent)
return NoError();
}
- return releaseRef(context->getCurrentDisplay());
+ return releaseRef(context->getDisplay());
}
Error Surface::releaseRef(const Display *display)
@@ -435,7 +435,7 @@ Error Surface::releaseTexImageFromTexture(const gl::Context *context)
{
ASSERT(mTexture);
mTexture = nullptr;
- return releaseRef(context->getCurrentDisplay());
+ return releaseRef(context->getDisplay());
}
gl::Extents Surface::getAttachmentSize(const gl::ImageIndex & /*target*/) const
diff --git a/chromium/third_party/angle/src/libANGLE/Texture.cpp b/chromium/third_party/angle/src/libANGLE/Texture.cpp
index 929a2cc0254..d071ac50f87 100644
--- a/chromium/third_party/angle/src/libANGLE/Texture.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Texture.cpp
@@ -108,6 +108,7 @@ TextureState::TextureState(TextureType type)
mGenerateMipmapHint(GL_FALSE),
mInitState(InitState::MayNeedInit),
mCachedSamplerFormat(SamplerFormat::InvalidEnum),
+ mCachedSamplerCompareMode(GL_NONE),
mCachedSamplerFormatValid(false)
{}
@@ -241,12 +242,12 @@ GLenum TextureState::getGenerateMipmapHint() const
return mGenerateMipmapHint;
}
-SamplerFormat TextureState::computeRequiredSamplerFormat() const
+SamplerFormat TextureState::computeRequiredSamplerFormat(const SamplerState &samplerState) const
{
const ImageDesc &baseImageDesc = getImageDesc(getBaseImageTarget(), getEffectiveBaseLevel());
if ((baseImageDesc.format.info->format == GL_DEPTH_COMPONENT ||
baseImageDesc.format.info->format == GL_DEPTH_STENCIL) &&
- mSamplerState.getCompareMode() != GL_NONE)
+ samplerState.getCompareMode() != GL_NONE)
{
return SamplerFormat::Shadow;
}
@@ -1146,24 +1147,22 @@ angle::Result Texture::copyImage(Context *context,
}
angle::Result Texture::copySubImage(Context *context,
- TextureTarget target,
- GLint level,
+ const ImageIndex &index,
const Offset &destOffset,
const Rectangle &sourceArea,
Framebuffer *source)
{
- ASSERT(TextureTargetToType(target) == mState.mType);
+ ASSERT(TextureTargetToType(index.getTarget()) == mState.mType);
// Ensure source FBO is initialized.
ANGLE_TRY(source->ensureReadAttachmentInitialized(context, GL_COLOR_BUFFER_BIT));
- Box destBox(destOffset.x, destOffset.y, destOffset.y, sourceArea.width, sourceArea.height, 1);
- ANGLE_TRY(ensureSubImageInitialized(context, target, level, destBox));
-
- ImageIndex index = ImageIndex::MakeFromTarget(target, level);
+ Box destBox(destOffset.x, destOffset.y, destOffset.z, sourceArea.width, sourceArea.height, 1);
+ ANGLE_TRY(
+ ensureSubImageInitialized(context, index.getTarget(), index.getLevelIndex(), destBox));
ANGLE_TRY(mTexture->copySubImage(context, index, destOffset, sourceArea, source));
- ANGLE_TRY(handleMipmapGenerationHint(context, level));
+ ANGLE_TRY(handleMipmapGenerationHint(context, index.getLevelIndex()));
return angle::Result::Continue;
}
@@ -1308,6 +1307,41 @@ angle::Result Texture::setStorageMultisample(Context *context,
return angle::Result::Continue;
}
+angle::Result Texture::setStorageExternalMemory(Context *context,
+ TextureType type,
+ GLsizei levels,
+ GLenum internalFormat,
+ const Extents &size,
+ MemoryObject *memoryObject,
+ GLuint64 offset)
+{
+ ASSERT(type == mState.mType);
+
+ // Release from previous calls to eglBindTexImage, to avoid calling the Impl after
+ ANGLE_TRY(releaseTexImageInternal(context));
+ ANGLE_TRY(orphanImages(context));
+
+ ANGLE_TRY(mTexture->setStorageExternalMemory(context, type, levels, internalFormat, size,
+ memoryObject, offset));
+
+ mState.mImmutableFormat = true;
+ mState.mImmutableLevels = static_cast<GLuint>(levels);
+ mState.clearImageDescs();
+ mState.setImageDescChain(0, static_cast<GLuint>(levels - 1), size, Format(internalFormat),
+ InitState::MayNeedInit);
+
+ // Changing the texture to immutable can trigger a change in the base and max levels:
+ // GLES 3.0.4 section 3.8.10 pg 158:
+ // "For immutable-format textures, levelbase is clamped to the range[0;levels],levelmax is then
+ // clamped to the range[levelbase;levels].
+ mDirtyBits.set(DIRTY_BIT_BASE_LEVEL);
+ mDirtyBits.set(DIRTY_BIT_MAX_LEVEL);
+
+ signalDirtyStorage(context, InitState::Initialized);
+
+ return angle::Result::Continue;
+}
+
angle::Result Texture::generateMipmap(Context *context)
{
// Release from previous calls to eglBindTexImage, to avoid calling the Impl after
@@ -1770,6 +1804,7 @@ void Texture::onSubjectStateChange(const gl::Context *context,
if (message == angle::SubjectMessage::DEPENDENT_DIRTY_BITS)
{
mDirtyBits.set(DIRTY_BIT_IMPLEMENTATION);
+ signalDirtyState(context, DIRTY_BIT_IMPLEMENTATION);
}
}
} // namespace gl
diff --git a/chromium/third_party/angle/src/libANGLE/Texture.h b/chromium/third_party/angle/src/libANGLE/Texture.h
index 09ce05fffbe..d80a7cbee06 100644
--- a/chromium/third_party/angle/src/libANGLE/Texture.h
+++ b/chromium/third_party/angle/src/libANGLE/Texture.h
@@ -43,6 +43,7 @@ class TextureGL;
namespace gl
{
class Framebuffer;
+class MemoryObject;
class Sampler;
class State;
class Texture;
@@ -111,11 +112,14 @@ class TextureState final : private angle::NonCopyable
bool isCubeComplete() const;
- ANGLE_INLINE bool compatibleWithSamplerFormat(SamplerFormat format) const
+ ANGLE_INLINE bool compatibleWithSamplerFormat(SamplerFormat format,
+ const SamplerState &samplerState) const
{
- if (!mCachedSamplerFormatValid)
+ if (!mCachedSamplerFormatValid ||
+ mCachedSamplerCompareMode != samplerState.getCompareMode())
{
- mCachedSamplerFormat = computeRequiredSamplerFormat();
+ mCachedSamplerFormat = computeRequiredSamplerFormat(samplerState);
+ mCachedSamplerCompareMode = samplerState.getCompareMode();
mCachedSamplerFormatValid = true;
}
// Incomplete textures are compatible with any sampler format.
@@ -152,7 +156,7 @@ class TextureState final : private angle::NonCopyable
bool computeSamplerCompleteness(const SamplerState &samplerState, const State &data) const;
bool computeMipmapCompleteness() const;
bool computeLevelCompleteness(TextureTarget target, size_t level) const;
- SamplerFormat computeRequiredSamplerFormat() const;
+ SamplerFormat computeRequiredSamplerFormat(const SamplerState &samplerState) const;
TextureTarget getBaseImageTarget() const;
@@ -200,6 +204,7 @@ class TextureState final : private angle::NonCopyable
InitState mInitState;
mutable SamplerFormat mCachedSamplerFormat;
+ mutable GLenum mCachedSamplerCompareMode;
mutable bool mCachedSamplerFormatValid;
};
@@ -345,8 +350,7 @@ class Texture final : public RefCountObject,
GLenum internalFormat,
Framebuffer *source);
angle::Result copySubImage(Context *context,
- TextureTarget target,
- GLint level,
+ const ImageIndex &index,
const Offset &destOffset,
const Rectangle &sourceArea,
Framebuffer *source);
@@ -386,6 +390,14 @@ class Texture final : public RefCountObject,
const Extents &size,
bool fixedSampleLocations);
+ angle::Result setStorageExternalMemory(Context *context,
+ TextureType type,
+ GLsizei levels,
+ GLenum internalFormat,
+ const Extents &size,
+ MemoryObject *memoryObject,
+ GLuint64 offset);
+
angle::Result setEGLImageTarget(Context *context, TextureType type, egl::Image *imageTarget);
angle::Result generateMipmap(Context *context);
diff --git a/chromium/third_party/angle/src/libANGLE/Thread.cpp b/chromium/third_party/angle/src/libANGLE/Thread.cpp
index 2058c22fe52..106dfc7e109 100644
--- a/chromium/third_party/angle/src/libANGLE/Thread.cpp
+++ b/chromium/third_party/angle/src/libANGLE/Thread.cpp
@@ -107,11 +107,11 @@ gl::Context *Thread::getValidContext() const
return mContext;
}
-Display *Thread::getCurrentDisplay() const
+Display *Thread::getDisplay() const
{
if (mContext)
{
- return mContext->getCurrentDisplay();
+ return mContext->getDisplay();
}
return nullptr;
}
diff --git a/chromium/third_party/angle/src/libANGLE/Thread.h b/chromium/third_party/angle/src/libANGLE/Thread.h
index 8f378959df2..5fbc8c4f4dd 100644
--- a/chromium/third_party/angle/src/libANGLE/Thread.h
+++ b/chromium/third_party/angle/src/libANGLE/Thread.h
@@ -48,7 +48,7 @@ class Thread : public LabeledObject
Surface *getCurrentReadSurface() const;
gl::Context *getContext() const;
gl::Context *getValidContext() const;
- Display *getCurrentDisplay() const;
+ Display *getDisplay() const;
private:
EGLLabelKHR mLabel;
diff --git a/chromium/third_party/angle/src/libANGLE/WorkerThread.cpp b/chromium/third_party/angle/src/libANGLE/WorkerThread.cpp
index 65ca66f51ee..0a96e9101be 100644
--- a/chromium/third_party/angle/src/libANGLE/WorkerThread.cpp
+++ b/chromium/third_party/angle/src/libANGLE/WorkerThread.cpp
@@ -24,6 +24,13 @@ namespace angle
WaitableEvent::WaitableEvent() = default;
WaitableEvent::~WaitableEvent() = default;
+void WaitableEventDone::wait() {}
+
+bool WaitableEventDone::isReady()
+{
+ return true;
+}
+
WorkerThreadPool::WorkerThreadPool() = default;
WorkerThreadPool::~WorkerThreadPool() = default;
@@ -219,4 +226,17 @@ std::shared_ptr<WorkerThreadPool> WorkerThreadPool::Create(bool multithreaded)
return pool;
}
+// static
+std::shared_ptr<WaitableEvent> WorkerThreadPool::PostWorkerTask(
+ std::shared_ptr<WorkerThreadPool> pool,
+ std::shared_ptr<Closure> task)
+{
+ std::shared_ptr<WaitableEvent> event = pool->postWorkerTask(task);
+ if (event.get())
+ {
+ event->setWorkerThreadPool(pool);
+ }
+ return event;
+}
+
} // namespace angle
diff --git a/chromium/third_party/angle/src/libANGLE/WorkerThread.h b/chromium/third_party/angle/src/libANGLE/WorkerThread.h
index 8693ab20f87..b1f704f568f 100644
--- a/chromium/third_party/angle/src/libANGLE/WorkerThread.h
+++ b/chromium/third_party/angle/src/libANGLE/WorkerThread.h
@@ -21,6 +21,8 @@
namespace angle
{
+class WorkerThreadPool;
+
// A callback function with no return value and no arguments.
class Closure
{
@@ -41,6 +43,7 @@ class WaitableEvent : angle::NonCopyable
// Peeks whether the event is ready. If ready, wait() will not block.
virtual bool isReady() = 0;
+ void setWorkerThreadPool(std::shared_ptr<WorkerThreadPool> pool) { mPool = pool; }
template <size_t Count>
static void WaitMany(std::array<std::shared_ptr<WaitableEvent>, Count> *waitables)
@@ -51,6 +54,17 @@ class WaitableEvent : angle::NonCopyable
(*waitables)[index]->wait();
}
}
+
+ private:
+ std::shared_ptr<WorkerThreadPool> mPool;
+};
+
+// A dummy waitable event.
+class WaitableEventDone final : public WaitableEvent
+{
+ public:
+ void wait() override;
+ bool isReady() override;
};
// Request WorkerThreads from the WorkerThreadPool. Each pool can keep worker threads around so
@@ -62,14 +76,17 @@ class WorkerThreadPool : angle::NonCopyable
virtual ~WorkerThreadPool();
static std::shared_ptr<WorkerThreadPool> Create(bool multithreaded);
-
- // Returns an event to wait on for the task to finish.
- // If the pool fails to create the task, returns null.
- virtual std::shared_ptr<WaitableEvent> postWorkerTask(std::shared_ptr<Closure> task) = 0;
+ static std::shared_ptr<WaitableEvent> PostWorkerTask(std::shared_ptr<WorkerThreadPool> pool,
+ std::shared_ptr<Closure> task);
virtual void setMaxThreads(size_t maxThreads) = 0;
virtual bool isAsync() = 0;
+
+ private:
+ // Returns an event to wait on for the task to finish.
+ // If the pool fails to create the task, returns null.
+ virtual std::shared_ptr<WaitableEvent> postWorkerTask(std::shared_ptr<Closure> task) = 0;
};
} // namespace angle
diff --git a/chromium/third_party/angle/src/libANGLE/WorkerThread_unittest.cpp b/chromium/third_party/angle/src/libANGLE/WorkerThread_unittest.cpp
index dd4403cc55a..32ce919eebe 100644
--- a/chromium/third_party/angle/src/libANGLE/WorkerThread_unittest.cpp
+++ b/chromium/third_party/angle/src/libANGLE/WorkerThread_unittest.cpp
@@ -35,8 +35,10 @@ TEST(WorkerPoolTest, SimpleTask)
{std::make_shared<TestTask>(), std::make_shared<TestTask>(),
std::make_shared<TestTask>(), std::make_shared<TestTask>()}};
std::array<std::shared_ptr<WaitableEvent>, 4> waitables = {
- {pool->postWorkerTask(tasks[0]), pool->postWorkerTask(tasks[1]),
- pool->postWorkerTask(tasks[2]), pool->postWorkerTask(tasks[3])}};
+ {WorkerThreadPool::PostWorkerTask(pool, tasks[0]),
+ WorkerThreadPool::PostWorkerTask(pool, tasks[1]),
+ WorkerThreadPool::PostWorkerTask(pool, tasks[2]),
+ WorkerThreadPool::PostWorkerTask(pool, tasks[3])}};
WaitableEvent::WaitMany(&waitables);
diff --git a/chromium/third_party/angle/src/libANGLE/angletypes.cpp b/chromium/third_party/angle/src/libANGLE/angletypes.cpp
index 1b5194705fb..0fa6c3a4c05 100644
--- a/chromium/third_party/angle/src/libANGLE/angletypes.cpp
+++ b/chromium/third_party/angle/src/libANGLE/angletypes.cpp
@@ -59,6 +59,11 @@ BlendState::BlendState(const BlendState &other)
memcpy(this, &other, sizeof(BlendState));
}
+bool BlendState::allChannelsMasked() const
+{
+ return !colorMaskRed && !colorMaskGreen && !colorMaskBlue && !colorMaskAlpha;
+}
+
bool operator==(const BlendState &a, const BlendState &b)
{
return memcmp(&a, &b, sizeof(BlendState)) == 0;
@@ -252,6 +257,11 @@ Rectangle Rectangle::removeReversal() const
return unreversed;
}
+bool Rectangle::encloses(const gl::Rectangle &inside) const
+{
+ return x0() <= inside.x0() && y0() <= inside.y0() && x1() >= inside.x1() && y1() >= inside.y1();
+}
+
bool ClipRectangle(const Rectangle &source, const Rectangle &clip, Rectangle *intersection)
{
int minSourceX, maxSourceX, minSourceY, maxSourceY;
diff --git a/chromium/third_party/angle/src/libANGLE/angletypes.h b/chromium/third_party/angle/src/libANGLE/angletypes.h
index 12e41223604..e7b5bf09b06 100644
--- a/chromium/third_party/angle/src/libANGLE/angletypes.h
+++ b/chromium/third_party/angle/src/libANGLE/angletypes.h
@@ -48,6 +48,8 @@ struct Rectangle
// Returns a rectangle with the same area but with height and width guaranteed to be positive.
Rectangle removeReversal() const;
+ bool encloses(const gl::Rectangle &inside) const;
+
int x;
int y;
int width;
@@ -146,6 +148,8 @@ struct BlendState final
BlendState();
BlendState(const BlendState &other);
+ bool allChannelsMasked() const;
+
bool blend;
GLenum sourceBlendRGB;
GLenum destBlendRGB;
diff --git a/chromium/third_party/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp b/chromium/third_party/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp
index d530dbd1101..0fbb7dfd525 100644
--- a/chromium/third_party/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/es3_copy_conversion_table_autogen.cpp
@@ -1,7 +1,7 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_copy_conversion_table.py using data from es3_copy_conversion_formats.json.
//
-// Copyright 2018 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.
//
diff --git a/chromium/third_party/angle/src/libANGLE/format_map_autogen.cpp b/chromium/third_party/angle/src/libANGLE/format_map_autogen.cpp
index c7e6a0cbcac..f88a2c8c7c5 100644
--- a/chromium/third_party/angle/src/libANGLE/format_map_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/format_map_autogen.cpp
@@ -2,7 +2,7 @@
// Generated by gen_format_map.py using data from format_map_data.json.
// ES3 format info from es3_format_type_combinations.json.
//
-// Copyright 2018 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.
//
diff --git a/chromium/third_party/angle/src/libANGLE/formatutils.cpp b/chromium/third_party/angle/src/libANGLE/formatutils.cpp
index 2d2f5e03b4b..2f20480992b 100644
--- a/chromium/third_party/angle/src/libANGLE/formatutils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/formatutils.cpp
@@ -302,10 +302,12 @@ static bool SizedFloatRGBASupport(const Version &clientVersion, const Extensions
extensions.colorBufferFloatRGBA;
}
-static bool SizedFloatRGBATextureAttachmentSupport(const Version &clientVersion,
- const Extensions &extensions)
+static bool SizedFloatRGBARenderableSupport(const Version &clientVersion,
+ const Extensions &extensions)
{
- return (extensions.colorBufferFloat || extensions.colorBufferFloatRGBA);
+ // This logic is the same for both Renderbuffers and TextureAttachment.
+ return extensions.colorBufferFloatRGBA || // ES2
+ extensions.colorBufferFloat; // ES3
}
InternalFormat::InternalFormat()
@@ -666,8 +668,6 @@ void AddCompressedFormat(InternalFormatInfoMap *map,
GLuint compressedBlockHeight,
GLuint compressedBlockSize,
GLuint componentCount,
- GLenum format,
- GLenum type,
bool srgb,
InternalFormat::SupportCheckFunction textureSupport,
InternalFormat::SupportCheckFunction filterSupport,
@@ -682,8 +682,8 @@ void AddCompressedFormat(InternalFormatInfoMap *map,
formatInfo.compressedBlockHeight = compressedBlockHeight;
formatInfo.pixelBytes = compressedBlockSize / 8;
formatInfo.componentCount = componentCount;
- formatInfo.format = format;
- formatInfo.type = type;
+ formatInfo.format = internalFormat;
+ formatInfo.type = GL_UNSIGNED_BYTE;
formatInfo.componentType = GL_UNSIGNED_NORMALIZED;
formatInfo.colorEncoding = (srgb ? GL_SRGB : GL_LINEAR);
formatInfo.compressed = true;
@@ -783,7 +783,7 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap()
AddRGBAFormat(&map, GL_R32F, true, 32, 0, 0, 0, 0, GL_RED, GL_FLOAT, GL_FLOAT, false, SizedFloatRGSupport, RequireExt<&Extensions::textureFloatLinear>, RequireExt<&Extensions::colorBufferFloat>, RequireExt<&Extensions::colorBufferFloat>);
AddRGBAFormat(&map, GL_RG32F, true, 32, 32, 0, 0, 0, GL_RG, GL_FLOAT, GL_FLOAT, false, SizedFloatRGSupport, RequireExt<&Extensions::textureFloatLinear>, RequireExt<&Extensions::colorBufferFloat>, RequireExt<&Extensions::colorBufferFloat>);
AddRGBAFormat(&map, GL_RGB32F, true, 32, 32, 32, 0, 0, GL_RGB, GL_FLOAT, GL_FLOAT, false, SizedFloatRGBSupport, RequireExt<&Extensions::textureFloatLinear>, RequireExt<&Extensions::colorBufferFloatRGB>, NeverSupported );
- AddRGBAFormat(&map, GL_RGBA32F, true, 32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, GL_FLOAT, false, SizedFloatRGBASupport, RequireExt<&Extensions::textureFloatLinear>, SizedFloatRGBATextureAttachmentSupport, RequireExt<&Extensions::colorBufferFloat>);
+ AddRGBAFormat(&map, GL_RGBA32F, true, 32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, GL_FLOAT, false, SizedFloatRGBASupport, RequireExt<&Extensions::textureFloatLinear>, SizedFloatRGBARenderableSupport, SizedFloatRGBARenderableSupport );
// Depth stencil formats
// | Internal format |sized| D |S | X | Format | Type | Component type | Texture supported | Filterable | Texture attachment | Renderbuffer |
@@ -808,77 +808,77 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap()
AddLUMAFormat(&map, GL_LUMINANCE_ALPHA32F_EXT, true, 32, 32, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, RequireExt<&Extensions::textureFloatLinear>, NeverSupported, NeverSupported);
// Compressed formats, From ES 3.0.1 spec, table 3.16
- // | Internal format |W |H | BS |CC| Format | Type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
- AddCompressedFormat(&map, GL_COMPRESSED_R11_EAC, 4, 4, 64, 1, GL_RED, GL_UNSIGNED_BYTE, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACR11UnsignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_R11_EAC, 4, 4, 64, 1, GL_RED, GL_UNSIGNED_BYTE, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACR11SignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RG11_EAC, 4, 4, 128, 2, GL_RG, GL_UNSIGNED_BYTE, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACRG11UnsignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_RG11_EAC, 4, 4, 128, 2, GL_RG, GL_UNSIGNED_BYTE, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACRG11SignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2RGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2sRGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2PunchthroughARGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2PunchthroughAsRGB8AlphaTexture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2RGBA8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2sRGB8Alpha8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
+ // | Internal format |W |H | BS |CC| SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
+ AddCompressedFormat(&map, GL_COMPRESSED_R11_EAC, 4, 4, 64, 1, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACR11UnsignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_R11_EAC, 4, 4, 64, 1, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACR11SignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RG11_EAC, 4, 4, 128, 2, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACRG11UnsignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_RG11_EAC, 4, 4, 128, 2, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedEACRG11SignedTexture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGB8_ETC2, 4, 4, 64, 3, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2RGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ETC2, 4, 4, 64, 3, true, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2sRGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2PunchthroughARGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, true, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2PunchthroughAsRGB8AlphaTexture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 4, 128, 4, false, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2RGBA8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 4, 4, 128, 4, true, RequireESOrExtOrExt<3, 0, &Extensions::compressedTextureETC, &Extensions::compressedETC2sRGB8Alpha8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
// From GL_EXT_texture_compression_dxt1
- // | Internal format |W |H | BS |CC| Format | Type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
- AddCompressedFormat(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, AlwaysSupported, NeverSupported, NeverSupported);
+ // | Internal format |W |H | BS |CC| SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
+ AddCompressedFormat(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 64, 3, false, RequireExt<&Extensions::textureCompressionDXT1>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 64, 4, false, RequireExt<&Extensions::textureCompressionDXT1>, AlwaysSupported, NeverSupported, NeverSupported);
// From GL_ANGLE_texture_compression_dxt3
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT3>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, 4, 4, 128, 4, false, RequireExt<&Extensions::textureCompressionDXT3>, AlwaysSupported, NeverSupported, NeverSupported);
// From GL_ANGLE_texture_compression_dxt5
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT5>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, 4, 4, 128, 4, false, RequireExt<&Extensions::textureCompressionDXT5>, AlwaysSupported, NeverSupported, NeverSupported);
// From GL_OES_compressed_ETC1_RGB8_texture
- AddCompressedFormat(&map, GL_ETC1_RGB8_OES, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::compressedETC1RGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_ETC1_RGB8_OES, 4, 4, 64, 3, false, RequireExt<&Extensions::compressedETC1RGB8Texture>, AlwaysSupported, NeverSupported, NeverSupported);
// From GL_EXT_texture_compression_s3tc_srgb
- // | Internal format |W |H | BS |CC| Format | Type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 4, 4, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
+ // | Internal format |W |H | BS |CC|SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 4, 4, 64, 3, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 4, 4, 64, 4, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 4, 4, 128, 4, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 4, 4, 128, 4, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, AlwaysSupported, NeverSupported, NeverSupported);
// From KHR_texture_compression_astc_hdr
- // | Internal format | W | H | BS |CC| Format | Type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 5, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 5, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 6, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 6, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 8, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 8, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 8, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 10, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 10, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 10, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 10, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 12, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 12, 12, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
-
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 5, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 5, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 6, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 6, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 8, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 8, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 8, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 10, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 10, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 10, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 10, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 12, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 12, 12, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ // | Internal format | W | H | BS |CC| SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 4, 4, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 5, 4, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 5, 5, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 6, 5, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 6, 6, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 8, 5, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 8, 6, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 8, 8, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 10, 5, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 10, 6, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 10, 8, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 10, 10, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 12, 10, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 12, 12, 128, 4, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 4, 4, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 5, 4, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 5, 5, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 6, 5, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 6, 6, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 8, 5, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 8, 6, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 8, 8, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 10, 5, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 10, 6, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 10, 8, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 10, 10, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 12, 10, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 12, 12, 128, 4, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, AlwaysSupported, NeverSupported, NeverSupported);
// From EXT_texture_compression_bptc
- // | Internal format | W | H | BS |CC| Format | Type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
- AddCompressedFormat(&map, GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, 4, 4, 128, 4, GL_RGB, GL_FLOAT, false, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, 4, 4, 128, 4, GL_RGB, GL_FLOAT, false, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
+ // | Internal format | W | H | BS |CC| SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
+ AddCompressedFormat(&map, GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, 4, 4, 128, 4, false, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, 4, 4, 128, 4, true, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, 4, 4, 128, 4, false, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, 4, 4, 128, 4, false, RequireExt<&Extensions::textureCompressionBPTC>, AlwaysSupported, NeverSupported, NeverSupported);
// For STENCIL_INDEX8 we chose a normalized component type for the following reasons:
// - Multisampled buffer are disallowed for non-normalized integer component types and we want to support it for STENCIL_INDEX8
@@ -888,12 +888,12 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap()
AddDepthStencilFormat(&map, GL_STENCIL_INDEX8, true, 0, 8, 0, GL_STENCIL, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<1, 0>, NeverSupported, RequireES<1, 0>, RequireES<1, 0>);
// From GL_ANGLE_lossy_etc_decode
- // | Internal format |W |H |BS |CC| Format | Type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
- AddCompressedFormat(&map, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
- AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
+ // | Internal format |W |H |BS |CC| SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
+ AddCompressedFormat(&map, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 4, 4, 64, 3, false, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, false, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, true, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, false, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
+ AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, true, RequireExt<&Extensions::lossyETCDecode>, AlwaysSupported, NeverSupported, NeverSupported);
// From GL_EXT_texture_norm16
// | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer |
diff --git a/chromium/third_party/angle/src/libANGLE/gen_copy_conversion_table.py b/chromium/third_party/angle/src/libANGLE/gen_copy_conversion_table.py
index f2c9603d545..ad67ab13da3 100644
--- a/chromium/third_party/angle/src/libANGLE/gen_copy_conversion_table.py
+++ b/chromium/third_party/angle/src/libANGLE/gen_copy_conversion_table.py
@@ -5,6 +5,7 @@
#
# gen_copy_conversion_table.py:
# Code generation for ES3 valid copy conversions table format map.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
import sys
@@ -64,28 +65,51 @@ def parse_texture_format_case(texture_format, framebuffer_formats):
return template_format_case.format(
texture_format = texture_format, framebuffer_format_cases = framebuffer_format_cases)
-data_source_name = 'es3_copy_conversion_formats.json'
-json_data = angle_format.load_json(data_source_name)
+def main():
-format_map = {}
+ data_source_name = 'es3_copy_conversion_formats.json'
+ out_file_name = 'es3_copy_conversion_table_autogen.cpp'
-for description, data in json_data.iteritems():
- for texture_format, framebuffer_format in data:
- if texture_format not in format_map:
- format_map[texture_format] = []
- format_map[texture_format] += [ framebuffer_format ]
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [data_source_name]
+ outputs = [out_file_name]
-texture_format_cases = ""
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
-for texture_format, framebuffer_formats in sorted(format_map.iteritems()):
- texture_format_cases += parse_texture_format_case(texture_format, framebuffer_formats)
+ json_data = angle_format.load_json(data_source_name)
-with open('es3_copy_conversion_table_autogen.cpp', 'wt') as out_file:
- output_cpp = template_cpp.format(
- script_name = sys.argv[0],
- data_source_name = data_source_name,
- copyright_year = date.today().year,
- texture_format_cases = texture_format_cases)
- out_file.write(output_cpp)
- out_file.close()
+ format_map = {}
+
+ for description, data in json_data.iteritems():
+ for texture_format, framebuffer_format in data:
+ if texture_format not in format_map:
+ format_map[texture_format] = []
+ format_map[texture_format] += [ framebuffer_format ]
+
+ texture_format_cases = ""
+
+ for texture_format, framebuffer_formats in sorted(format_map.iteritems()):
+ texture_format_cases += parse_texture_format_case(texture_format, framebuffer_formats)
+
+ with open(out_file_name, 'wt') as out_file:
+ output_cpp = template_cpp.format(
+ script_name = sys.argv[0],
+ data_source_name = data_source_name,
+ copyright_year = date.today().year,
+ texture_format_cases = texture_format_cases)
+ out_file.write(output_cpp)
+ out_file.close()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/gen_format_map.py b/chromium/third_party/angle/src/libANGLE/gen_format_map.py
index e150fc0bcac..4bba7a6d861 100644
--- a/chromium/third_party/angle/src/libANGLE/gen_format_map.py
+++ b/chromium/third_party/angle/src/libANGLE/gen_format_map.py
@@ -6,6 +6,7 @@
# gen_format_map.py:
# Code generation for GL format map. The format map matches between
# {format,type} and internal format.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
import sys
@@ -110,10 +111,12 @@ template_es3_combo_type_case = """ case {type}:
}}
"""
+
def parse_type_case(type, result):
return template_simple_case.format(
key = type, result = result)
+
def parse_format_case(format, type_map):
type_cases = ""
for type, internal_format in sorted(type_map.iteritems()):
@@ -121,66 +124,88 @@ def parse_format_case(format, type_map):
return template_format_case.format(
format = format, type_cases = type_cases)
-input_script = 'format_map_data.json'
-format_map = angle_format.load_json(input_script)
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = ['es3_format_type_combinations.json', 'format_map_data.json']
+ outputs = ['format_map_autogen.cpp']
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ input_script = 'format_map_data.json'
+
+ format_map = angle_format.load_json(input_script)
+
+ format_cases = ""
+
+ for format, type_map in sorted(format_map.iteritems()):
+ format_cases += parse_format_case(format, type_map)
-format_cases = ""
+ combo_data_file = 'es3_format_type_combinations.json'
+ es3_combo_data = angle_format.load_json(combo_data_file)
+ combo_data = [combo for sublist in es3_combo_data.values() for combo in sublist]
-for format, type_map in sorted(format_map.iteritems()):
- format_cases += parse_format_case(format, type_map)
+ types = set()
+ formats = set()
+ combos = {}
-combo_data_file = 'es3_format_type_combinations.json'
-es3_combo_data = angle_format.load_json(combo_data_file)
-combo_data = [combo for sublist in es3_combo_data.values() for combo in sublist]
+ for internal_format, format, type in combo_data:
+ types.update([type])
+ formats.update([format])
+ if format not in combos:
+ combos[format] = {}
+ if type not in combos[format]:
+ combos[format][type] = [internal_format]
+ else:
+ combos[format][type] += [internal_format]
-types = set()
-formats = set()
-combos = {}
+ es3_format_cases = ""
-for internal_format, format, type in combo_data:
- types.update([type])
- formats.update([format])
- if format not in combos:
- combos[format] = {}
- if type not in combos[format]:
- combos[format][type] = [internal_format]
- else:
- combos[format][type] += [internal_format]
+ for format in sorted(formats):
+ es3_format_cases += " case " + format + ":\n"
-es3_format_cases = ""
+ es3_type_cases = ""
-for format in sorted(formats):
- es3_format_cases += " case " + format + ":\n"
+ for type in sorted(types):
+ es3_type_cases += " case " + type + ":\n"
-es3_type_cases = ""
+ es3_combo_cases = ""
-for type in sorted(types):
- es3_type_cases += " case " + type + ":\n"
+ for format, type_combos in combos.iteritems():
+ this_type_cases = ""
+ for type, combos in type_combos.iteritems():
+ internal_format_cases = ""
+ for internal_format in combos:
+ internal_format_cases += " case " + internal_format + ":\n"
-es3_combo_cases = ""
+ this_type_cases += template_es3_combo_type_case.format(
+ type = type, internal_format_cases = internal_format_cases)
-for format, type_combos in combos.iteritems():
- this_type_cases = ""
- for type, combos in type_combos.iteritems():
- internal_format_cases = ""
- for internal_format in combos:
- internal_format_cases += " case " + internal_format + ":\n"
+ es3_combo_cases += template_format_case.format(
+ format = format, type_cases = this_type_cases)
- this_type_cases += template_es3_combo_type_case.format(
- type = type, internal_format_cases = internal_format_cases)
+ with open('format_map_autogen.cpp', 'wt') as out_file:
+ output_cpp = template_cpp.format(
+ script_name = sys.argv[0],
+ data_source_name = input_script,
+ es3_data_source_name = combo_data_file,
+ copyright_year = date.today().year,
+ format_cases = format_cases,
+ es3_format_cases = es3_format_cases,
+ es3_type_cases = es3_type_cases,
+ es3_combo_cases = es3_combo_cases)
+ out_file.write(output_cpp)
+ return 0
- es3_combo_cases += template_format_case.format(
- format = format, type_cases = this_type_cases)
-with open('format_map_autogen.cpp', 'wt') as out_file:
- output_cpp = template_cpp.format(
- script_name = sys.argv[0],
- data_source_name = input_script,
- es3_data_source_name = combo_data_file,
- copyright_year = date.today().year,
- format_cases = format_cases,
- es3_format_cases = es3_format_cases,
- es3_type_cases = es3_type_cases,
- es3_combo_cases = es3_combo_cases)
- out_file.write(output_cpp)
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/queryutils.cpp b/chromium/third_party/angle/src/libANGLE/queryutils.cpp
index c5ed43e34fd..73ab7932bf7 100644
--- a/chromium/third_party/angle/src/libANGLE/queryutils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/queryutils.cpp
@@ -454,40 +454,40 @@ void SetSamplerParameterBase(Context *context,
switch (pname)
{
case GL_TEXTURE_WRAP_S:
- sampler->setWrapS(ConvertToGLenum(pname, params[0]));
+ sampler->setWrapS(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_WRAP_T:
- sampler->setWrapT(ConvertToGLenum(pname, params[0]));
+ sampler->setWrapT(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_WRAP_R:
- sampler->setWrapR(ConvertToGLenum(pname, params[0]));
+ sampler->setWrapR(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_MIN_FILTER:
- sampler->setMinFilter(ConvertToGLenum(pname, params[0]));
+ sampler->setMinFilter(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_MAG_FILTER:
- sampler->setMagFilter(ConvertToGLenum(pname, params[0]));
+ sampler->setMagFilter(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_MAX_ANISOTROPY_EXT:
- sampler->setMaxAnisotropy(CastQueryValueTo<GLfloat>(pname, params[0]));
+ sampler->setMaxAnisotropy(context, CastQueryValueTo<GLfloat>(pname, params[0]));
break;
case GL_TEXTURE_COMPARE_MODE:
- sampler->setCompareMode(ConvertToGLenum(pname, params[0]));
+ sampler->setCompareMode(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_COMPARE_FUNC:
- sampler->setCompareFunc(ConvertToGLenum(pname, params[0]));
+ sampler->setCompareFunc(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_MIN_LOD:
- sampler->setMinLod(CastQueryValueTo<GLfloat>(pname, params[0]));
+ sampler->setMinLod(context, CastQueryValueTo<GLfloat>(pname, params[0]));
break;
case GL_TEXTURE_MAX_LOD:
- sampler->setMaxLod(CastQueryValueTo<GLfloat>(pname, params[0]));
+ sampler->setMaxLod(context, CastQueryValueTo<GLfloat>(pname, params[0]));
break;
case GL_TEXTURE_SRGB_DECODE_EXT:
- sampler->setSRGBDecode(ConvertToGLenum(pname, params[0]));
+ sampler->setSRGBDecode(context, ConvertToGLenum(pname, params[0]));
break;
case GL_TEXTURE_BORDER_COLOR:
- sampler->setBorderColor(ConvertToColor<isPureInteger>(params));
+ sampler->setBorderColor(context, ConvertToColor<isPureInteger>(params));
break;
default:
UNREACHABLE();
@@ -1077,29 +1077,14 @@ void QueryFramebufferAttachmentParameteriv(const Context *context,
*params = attachmentObject->layer();
break;
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR:
*params = attachmentObject->getNumViews();
break;
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
- *params = static_cast<GLint>(attachmentObject->getMultiviewLayout());
- break;
-
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR:
*params = attachmentObject->getBaseViewIndex();
break;
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
- {
- const std::vector<Offset> &offsets = attachmentObject->getMultiviewViewportOffsets();
- for (size_t i = 0u; i < offsets.size(); ++i)
- {
- params[i * 2u] = offsets[i].x;
- params[i * 2u + 1u] = offsets[i].y;
- }
- }
- break;
-
case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT:
*params = attachmentObject->isLayered();
break;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.cpp b/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.cpp
index be91b874299..4ae6b42ce04 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.cpp
@@ -124,4 +124,5 @@ void ContextImpl::handleError(GLenum errorCode,
errorStream << "Internal error: " << gl::FmtHex(errorCode) << ": " << message;
mErrors->handleError(errorCode, errorStream.str().c_str(), file, function, line);
}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h
index 0203276efaa..5cd905bdacd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ContextImpl.h
@@ -125,7 +125,7 @@ class ContextImpl : public GLImplFactory
const GLfloat *transformValues);
// Device loss
- virtual GLenum getResetStatus() = 0;
+ virtual gl::GraphicsResetStatus getResetStatus() = 0;
// Vendor and description strings.
virtual std::string getVendorString() const = 0;
@@ -140,6 +140,9 @@ class ContextImpl : public GLImplFactory
virtual void pushDebugGroup(GLenum source, GLuint id, const std::string &message) = 0;
virtual void popDebugGroup() = 0;
+ // KHR_parallel_shader_compile
+ virtual void setMaxShaderCompilerThreads(GLuint count) {}
+
// State sync with dirty bits.
virtual angle::Result syncState(const gl::Context *context,
const gl::State::DirtyBits &dirtyBits,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/EGLSyncImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/EGLSyncImpl.h
index 9d910c4538a..561251df67b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/EGLSyncImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/EGLSyncImpl.h
@@ -20,6 +20,11 @@ namespace egl
class Display;
} // namespace egl
+namespace gl
+{
+class Context;
+} // namespace gl
+
namespace rx
{
class EGLSyncImpl : angle::NonCopyable
@@ -30,12 +35,17 @@ class EGLSyncImpl : angle::NonCopyable
virtual void onDestroy(const egl::Display *display) {}
- virtual egl::Error initialize(const egl::Display *display, EGLenum type) = 0;
+ virtual egl::Error initialize(const egl::Display *display,
+ const gl::Context *context,
+ EGLenum type) = 0;
virtual egl::Error clientWait(const egl::Display *display,
+ const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult) = 0;
- virtual egl::Error serverWait(const egl::Display *display, EGLint flags) = 0;
+ virtual egl::Error serverWait(const egl::Display *display,
+ const gl::Context *context,
+ EGLint flags) = 0;
virtual egl::Error getStatus(const egl::Display *display, EGLint *outStatus) = 0;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/GLImplFactory.h b/chromium/third_party/angle/src/libANGLE/renderer/GLImplFactory.h
index 7f395f79f21..4b13beb3009 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/GLImplFactory.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/GLImplFactory.h
@@ -35,6 +35,7 @@ class ContextImpl;
class FenceNVImpl;
class SyncImpl;
class FramebufferImpl;
+class MemoryObjectImpl;
class PathImpl;
class ProgramImpl;
class ProgramPipelineImpl;
@@ -88,6 +89,9 @@ class GLImplFactory : angle::NonCopyable
virtual ProgramPipelineImpl *createProgramPipeline(const gl::ProgramPipelineState &data) = 0;
virtual std::vector<PathImpl *> createPaths(GLsizei range) = 0;
+
+ // Memory object creation
+ virtual MemoryObjectImpl *createMemoryObject() = 0;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/MemoryObjectImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/MemoryObjectImpl.h
new file mode 100644
index 00000000000..edec1184538
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/MemoryObjectImpl.h
@@ -0,0 +1,40 @@
+//
+// 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.
+//
+// MemoryObjectImpl.h: Implements the rx::MemoryObjectImpl class [EXT_external_objects]
+
+#ifndef LIBANGLE_RENDERER_MEMORYOBJECTIMPL_H_
+#define LIBANGLE_RENDERER_MEMORYOBJECTIMPL_H_
+
+#include "angle_gl.h"
+#include "common/PackedEnums.h"
+#include "common/angleutils.h"
+#include "libANGLE/Error.h"
+
+namespace gl
+{
+class Context;
+class MemoryObject;
+} // namespace gl
+
+namespace rx
+{
+
+class MemoryObjectImpl : angle::NonCopyable
+{
+ public:
+ virtual ~MemoryObjectImpl() {}
+
+ virtual void onDestroy(const gl::Context *context) = 0;
+
+ virtual angle::Result importFd(gl::Context *context,
+ GLuint64 size,
+ gl::HandleType handleType,
+ GLint fd) = 0;
+};
+
+} // namespace rx
+
+#endif // LIBANGLE_RENDERER_MEMORYOBJECTIMPL_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.cpp b/chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.cpp
new file mode 100644
index 00000000000..f828ef13587
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.cpp
@@ -0,0 +1,94 @@
+//
+// 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.
+//
+
+// ShaderImpl.cpp: Implementation methods of ShaderImpl
+
+#include "libANGLE/renderer/ShaderImpl.h"
+
+#include "libANGLE/Context.h"
+
+namespace rx
+{
+
+WaitableCompileEvent::WaitableCompileEvent(std::shared_ptr<angle::WaitableEvent> waitableEvent)
+ : mWaitableEvent(waitableEvent)
+{}
+
+WaitableCompileEvent::~WaitableCompileEvent()
+{
+ mWaitableEvent.reset();
+}
+
+void WaitableCompileEvent::wait()
+{
+ mWaitableEvent->wait();
+}
+
+bool WaitableCompileEvent::isReady()
+{
+ return mWaitableEvent->isReady();
+}
+
+const std::string &WaitableCompileEvent::getInfoLog()
+{
+ return mInfoLog;
+}
+
+class TranslateTask : public angle::Closure
+{
+ public:
+ TranslateTask(ShHandle handle, ShCompileOptions options, const std::string &source)
+ : mHandle(handle), mOptions(options), mSource(source), mResult(false)
+ {}
+
+ void operator()() override
+ {
+ const char *source = mSource.c_str();
+ mResult = sh::Compile(mHandle, &source, 1, mOptions);
+ }
+
+ bool getResult() { return mResult; }
+
+ ShHandle getHandle() { return mHandle; }
+
+ private:
+ ShHandle mHandle;
+ ShCompileOptions mOptions;
+ std::string mSource;
+ bool mResult;
+};
+
+class WaitableCompileEventImpl final : public WaitableCompileEvent
+{
+ public:
+ WaitableCompileEventImpl(std::shared_ptr<angle::WaitableEvent> waitableEvent,
+ std::shared_ptr<TranslateTask> translateTask)
+ : WaitableCompileEvent(waitableEvent), mTranslateTask(translateTask)
+ {}
+
+ bool getResult() override { return mTranslateTask->getResult(); }
+
+ bool postTranslate(std::string *infoLog) override { return true; }
+
+ private:
+ std::shared_ptr<TranslateTask> mTranslateTask;
+};
+
+std::shared_ptr<WaitableCompileEvent> ShaderImpl::compileImpl(
+ const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ const std::string &source,
+ ShCompileOptions compileOptions)
+{
+ auto workerThreadPool = context->getWorkerThreadPool();
+ auto translateTask =
+ std::make_shared<TranslateTask>(compilerInstance->getHandle(), compileOptions, source);
+
+ return std::make_shared<WaitableCompileEventImpl>(
+ angle::WorkerThreadPool::PostWorkerTask(workerThreadPool, translateTask), translateTask);
+}
+
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.h
index 854226544f1..7ec7ae76813 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/ShaderImpl.h
@@ -9,12 +9,42 @@
#ifndef LIBANGLE_RENDERER_SHADERIMPL_H_
#define LIBANGLE_RENDERER_SHADERIMPL_H_
+#include <functional>
+
#include "common/angleutils.h"
#include "libANGLE/Shader.h"
+#include "libANGLE/WorkerThread.h"
+
+namespace gl
+{
+class ShCompilerInstance;
+} // namespace gl
namespace rx
{
+using UpdateShaderStateFunctor = std::function<void(bool compiled, ShHandle handle)>;
+class WaitableCompileEvent : public angle::WaitableEvent
+{
+ public:
+ WaitableCompileEvent(std::shared_ptr<angle::WaitableEvent> waitableEvent);
+ ~WaitableCompileEvent() override;
+
+ void wait() override;
+
+ bool isReady() override;
+
+ virtual bool getResult() = 0;
+
+ virtual bool postTranslate(std::string *infoLog) = 0;
+
+ const std::string &getInfoLog();
+
+ protected:
+ std::shared_ptr<angle::WaitableEvent> mWaitableEvent;
+ std::string mInfoLog;
+};
+
class ShaderImpl : angle::NonCopyable
{
public:
@@ -23,22 +53,20 @@ class ShaderImpl : angle::NonCopyable
virtual void destroy() {}
- // Returns additional sh::Compile options.
- virtual ShCompileOptions prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string *sourcePath) = 0;
-
- // Uses the GL driver to compile the shader source in a worker thread.
- virtual void compileAsync(const std::string &source, std::string &infoLog) {}
-
- // Returns success for compiling on the driver. Returns success.
- virtual bool postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog) = 0;
+ virtual std::shared_ptr<WaitableCompileEvent> compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options) = 0;
virtual std::string getDebugInfo() const = 0;
const gl::ShaderState &getData() const { return mData; }
protected:
+ std::shared_ptr<WaitableCompileEvent> compileImpl(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ const std::string &source,
+ ShCompileOptions compileOptions);
+
const gl::ShaderState &mData;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h
index fe3aa054a4d..b2948989210 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl.h
@@ -32,6 +32,7 @@ struct Extents;
struct Offset;
struct Rectangle;
class Framebuffer;
+class MemoryObject;
struct PixelUnpackState;
class TextureState;
} // namespace gl
@@ -147,6 +148,14 @@ class TextureImpl : public FramebufferAttachmentObjectImpl, public angle::Subjec
const gl::Extents &size,
bool fixedSampleLocations) = 0;
+ virtual angle::Result setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset) = 0;
+
virtual angle::Result setEGLImageTarget(const gl::Context *context,
gl::TextureType type,
egl::Image *image) = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h
index 3f887551e35..0b7aa38f5bc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/TextureImpl_mock.h
@@ -92,6 +92,14 @@ class MockTextureImpl : public TextureImpl
MOCK_METHOD5(
setStorage,
angle::Result(const gl::Context *, gl::TextureType, size_t, GLenum, const gl::Extents &));
+ MOCK_METHOD7(setStorageExternalMemory,
+ angle::Result(const gl::Context *,
+ gl::TextureType,
+ size_t,
+ GLenum,
+ const gl::Extents &,
+ gl::MemoryObject *,
+ GLuint64));
MOCK_METHOD4(setImageExternal,
angle::Result(const gl::Context *,
gl::TextureType,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.h b/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.h
index 7769a4f7f33..988e590f3b2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.h
@@ -24,40 +24,34 @@ template <typename T,
size_t inputComponentCount,
size_t outputComponentCount,
uint32_t alphaDefaultValueBits>
-inline void CopyNativeVertexData(const uint8_t *input,
+void CopyNativeVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output);
+
+template <size_t inputComponentCount, size_t outputComponentCount>
+void Copy8SintTo16SintVertexData(const uint8_t *input,
size_t stride,
size_t count,
uint8_t *output);
-template <size_t inputComponentCount, size_t outputComponentCount>
-inline void Copy8SintTo16SintVertexData(const uint8_t *input,
- size_t stride,
- size_t count,
- uint8_t *output);
-
template <size_t componentCount>
-inline void Copy8SnormTo16SnormVertexData(const uint8_t *input,
- size_t stride,
- size_t count,
- uint8_t *output);
+void Copy8SnormTo16SnormVertexData(const uint8_t *input,
+ size_t stride,
+ size_t count,
+ uint8_t *output);
template <size_t inputComponentCount, size_t outputComponentCount>
-inline void Copy32FixedTo32FVertexData(const uint8_t *input,
- size_t stride,
- size_t count,
- uint8_t *output);
+void Copy32FixedTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output);
template <typename T, size_t inputComponentCount, size_t outputComponentCount, bool normalized>
-inline void CopyTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output);
+void CopyTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output);
template <bool isSigned, bool normalized, bool toFloat>
-inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input,
- size_t stride,
- size_t count,
- uint8_t *output);
+void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input,
+ size_t stride,
+ size_t count,
+ uint8_t *output);
} // namespace rx
-#include "copyvertex.inc"
+#include "copyvertex.inc.h"
#endif // LIBANGLE_RENDERER_COPYVERTEX_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.inc b/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.inc.h
index 7c3e73e59b7..16c82adcf22 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/copyvertex.inc.h
@@ -4,15 +4,18 @@
// found in the LICENSE file.
//
-// copyvertex.inc: Implementation of vertex buffer copying and conversion functions
+// copyvertex.inc.h: Implementation of vertex buffer copying and conversion functions
namespace rx
{
-template <typename T, size_t inputComponentCount, size_t outputComponentCount, uint32_t alphaDefaultValueBits>
+template <typename T,
+ size_t inputComponentCount,
+ size_t outputComponentCount,
+ uint32_t alphaDefaultValueBits>
inline void CopyNativeVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output)
{
- const size_t attribSize = sizeof(T)* inputComponentCount;
+ const size_t attribSize = sizeof(T) * inputComponentCount;
if (attribSize == stride && inputComponentCount == outputComponentCount)
{
@@ -24,21 +27,21 @@ inline void CopyNativeVertexData(const uint8_t *input, size_t stride, size_t cou
{
for (size_t i = 0; i < count; i++)
{
- const T *offsetInput = reinterpret_cast<const T*>(input + (i * stride));
- T *offsetOutput = reinterpret_cast<T*>(output) + i * outputComponentCount;
+ const T *offsetInput = reinterpret_cast<const T *>(input + (i * stride));
+ T *offsetOutput = reinterpret_cast<T *>(output) + i * outputComponentCount;
memcpy(offsetOutput, offsetInput, attribSize);
}
return;
}
- const T defaultAlphaValue = gl::bitCast<T>(alphaDefaultValueBits);
+ const T defaultAlphaValue = gl::bitCast<T>(alphaDefaultValueBits);
const size_t lastNonAlphaOutputComponent = std::min<size_t>(outputComponentCount, 3);
for (size_t i = 0; i < count; i++)
{
- const T *offsetInput = reinterpret_cast<const T*>(input + (i * stride));
- T *offsetOutput = reinterpret_cast<T*>(output) + i * outputComponentCount;
+ const T *offsetInput = reinterpret_cast<const T *>(input + (i * stride));
+ T *offsetOutput = reinterpret_cast<T *>(output) + i * outputComponentCount;
memcpy(offsetOutput, offsetInput, attribSize);
@@ -58,14 +61,17 @@ inline void CopyNativeVertexData(const uint8_t *input, size_t stride, size_t cou
}
template <size_t inputComponentCount, size_t outputComponentCount>
-inline void Copy8SintTo16SintVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output)
+inline void Copy8SintTo16SintVertexData(const uint8_t *input,
+ size_t stride,
+ size_t count,
+ uint8_t *output)
{
const size_t lastNonAlphaOutputComponent = std::min<size_t>(outputComponentCount, 3);
for (size_t i = 0; i < count; i++)
{
- const GLbyte *offsetInput = reinterpret_cast<const GLbyte*>(input + i * stride);
- GLshort *offsetOutput = reinterpret_cast<GLshort*>(output)+i * outputComponentCount;
+ const GLbyte *offsetInput = reinterpret_cast<const GLbyte *>(input + i * stride);
+ GLshort *offsetOutput = reinterpret_cast<GLshort *>(output) + i * outputComponentCount;
for (size_t j = 0; j < inputComponentCount; j++)
{
@@ -87,20 +93,25 @@ inline void Copy8SintTo16SintVertexData(const uint8_t *input, size_t stride, siz
}
template <size_t inputComponentCount, size_t outputComponentCount>
-inline void Copy8SnormTo16SnormVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output)
+inline void Copy8SnormTo16SnormVertexData(const uint8_t *input,
+ size_t stride,
+ size_t count,
+ uint8_t *output)
{
for (size_t i = 0; i < count; i++)
{
- const GLbyte *offsetInput = reinterpret_cast<const GLbyte*>(input + i * stride);
- GLshort *offsetOutput = reinterpret_cast<GLshort*>(output) + i * outputComponentCount;
+ const GLbyte *offsetInput = reinterpret_cast<const GLbyte *>(input + i * stride);
+ GLshort *offsetOutput = reinterpret_cast<GLshort *>(output) + i * outputComponentCount;
for (size_t j = 0; j < inputComponentCount; j++)
{
// The original GLbyte value ranges from -128 to +127 (INT8_MAX).
- // When converted to GLshort, the value must be scaled to between -32768 and +32767 (INT16_MAX).
+ // When converted to GLshort, the value must be scaled to between -32768 and +32767
+ // (INT16_MAX).
if (offsetInput[j] > 0)
{
- offsetOutput[j] = offsetInput[j] << 8 | offsetInput[j] << 1 | ((offsetInput[j] & 0x40) >> 6);
+ offsetOutput[j] =
+ offsetInput[j] << 8 | offsetInput[j] << 1 | ((offsetInput[j] & 0x40) >> 6);
}
else
{
@@ -123,7 +134,10 @@ inline void Copy8SnormTo16SnormVertexData(const uint8_t *input, size_t stride, s
}
template <size_t inputComponentCount, size_t outputComponentCount>
-inline void Copy32FixedTo32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output)
+inline void Copy32FixedTo32FVertexData(const uint8_t *input,
+ size_t stride,
+ size_t count,
+ uint8_t *output)
{
static const float divisor = 1.0f / (1 << 16);
@@ -153,7 +167,8 @@ inline void Copy32FixedTo32FVertexData(const uint8_t *input, size_t stride, size
// 4-component output formats would need special padding in the alpha channel.
static_assert(!(inputComponentCount < 4 && outputComponentCount == 4),
- "An inputComponentCount less than 4 and an outputComponentCount equal to 4 is not supported.");
+ "An inputComponentCount less than 4 and an outputComponentCount equal to 4 "
+ "is not supported.");
for (size_t j = inputComponentCount; j < outputComponentCount; j++)
{
@@ -169,8 +184,8 @@ inline void CopyTo32FVertexData(const uint8_t *input, size_t stride, size_t coun
for (size_t i = 0; i < count; i++)
{
- const T *offsetInput = reinterpret_cast<const T*>(input + (stride * i));
- float *offsetOutput = reinterpret_cast<float*>(output) + i * outputComponentCount;
+ const T *offsetInput = reinterpret_cast<const T *>(input + (stride * i));
+ float *offsetOutput = reinterpret_cast<float *>(output) + i * outputComponentCount;
for (size_t j = 0; j < inputComponentCount; j++)
{
@@ -179,22 +194,23 @@ inline void CopyTo32FVertexData(const uint8_t *input, size_t stride, size_t coun
if (NL::is_signed)
{
const float divisor = 1.0f / (2 * static_cast<float>(NL::max()) + 1);
- offsetOutput[j] = (2 * static_cast<float>(offsetInput[j]) + 1) * divisor;
+ offsetOutput[j] = (2 * static_cast<float>(offsetInput[j]) + 1) * divisor;
}
else
{
- offsetOutput[j] = static_cast<float>(offsetInput[j]) / NL::max();
+ offsetOutput[j] = static_cast<float>(offsetInput[j]) / NL::max();
}
}
else
{
- offsetOutput[j] = static_cast<float>(offsetInput[j]);
+ offsetOutput[j] = static_cast<float>(offsetInput[j]);
}
}
// This would require special padding.
static_assert(!(inputComponentCount < 4 && outputComponentCount == 4),
- "An inputComponentCount less than 4 and an outputComponentCount equal to 4 is not supported.");
+ "An inputComponentCount less than 4 and an outputComponentCount equal to 4 "
+ "is not supported.");
for (size_t j = inputComponentCount; j < outputComponentCount; j++)
{
@@ -209,19 +225,19 @@ namespace priv
template <bool isSigned, bool normalized, bool toFloat>
static inline void CopyPackedRGB(uint32_t data, uint8_t *output)
{
- const uint32_t rgbSignMask = 0x200; // 1 set at the 9 bit
- const uint32_t negativeMask = 0xFFFFFC00; // All bits from 10 to 31 set to 1
+ const uint32_t rgbSignMask = 0x200; // 1 set at the 9 bit
+ const uint32_t negativeMask = 0xFFFFFC00; // All bits from 10 to 31 set to 1
if (toFloat)
{
- GLfloat *floatOutput = reinterpret_cast<GLfloat*>(output);
+ GLfloat *floatOutput = reinterpret_cast<GLfloat *>(output);
if (isSigned)
{
GLfloat finalValue = 0;
if (data & rgbSignMask)
{
int negativeNumber = data | negativeMask;
- finalValue = static_cast<GLfloat>(negativeNumber);
+ finalValue = static_cast<GLfloat>(negativeNumber);
}
else
{
@@ -230,19 +246,19 @@ static inline void CopyPackedRGB(uint32_t data, uint8_t *output)
if (normalized)
{
- const int32_t maxValue = 0x1FF; // 1 set in bits 0 through 8
- const int32_t minValue = 0xFFFFFE01; // Inverse of maxValue
+ const int32_t maxValue = 0x1FF; // 1 set in bits 0 through 8
+ const int32_t minValue = 0xFFFFFE01; // Inverse of maxValue
// A 10-bit two's complement number has the possibility of being minValue - 1 but
- // OpenGL's normalization rules dictate that it should be clamped to minValue in this
- // case.
+ // OpenGL's normalization rules dictate that it should be clamped to minValue in
+ // this case.
if (finalValue < minValue)
{
finalValue = minValue;
}
const int32_t halfRange = (maxValue - minValue) >> 1;
- *floatOutput = ((finalValue - minValue) / halfRange) - 1.0f;
+ *floatOutput = ((finalValue - minValue) / halfRange) - 1.0f;
}
else
{
@@ -253,7 +269,7 @@ static inline void CopyPackedRGB(uint32_t data, uint8_t *output)
{
if (normalized)
{
- const uint32_t maxValue = 0x3FF; // 1 set in bits 0 through 9
+ const uint32_t maxValue = 0x3FF; // 1 set in bits 0 through 9
*floatOutput = static_cast<GLfloat>(data) / static_cast<GLfloat>(maxValue);
}
else
@@ -266,7 +282,7 @@ static inline void CopyPackedRGB(uint32_t data, uint8_t *output)
{
if (isSigned)
{
- GLshort *intOutput = reinterpret_cast<GLshort*>(output);
+ GLshort *intOutput = reinterpret_cast<GLshort *>(output);
if (data & rgbSignMask)
{
@@ -279,8 +295,8 @@ static inline void CopyPackedRGB(uint32_t data, uint8_t *output)
}
else
{
- GLushort *uintOutput = reinterpret_cast<GLushort*>(output);
- *uintOutput = static_cast<GLushort>(data);
+ GLushort *uintOutput = reinterpret_cast<GLushort *>(output);
+ *uintOutput = static_cast<GLushort>(data);
}
}
}
@@ -290,29 +306,47 @@ inline void CopyPackedAlpha(uint32_t data, uint8_t *output)
{
if (toFloat)
{
- GLfloat *floatOutput = reinterpret_cast<GLfloat*>(output);
+ GLfloat *floatOutput = reinterpret_cast<GLfloat *>(output);
if (isSigned)
{
if (normalized)
{
switch (data)
{
- case 0x0: *floatOutput = 0.0f; break;
- case 0x1: *floatOutput = 1.0f; break;
- case 0x2: *floatOutput = -1.0f; break;
- case 0x3: *floatOutput = -1.0f; break;
- default: UNREACHABLE();
+ case 0x0:
+ *floatOutput = 0.0f;
+ break;
+ case 0x1:
+ *floatOutput = 1.0f;
+ break;
+ case 0x2:
+ *floatOutput = -1.0f;
+ break;
+ case 0x3:
+ *floatOutput = -1.0f;
+ break;
+ default:
+ UNREACHABLE();
}
}
else
{
switch (data)
{
- case 0x0: *floatOutput = 0.0f; break;
- case 0x1: *floatOutput = 1.0f; break;
- case 0x2: *floatOutput = -2.0f; break;
- case 0x3: *floatOutput = -1.0f; break;
- default: UNREACHABLE();
+ case 0x0:
+ *floatOutput = 0.0f;
+ break;
+ case 0x1:
+ *floatOutput = 1.0f;
+ break;
+ case 0x2:
+ *floatOutput = -2.0f;
+ break;
+ case 0x3:
+ *floatOutput = -1.0f;
+ break;
+ default:
+ UNREACHABLE();
}
}
}
@@ -322,22 +356,40 @@ inline void CopyPackedAlpha(uint32_t data, uint8_t *output)
{
switch (data)
{
- case 0x0: *floatOutput = 0.0f / 3.0f; break;
- case 0x1: *floatOutput = 1.0f / 3.0f; break;
- case 0x2: *floatOutput = 2.0f / 3.0f; break;
- case 0x3: *floatOutput = 3.0f / 3.0f; break;
- default: UNREACHABLE();
+ case 0x0:
+ *floatOutput = 0.0f / 3.0f;
+ break;
+ case 0x1:
+ *floatOutput = 1.0f / 3.0f;
+ break;
+ case 0x2:
+ *floatOutput = 2.0f / 3.0f;
+ break;
+ case 0x3:
+ *floatOutput = 3.0f / 3.0f;
+ break;
+ default:
+ UNREACHABLE();
}
}
else
{
switch (data)
{
- case 0x0: *floatOutput = 0.0f; break;
- case 0x1: *floatOutput = 1.0f; break;
- case 0x2: *floatOutput = 2.0f; break;
- case 0x3: *floatOutput = 3.0f; break;
- default: UNREACHABLE();
+ case 0x0:
+ *floatOutput = 0.0f;
+ break;
+ case 0x1:
+ *floatOutput = 1.0f;
+ break;
+ case 0x2:
+ *floatOutput = 2.0f;
+ break;
+ case 0x3:
+ *floatOutput = 3.0f;
+ break;
+ default:
+ UNREACHABLE();
}
}
}
@@ -346,57 +398,82 @@ inline void CopyPackedAlpha(uint32_t data, uint8_t *output)
{
if (isSigned)
{
- GLshort *intOutput = reinterpret_cast<GLshort*>(output);
+ GLshort *intOutput = reinterpret_cast<GLshort *>(output);
switch (data)
{
- case 0x0: *intOutput = 0; break;
- case 0x1: *intOutput = 1; break;
- case 0x2: *intOutput = -2; break;
- case 0x3: *intOutput = -1; break;
- default: UNREACHABLE();
+ case 0x0:
+ *intOutput = 0;
+ break;
+ case 0x1:
+ *intOutput = 1;
+ break;
+ case 0x2:
+ *intOutput = -2;
+ break;
+ case 0x3:
+ *intOutput = -1;
+ break;
+ default:
+ UNREACHABLE();
}
}
else
{
- GLushort *uintOutput = reinterpret_cast<GLushort*>(output);
+ GLushort *uintOutput = reinterpret_cast<GLushort *>(output);
switch (data)
{
- case 0x0: *uintOutput = 0; break;
- case 0x1: *uintOutput = 1; break;
- case 0x2: *uintOutput = 2; break;
- case 0x3: *uintOutput = 3; break;
- default: UNREACHABLE();
+ case 0x0:
+ *uintOutput = 0;
+ break;
+ case 0x1:
+ *uintOutput = 1;
+ break;
+ case 0x2:
+ *uintOutput = 2;
+ break;
+ case 0x3:
+ *uintOutput = 3;
+ break;
+ default:
+ UNREACHABLE();
}
}
}
}
-}
+} // namespace priv
template <bool isSigned, bool normalized, bool toFloat>
-inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input, size_t stride, size_t count, uint8_t *output)
+inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input,
+ size_t stride,
+ size_t count,
+ uint8_t *output)
{
const size_t outputComponentSize = toFloat ? 4 : 2;
- const size_t componentCount = 4;
+ const size_t componentCount = 4;
- const uint32_t rgbMask = 0x3FF; // 1 set in bits 0 through 9
- const size_t redShift = 0; // red is bits 0 through 9
- const size_t greenShift = 10; // green is bits 10 through 19
- const size_t blueShift = 20; // blue is bits 20 through 29
+ const uint32_t rgbMask = 0x3FF; // 1 set in bits 0 through 9
+ const size_t redShift = 0; // red is bits 0 through 9
+ const size_t greenShift = 10; // green is bits 10 through 19
+ const size_t blueShift = 20; // blue is bits 20 through 29
- const uint32_t alphaMask = 0x3; // 1 set in bits 0 and 1
- const size_t alphaShift = 30; // Alpha is the 30 and 31 bits
+ const uint32_t alphaMask = 0x3; // 1 set in bits 0 and 1
+ const size_t alphaShift = 30; // Alpha is the 30 and 31 bits
for (size_t i = 0; i < count; i++)
{
- GLuint packedValue = *reinterpret_cast<const GLuint*>(input + (i * stride));
+ GLuint packedValue = *reinterpret_cast<const GLuint *>(input + (i * stride));
uint8_t *offsetOutput = output + (i * outputComponentSize * componentCount);
- priv::CopyPackedRGB<isSigned, normalized, toFloat>( (packedValue >> redShift) & rgbMask, offsetOutput + (0 * outputComponentSize));
- priv::CopyPackedRGB<isSigned, normalized, toFloat>( (packedValue >> greenShift) & rgbMask, offsetOutput + (1 * outputComponentSize));
- priv::CopyPackedRGB<isSigned, normalized, toFloat>( (packedValue >> blueShift) & rgbMask, offsetOutput + (2 * outputComponentSize));
- priv::CopyPackedAlpha<isSigned, normalized, toFloat>((packedValue >> alphaShift) & alphaMask, offsetOutput + (3 * outputComponentSize));
+ priv::CopyPackedRGB<isSigned, normalized, toFloat>(
+ (packedValue >> redShift) & rgbMask, offsetOutput + (0 * outputComponentSize));
+ priv::CopyPackedRGB<isSigned, normalized, toFloat>(
+ (packedValue >> greenShift) & rgbMask, offsetOutput + (1 * outputComponentSize));
+ priv::CopyPackedRGB<isSigned, normalized, toFloat>(
+ (packedValue >> blueShift) & rgbMask, offsetOutput + (2 * outputComponentSize));
+ priv::CopyPackedAlpha<isSigned, normalized, toFloat>(
+ (packedValue >> alphaShift) & alphaMask, offsetOutput + (3 * outputComponentSize));
}
}
-}
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp
index dde69971ec5..2a67f31cf54 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/BufferD3D.cpp
@@ -54,16 +54,16 @@ void BufferD3D::updateD3DBufferUsage(const gl::Context *context, gl::BufferUsage
case gl::BufferUsage::StaticCopy:
case gl::BufferUsage::StaticDraw:
case gl::BufferUsage::StaticRead:
- mUsage = D3DBufferUsage::STATIC;
- initializeStaticData(context);
- break;
-
case gl::BufferUsage::DynamicCopy:
- case gl::BufferUsage::DynamicDraw:
case gl::BufferUsage::DynamicRead:
case gl::BufferUsage::StreamCopy:
case gl::BufferUsage::StreamDraw:
case gl::BufferUsage::StreamRead:
+ mUsage = D3DBufferUsage::STATIC;
+ initializeStaticData(context);
+ break;
+
+ case gl::BufferUsage::DynamicDraw:
mUsage = D3DBufferUsage::DYNAMIC;
break;
default:
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
index d47942c2b41..51f766b5f84 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/DynamicHLSL.cpp
@@ -244,6 +244,12 @@ std::string DynamicHLSL::generateVertexShaderForInputLayout(
initStream << "input." << DecorateVariable(shaderAttribute.name);
}
+ if (shaderAttribute.name == "gl_VertexID")
+ {
+ // dx_VertexID contains the firstVertex offset
+ initStream << " + dx_VertexID";
+ }
+
initStream << ";\n";
inputIndex += VariableRowCount(TransposeMatrixType(shaderAttribute.type));
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index df2f0217b58..c7b7e8256b6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -513,6 +513,11 @@ bool ProgramD3DMetadata::hasANGLEMultiviewEnabled() const
return mAttachedShaders[gl::ShaderType::Vertex]->hasANGLEMultiviewEnabled();
}
+bool ProgramD3DMetadata::usesVertexID() const
+{
+ return mAttachedShaders[gl::ShaderType::Vertex]->usesVertexID();
+}
+
bool ProgramD3DMetadata::usesViewID() const
{
return mAttachedShaders[gl::ShaderType::Fragment]->usesViewID();
@@ -950,7 +955,7 @@ class ProgramD3D::LoadBinaryLinkEvent final : public LinkEvent
gl::BinaryInputStream *stream,
gl::InfoLog &infoLog)
: mTask(std::make_shared<ProgramD3D::LoadBinaryTask>(context, program, stream, infoLog)),
- mWaitableEvent(workerPool->postWorkerTask(mTask))
+ mWaitableEvent(angle::WorkerThreadPool::PostWorkerTask(workerPool, mTask))
{}
angle::Result wait(const gl::Context *context) override
@@ -1148,6 +1153,7 @@ std::unique_ptr<rx::LinkEvent> ProgramD3D::load(const gl::Context *context,
stream->readBool(&mUsesFragDepth);
stream->readBool(&mHasANGLEMultiviewEnabled);
+ stream->readBool(&mUsesVertexID);
stream->readBool(&mUsesViewID);
stream->readBool(&mUsesPointSize);
stream->readBool(&mUsesFlatInterpolation);
@@ -1429,6 +1435,7 @@ void ProgramD3D::save(const gl::Context *context, gl::BinaryOutputStream *stream
stream->writeInt(mUsesFragDepth);
stream->writeInt(mHasANGLEMultiviewEnabled);
+ stream->writeInt(mUsesVertexID);
stream->writeInt(mUsesViewID);
stream->writeInt(mUsesPointSize);
stream->writeInt(mUsesFlatInterpolation);
@@ -1751,6 +1758,21 @@ class ProgramD3D::GetGeometryExecutableTask : public ProgramD3D::GetExecutableTa
const gl::State &mState;
};
+class ProgramD3D::GetComputeExecutableTask : public ProgramD3D::GetExecutableTask
+{
+ public:
+ GetComputeExecutableTask(ProgramD3D *program) : GetExecutableTask(program) {}
+ angle::Result run() override
+ {
+ mProgram->updateCachedImage2DBindLayoutFromComputeShader();
+ ShaderExecutableD3D *computeExecutable = nullptr;
+ ANGLE_TRY(mProgram->getComputeExecutableForImage2DBindLayout(this, &computeExecutable,
+ &mInfoLog));
+
+ return computeExecutable ? angle::Result::Continue : angle::Result::Incomplete;
+ }
+};
+
// The LinkEvent implementation for linking a rendering(VS, FS, GS) program.
class ProgramD3D::GraphicsProgramLinkEvent final : public LinkEvent
{
@@ -1764,14 +1786,15 @@ class ProgramD3D::GraphicsProgramLinkEvent final : public LinkEvent
const ShaderD3D *vertexShader,
const ShaderD3D *fragmentShader)
: mInfoLog(infoLog),
- mWorkerPool(workerPool),
mVertexTask(vertexTask),
mPixelTask(pixelTask),
mGeometryTask(geometryTask),
- mWaitEvents(
- {{std::shared_ptr<WaitableEvent>(workerPool->postWorkerTask(mVertexTask)),
- std::shared_ptr<WaitableEvent>(workerPool->postWorkerTask(mPixelTask)),
- std::shared_ptr<WaitableEvent>(workerPool->postWorkerTask(mGeometryTask))}}),
+ mWaitEvents({{std::shared_ptr<WaitableEvent>(
+ angle::WorkerThreadPool::PostWorkerTask(workerPool, mVertexTask)),
+ std::shared_ptr<WaitableEvent>(
+ angle::WorkerThreadPool::PostWorkerTask(workerPool, mPixelTask)),
+ std::shared_ptr<WaitableEvent>(
+ angle::WorkerThreadPool::PostWorkerTask(workerPool, mGeometryTask))}}),
mUseGS(useGS),
mVertexShader(vertexShader),
mFragmentShader(fragmentShader)
@@ -1785,9 +1808,9 @@ class ProgramD3D::GraphicsProgramLinkEvent final : public LinkEvent
ANGLE_TRY(checkTask(context, mPixelTask.get()));
ANGLE_TRY(checkTask(context, mGeometryTask.get()));
- if (mVertexTask.get()->getResult() == angle::Result::Incomplete ||
- mPixelTask.get()->getResult() == angle::Result::Incomplete ||
- mGeometryTask.get()->getResult() == angle::Result::Incomplete)
+ if (mVertexTask->getResult() == angle::Result::Incomplete ||
+ mPixelTask->getResult() == angle::Result::Incomplete ||
+ mGeometryTask->getResult() == angle::Result::Incomplete)
{
return angle::Result::Incomplete;
}
@@ -1856,7 +1879,6 @@ class ProgramD3D::GraphicsProgramLinkEvent final : public LinkEvent
}
gl::InfoLog &mInfoLog;
- std::shared_ptr<WorkerThreadPool> mWorkerPool;
std::shared_ptr<ProgramD3D::GetVertexExecutableTask> mVertexTask;
std::shared_ptr<ProgramD3D::GetPixelExecutableTask> mPixelTask;
std::shared_ptr<ProgramD3D::GetGeometryExecutableTask> mGeometryTask;
@@ -1866,6 +1888,36 @@ class ProgramD3D::GraphicsProgramLinkEvent final : public LinkEvent
const ShaderD3D *mFragmentShader;
};
+// The LinkEvent implementation for linking a computing program.
+class ProgramD3D::ComputeProgramLinkEvent final : public LinkEvent
+{
+ public:
+ ComputeProgramLinkEvent(gl::InfoLog &infoLog,
+ std::shared_ptr<ProgramD3D::GetComputeExecutableTask> computeTask,
+ std::shared_ptr<WaitableEvent> event)
+ : mInfoLog(infoLog), mComputeTask(computeTask), mWaitEvent(event)
+ {}
+
+ bool isLinking() override { return !mWaitEvent->isReady(); }
+
+ angle::Result wait(const gl::Context *context) override
+ {
+ mWaitEvent->wait();
+
+ angle::Result result = mComputeTask->getResult();
+ if (result != angle::Result::Continue)
+ {
+ mInfoLog << "Failed to create D3D compute shader.";
+ }
+ return result;
+ }
+
+ private:
+ gl::InfoLog &mInfoLog;
+ std::shared_ptr<ProgramD3D::GetComputeExecutableTask> mComputeTask;
+ std::shared_ptr<WaitableEvent> mWaitEvent;
+};
+
std::unique_ptr<LinkEvent> ProgramD3D::compileProgramExecutables(const gl::Context *context,
gl::InfoLog &infoLog)
{
@@ -1890,6 +1942,36 @@ std::unique_ptr<LinkEvent> ProgramD3D::compileProgramExecutables(const gl::Conte
vertexShaderD3D, fragmentShaderD3D);
}
+std::unique_ptr<LinkEvent> ProgramD3D::compileComputeExecutable(const gl::Context *context,
+ gl::InfoLog &infoLog)
+{
+ // Ensure the compiler is initialized to avoid race conditions.
+ angle::Result result = mRenderer->ensureHLSLCompilerInitialized(GetImplAs<ContextD3D>(context));
+ if (result != angle::Result::Continue)
+ {
+ return std::make_unique<LinkEventDone>(result);
+ }
+ auto computeTask = std::make_shared<GetComputeExecutableTask>(this);
+
+ std::shared_ptr<WaitableEvent> waitableEvent;
+
+ // TODO(jie.a.chen@intel.com): Fix the flaky bug.
+ // http://anglebug.com/3349
+ bool compileInParallel = false;
+ if (!compileInParallel)
+ {
+ (*computeTask)();
+ waitableEvent = std::make_shared<WaitableEventDone>();
+ }
+ else
+ {
+ waitableEvent =
+ WorkerThreadPool::PostWorkerTask(context->getWorkerThreadPool(), computeTask);
+ }
+
+ return std::make_unique<ComputeProgramLinkEvent>(infoLog, computeTask, waitableEvent);
+}
+
angle::Result ProgramD3D::getComputeExecutableForImage2DBindLayout(
d3d::Context *context,
ShaderExecutableD3D **outExecutable,
@@ -1932,19 +2014,6 @@ angle::Result ProgramD3D::getComputeExecutableForImage2DBindLayout(
return angle::Result::Continue;
}
-angle::Result ProgramD3D::compileComputeExecutable(d3d::Context *context, gl::InfoLog &infoLog)
-{
- // Ensure the compiler is initialized to avoid race conditions.
- ANGLE_TRY(mRenderer->ensureHLSLCompilerInitialized(context));
-
- updateCachedImage2DBindLayoutFromComputeShader();
-
- ShaderExecutableD3D *computeExecutable = nullptr;
- ANGLE_TRY(getComputeExecutableForImage2DBindLayout(context, &computeExecutable, &infoLog));
-
- return computeExecutable ? angle::Result::Continue : angle::Result::Incomplete;
-}
-
std::unique_ptr<LinkEvent> ProgramD3D::link(const gl::Context *context,
const gl::ProgramLinkedResources &resources,
gl::InfoLog &infoLog)
@@ -1975,12 +2044,7 @@ std::unique_ptr<LinkEvent> ProgramD3D::link(const gl::Context *context,
defineUniformsAndAssignRegisters();
- angle::Result result = compileComputeExecutable(GetImplAs<ContextD3D>(context), infoLog);
- if (result != angle::Result::Continue)
- {
- infoLog << "Failed to create D3D compute shader.";
- }
- return std::make_unique<LinkEventDone>(result);
+ return compileComputeExecutable(context, infoLog);
}
else
{
@@ -2018,6 +2082,7 @@ std::unique_ptr<LinkEvent> ProgramD3D::link(const gl::Context *context,
mUsesPointSize = shadersD3D[gl::ShaderType::Vertex]->usesPointSize();
mDynamicHLSL->getPixelShaderOutputKey(data, mState, metadata, &mPixelShaderKey);
mUsesFragDepth = metadata.usesFragDepth();
+ mUsesVertexID = metadata.usesVertexID();
mUsesViewID = metadata.usesViewID();
mHasANGLEMultiviewEnabled = metadata.hasANGLEMultiviewEnabled();
@@ -2866,6 +2931,7 @@ void ProgramD3D::reset()
mUsesFragDepth = false;
mHasANGLEMultiviewEnabled = false;
+ mUsesVertexID = false;
mUsesViewID = false;
mPixelShaderKey.clear();
mUsesPointSize = false;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
index 46b405c3ddb..6a0cdd260a0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ProgramD3D.h
@@ -129,6 +129,7 @@ class ProgramD3DMetadata final : angle::NonCopyable
bool usesInsertedPointCoordValue() const;
bool usesViewScale() const;
bool hasANGLEMultiviewEnabled() const;
+ bool usesVertexID() const;
bool usesViewID() const;
bool canSelectViewInVertexShader() const;
bool addsPointCoordToVertexShader() const;
@@ -324,13 +325,17 @@ class ProgramD3D : public ProgramImpl
bool readonly);
bool hasNamedUniform(const std::string &name);
+ bool usesVertexID() const { return mUsesVertexID; }
+
private:
// These forward-declared tasks are used for multi-thread shader compiles.
class GetExecutableTask;
class GetVertexExecutableTask;
class GetPixelExecutableTask;
class GetGeometryExecutableTask;
+ class GetComputeExecutableTask;
class GraphicsProgramLinkEvent;
+ class ComputeProgramLinkEvent;
class LoadBinaryTask;
class LoadBinaryLinkEvent;
@@ -472,7 +477,8 @@ class ProgramD3D : public ProgramImpl
std::unique_ptr<LinkEvent> compileProgramExecutables(const gl::Context *context,
gl::InfoLog &infoLog);
- angle::Result compileComputeExecutable(d3d::Context *context, gl::InfoLog &infoLog);
+ std::unique_ptr<LinkEvent> compileComputeExecutable(const gl::Context *context,
+ gl::InfoLog &infoLog);
angle::Result loadBinaryShaderExecutables(const gl::Context *context,
gl::BinaryInputStream *stream,
@@ -512,6 +518,7 @@ class ProgramD3D : public ProgramImpl
bool mUsesFragDepth;
bool mHasANGLEMultiviewEnabled;
+ bool mUsesVertexID;
bool mUsesViewID;
std::vector<PixelShaderOutputVariable> mPixelShaderKey;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
index 2a8d0221b3a..dc3f063bdf3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.cpp
@@ -72,7 +72,7 @@ bool RendererD3D::skipDraw(const gl::State &glState, gl::PrimitiveMode drawMode)
return false;
}
-GLenum RendererD3D::getResetStatus()
+gl::GraphicsResetStatus RendererD3D::getResetStatus()
{
if (!mDeviceLost)
{
@@ -80,17 +80,17 @@ GLenum RendererD3D::getResetStatus()
{
mDeviceLost = true;
notifyDeviceLost();
- return GL_UNKNOWN_CONTEXT_RESET_EXT;
+ return gl::GraphicsResetStatus::UnknownContextReset;
}
- return GL_NO_ERROR;
+ return gl::GraphicsResetStatus::NoError;
}
if (testDeviceResettable())
{
- return GL_NO_ERROR;
+ return gl::GraphicsResetStatus::NoError;
}
- return GL_UNKNOWN_CONTEXT_RESET_EXT;
+ return gl::GraphicsResetStatus::UnknownContextReset;
}
void RendererD3D::notifyDeviceLost()
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h
index 18c7b8e6e5e..8a108c22ad5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/RendererD3D.h
@@ -343,7 +343,7 @@ class RendererD3D : public BufferFactoryD3D
const gl::Box &destArea) = 0;
// Device lost
- GLenum getResetStatus();
+ gl::GraphicsResetStatus getResetStatus();
void notifyDeviceLost();
virtual bool resetDevice() = 0;
virtual bool testDeviceLost() = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp
index 5a301b91fa9..8a2b81bdbba 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.cpp
@@ -11,6 +11,7 @@
#include "common/utilities.h"
#include "libANGLE/Caps.h"
#include "libANGLE/Compiler.h"
+#include "libANGLE/Context.h"
#include "libANGLE/Shader.h"
#include "libANGLE/features.h"
#include "libANGLE/renderer/d3d/ProgramD3D.h"
@@ -19,6 +20,71 @@
namespace rx
{
+class TranslateTaskD3D : public angle::Closure
+{
+ public:
+ TranslateTaskD3D(ShHandle handle,
+ ShCompileOptions options,
+ const std::string &source,
+ const std::string &sourcePath)
+ : mHandle(handle),
+ mOptions(options),
+ mSource(source),
+ mSourcePath(sourcePath),
+ mResult(false)
+ {}
+
+ void operator()() override
+ {
+ std::vector<const char *> srcStrings;
+ if (!mSourcePath.empty())
+ {
+ srcStrings.push_back(mSourcePath.c_str());
+ }
+ srcStrings.push_back(mSource.c_str());
+
+ mResult = sh::Compile(mHandle, &srcStrings[0], srcStrings.size(), mOptions);
+ }
+
+ bool getResult() { return mResult; }
+
+ private:
+ ShHandle mHandle;
+ ShCompileOptions mOptions;
+ std::string mSource;
+ std::string mSourcePath;
+ bool mResult;
+};
+
+using PostTranslateFunctor =
+ std::function<bool(gl::ShCompilerInstance *compiler, std::string *infoLog)>;
+
+class WaitableCompileEventD3D final : public WaitableCompileEvent
+{
+ public:
+ WaitableCompileEventD3D(std::shared_ptr<angle::WaitableEvent> waitableEvent,
+ gl::ShCompilerInstance *compilerInstance,
+ PostTranslateFunctor &&postTranslateFunctor,
+ std::shared_ptr<TranslateTaskD3D> translateTask)
+ : WaitableCompileEvent(waitableEvent),
+ mCompilerInstance(compilerInstance),
+ mPostTranslateFunctor(std::move(postTranslateFunctor)),
+ mTranslateTask(translateTask)
+ {}
+
+ bool getResult() override { return mTranslateTask->getResult(); }
+
+ bool postTranslate(std::string *infoLog) override
+ {
+ return mPostTranslateFunctor(mCompilerInstance, infoLog);
+ }
+
+ private:
+ gl::ShCompilerInstance *mCompilerInstance;
+ PostTranslateFunctor mPostTranslateFunctor;
+ std::shared_ptr<TranslateTaskD3D> mTranslateTask;
+};
+
ShaderD3D::ShaderD3D(const gl::ShaderState &data,
const angle::WorkaroundsD3D &workarounds,
const gl::Extensions &extensions)
@@ -52,7 +118,11 @@ ShaderD3D::ShaderD3D(const gl::ShaderState &data,
{
mAdditionalOptions |= SH_SKIP_D3D_CONSTANT_REGISTER_ZERO;
}
- if (extensions.multiview)
+ if (workarounds.forceAtomicValueResolution)
+ {
+ mAdditionalOptions |= SH_FORCE_ATOMIC_VALUE_RESOLUTION;
+ }
+ if (extensions.multiview2)
{
mAdditionalOptions |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW;
}
@@ -87,6 +157,7 @@ void ShaderD3D::uncompile()
mUsesDepthRange = false;
mUsesFragDepth = false;
mHasANGLEMultiviewEnabled = false;
+ mUsesVertexID = false;
mUsesViewID = false;
mUsesDiscardRewriting = false;
mUsesNestedBreak = false;
@@ -154,36 +225,6 @@ bool ShaderD3D::useImage2DFunction(const std::string &functionName) const
return mUsedImage2DFunctionNames.find(functionName) != mUsedImage2DFunctionNames.end();
}
-ShCompileOptions ShaderD3D::prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *shaderSourceStream,
- std::string *sourcePath)
-{
- uncompile();
-
- ShCompileOptions additionalOptions = 0;
-
- const std::string &source = mData.getSource();
-
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- if (gl::DebugAnnotationsActive())
- {
- *sourcePath = getTempPath();
- writeFile(sourcePath->c_str(), source.c_str(), source.length());
- additionalOptions |= SH_LINE_DIRECTIVES | SH_SOURCE_PATH;
- }
-#endif
-
- additionalOptions |= mAdditionalOptions;
-
- *shaderSourceStream << source;
- return additionalOptions;
-}
-
-bool ShaderD3D::hasUniform(const std::string &name) const
-{
- return mUniformRegisterMap.find(name) != mUniformRegisterMap.end();
-}
-
const std::map<std::string, unsigned int> &GetUniformRegisterMap(
const std::map<std::string, unsigned int> *uniformRegisterMap)
{
@@ -198,71 +239,110 @@ const std::set<std::string> &GetUsedImage2DFunctionNames(
return *usedImage2DFunctionNames;
}
-bool ShaderD3D::postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog)
+std::shared_ptr<WaitableCompileEvent> ShaderD3D::compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options)
{
- // TODO(jmadill): We shouldn't need to cache this.
- mCompilerOutputType = compiler->getShaderOutputType();
-
- const std::string &translatedSource = mData.getTranslatedSource();
-
- mUsesMultipleRenderTargets = translatedSource.find("GL_USES_MRT") != std::string::npos;
- mUsesFragColor = translatedSource.find("GL_USES_FRAG_COLOR") != std::string::npos;
- mUsesFragData = translatedSource.find("GL_USES_FRAG_DATA") != std::string::npos;
- mUsesFragCoord = translatedSource.find("GL_USES_FRAG_COORD") != std::string::npos;
- mUsesFrontFacing = translatedSource.find("GL_USES_FRONT_FACING") != std::string::npos;
- mUsesPointSize = translatedSource.find("GL_USES_POINT_SIZE") != std::string::npos;
- mUsesPointCoord = translatedSource.find("GL_USES_POINT_COORD") != std::string::npos;
- mUsesDepthRange = translatedSource.find("GL_USES_DEPTH_RANGE") != std::string::npos;
- mUsesFragDepth = translatedSource.find("GL_USES_FRAG_DEPTH") != std::string::npos;
- mHasANGLEMultiviewEnabled =
- translatedSource.find("GL_ANGLE_MULTIVIEW_ENABLED") != std::string::npos;
- mUsesViewID = translatedSource.find("GL_USES_VIEW_ID") != std::string::npos;
- mUsesDiscardRewriting =
- translatedSource.find("ANGLE_USES_DISCARD_REWRITING") != std::string::npos;
- mUsesNestedBreak = translatedSource.find("ANGLE_USES_NESTED_BREAK") != std::string::npos;
- mRequiresIEEEStrictCompiling =
- translatedSource.find("ANGLE_REQUIRES_IEEE_STRICT_COMPILING") != std::string::npos;
-
- ShHandle compilerHandle = compiler->getHandle();
-
- mUniformRegisterMap = GetUniformRegisterMap(sh::GetUniformRegisterMap(compilerHandle));
- mReadonlyImage2DRegisterIndex = sh::GetReadonlyImage2DRegisterIndex(compilerHandle);
- mImage2DRegisterIndex = sh::GetImage2DRegisterIndex(compilerHandle);
- mUsedImage2DFunctionNames =
- GetUsedImage2DFunctionNames(sh::GetUsedImage2DFunctionNames(compilerHandle));
-
- for (const sh::InterfaceBlock &interfaceBlock : mData.getUniformBlocks())
- {
- if (interfaceBlock.active)
- {
- unsigned int index = static_cast<unsigned int>(-1);
- bool blockRegisterResult =
- sh::GetUniformBlockRegister(compilerHandle, interfaceBlock.name, &index);
- ASSERT(blockRegisterResult);
+ std::string sourcePath;
+ uncompile();
- mUniformBlockRegisterMap[interfaceBlock.name] = index;
- }
- }
+ ShCompileOptions additionalOptions = 0;
+
+ const std::string &source = mData.getSource();
- for (const sh::InterfaceBlock &interfaceBlock : mData.getShaderStorageBlocks())
+#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
+ if (gl::DebugAnnotationsActive())
{
- if (interfaceBlock.active)
+ sourcePath = getTempPath();
+ writeFile(sourcePath.c_str(), source.c_str(), source.length());
+ additionalOptions |= SH_LINE_DIRECTIVES | SH_SOURCE_PATH;
+ }
+#endif
+
+ additionalOptions |= mAdditionalOptions;
+
+ options |= additionalOptions;
+
+ auto postTranslateFunctor = [this](gl::ShCompilerInstance *compiler, std::string *infoLog) {
+ // TODO(jmadill): We shouldn't need to cache this.
+ mCompilerOutputType = compiler->getShaderOutputType();
+
+ const std::string &translatedSource = mData.getTranslatedSource();
+
+ mUsesMultipleRenderTargets = translatedSource.find("GL_USES_MRT") != std::string::npos;
+ mUsesFragColor = translatedSource.find("GL_USES_FRAG_COLOR") != std::string::npos;
+ mUsesFragData = translatedSource.find("GL_USES_FRAG_DATA") != std::string::npos;
+ mUsesFragCoord = translatedSource.find("GL_USES_FRAG_COORD") != std::string::npos;
+ mUsesFrontFacing = translatedSource.find("GL_USES_FRONT_FACING") != std::string::npos;
+ mUsesPointSize = translatedSource.find("GL_USES_POINT_SIZE") != std::string::npos;
+ mUsesPointCoord = translatedSource.find("GL_USES_POINT_COORD") != std::string::npos;
+ mUsesDepthRange = translatedSource.find("GL_USES_DEPTH_RANGE") != std::string::npos;
+ mUsesFragDepth = translatedSource.find("GL_USES_FRAG_DEPTH") != std::string::npos;
+ mHasANGLEMultiviewEnabled =
+ translatedSource.find("GL_ANGLE_MULTIVIEW_ENABLED") != std::string::npos;
+ mUsesVertexID = translatedSource.find("GL_USES_VERTEX_ID") != std::string::npos;
+ mUsesViewID = translatedSource.find("GL_USES_VIEW_ID") != std::string::npos;
+ mUsesDiscardRewriting =
+ translatedSource.find("ANGLE_USES_DISCARD_REWRITING") != std::string::npos;
+ mUsesNestedBreak = translatedSource.find("ANGLE_USES_NESTED_BREAK") != std::string::npos;
+ mRequiresIEEEStrictCompiling =
+ translatedSource.find("ANGLE_REQUIRES_IEEE_STRICT_COMPILING") != std::string::npos;
+
+ ShHandle compilerHandle = compiler->getHandle();
+
+ mUniformRegisterMap = GetUniformRegisterMap(sh::GetUniformRegisterMap(compilerHandle));
+ mReadonlyImage2DRegisterIndex = sh::GetReadonlyImage2DRegisterIndex(compilerHandle);
+ mImage2DRegisterIndex = sh::GetImage2DRegisterIndex(compilerHandle);
+ mUsedImage2DFunctionNames =
+ GetUsedImage2DFunctionNames(sh::GetUsedImage2DFunctionNames(compilerHandle));
+
+ for (const sh::InterfaceBlock &interfaceBlock : mData.getUniformBlocks())
{
- unsigned int index = static_cast<unsigned int>(-1);
- bool blockRegisterResult =
- sh::GetShaderStorageBlockRegister(compilerHandle, interfaceBlock.name, &index);
- ASSERT(blockRegisterResult);
+ if (interfaceBlock.active)
+ {
+ unsigned int index = static_cast<unsigned int>(-1);
+ bool blockRegisterResult =
+ sh::GetUniformBlockRegister(compilerHandle, interfaceBlock.name, &index);
+ ASSERT(blockRegisterResult);
+
+ mUniformBlockRegisterMap[interfaceBlock.name] = index;
+ }
+ }
- mShaderStorageBlockRegisterMap[interfaceBlock.name] = index;
+ for (const sh::InterfaceBlock &interfaceBlock : mData.getShaderStorageBlocks())
+ {
+ if (interfaceBlock.active)
+ {
+ unsigned int index = static_cast<unsigned int>(-1);
+ bool blockRegisterResult =
+ sh::GetShaderStorageBlockRegister(compilerHandle, interfaceBlock.name, &index);
+ ASSERT(blockRegisterResult);
+
+ mShaderStorageBlockRegisterMap[interfaceBlock.name] = index;
+ }
}
- }
- mDebugInfo +=
- std::string("// ") + gl::GetShaderTypeString(mData.getShaderType()) + " SHADER BEGIN\n";
- mDebugInfo += "\n// GLSL BEGIN\n\n" + mData.getSource() + "\n\n// GLSL END\n\n\n";
- mDebugInfo += "// INITIAL HLSL BEGIN\n\n" + translatedSource + "\n// INITIAL HLSL END\n\n\n";
- // Successive steps will append more info
- return true;
+ mDebugInfo +=
+ std::string("// ") + gl::GetShaderTypeString(mData.getShaderType()) + " SHADER BEGIN\n";
+ mDebugInfo += "\n// GLSL BEGIN\n\n" + mData.getSource() + "\n\n// GLSL END\n\n\n";
+ mDebugInfo +=
+ "// INITIAL HLSL BEGIN\n\n" + translatedSource + "\n// INITIAL HLSL END\n\n\n";
+ // Successive steps will append more info
+ return true;
+ };
+
+ auto workerThreadPool = context->getWorkerThreadPool();
+ auto translateTask = std::make_shared<TranslateTaskD3D>(compilerInstance->getHandle(), options,
+ source, sourcePath);
+
+ return std::make_shared<WaitableCompileEventD3D>(
+ angle::WorkerThreadPool::PostWorkerTask(workerThreadPool, translateTask), compilerInstance,
+ std::move(postTranslateFunctor), translateTask);
+}
+
+bool ShaderD3D::hasUniform(const std::string &name) const
+{
+ return mUniformRegisterMap.find(name) != mUniformRegisterMap.end();
}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.h
index 9f7e73bf8df..8a90b1cd37d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/ShaderD3D.h
@@ -38,11 +38,10 @@ class ShaderD3D : public ShaderImpl
const gl::Extensions &extensions);
~ShaderD3D() override;
- // ShaderImpl implementation
- ShCompileOptions prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string *sourcePath) override;
- bool postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog) override;
+ std::shared_ptr<WaitableCompileEvent> compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options) override;
+
std::string getDebugInfo() const override;
// D3D-specific methods
@@ -72,6 +71,7 @@ class ShaderD3D : public ShaderImpl
bool usesPointCoord() const { return mUsesPointCoord; }
bool usesDepthRange() const { return mUsesDepthRange; }
bool usesFragDepth() const { return mUsesFragDepth; }
+ bool usesVertexID() const { return mUsesVertexID; }
bool usesViewID() const { return mUsesViewID; }
bool hasANGLEMultiviewEnabled() const { return mHasANGLEMultiviewEnabled; }
@@ -88,6 +88,7 @@ class ShaderD3D : public ShaderImpl
bool mUsesDepthRange;
bool mUsesFragDepth;
bool mHasANGLEMultiviewEnabled;
+ bool mUsesVertexID;
bool mUsesViewID;
bool mUsesDiscardRewriting;
bool mUsesNestedBreak;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
index 1e5607d7f83..61dc8ffa07b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
@@ -346,7 +346,7 @@ egl::Error SurfaceD3D::checkForOutOfDateSwapChain(DisplayD3D *displayD3D)
egl::Error SurfaceD3D::swap(const gl::Context *context)
{
- DisplayD3D *displayD3D = GetImplAs<DisplayD3D>(context->getCurrentDisplay());
+ DisplayD3D *displayD3D = GetImplAs<DisplayD3D>(context->getDisplay());
return swapRect(displayD3D, 0, 0, mWidth, mHeight);
}
@@ -356,7 +356,7 @@ egl::Error SurfaceD3D::postSubBuffer(const gl::Context *context,
EGLint width,
EGLint height)
{
- DisplayD3D *displayD3D = GetImplAs<DisplayD3D>(context->getCurrentDisplay());
+ DisplayD3D *displayD3D = GetImplAs<DisplayD3D>(context->getDisplay());
return swapRect(displayD3D, x, y, width, height);
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
index cd3b8895286..783995a73a3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.cpp
@@ -184,6 +184,18 @@ angle::Result TextureD3D::setStorageMultisample(const gl::Context *context,
return angle::Result::Continue;
}
+angle::Result TextureD3D::setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset)
+{
+ ANGLE_HR_UNREACHABLE(GetImplAs<ContextD3D>(context));
+ return angle::Result::Continue;
+}
+
bool TextureD3D::shouldUseSetData(const ImageD3D *image) const
{
if (!mRenderer->getWorkarounds().setDataFasterThanImageUpload)
@@ -569,6 +581,9 @@ angle::Result TextureD3D::ensureRenderTarget(const gl::Context *context)
ANGLE_TRY(mTexStorage->copyToStorage(context, newRenderTargetStorage.get()));
ANGLE_TRY(setCompleteTexStorage(context, newRenderTargetStorage.get()));
newRenderTargetStorage.release();
+ // If this texture is used in compute shader, we should invalidate this texture so that
+ // the UAV/SRV is rebound again with this new texture storage in next dispatch call.
+ mTexStorage->invalidateTextures();
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h
index 4eb43b5b929..3c8a327e82f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureD3D.h
@@ -66,6 +66,14 @@ class TextureD3D : public TextureImpl
const gl::Extents &size,
bool fixedSampleLocations) override;
+ angle::Result setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset) override;
+
bool isImmutable() const { return mImmutable; }
virtual angle::Result getRenderTarget(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h
index 57f80c84f04..708ab565505 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/TextureStorage.h
@@ -70,6 +70,8 @@ class TextureStorage : angle::NonCopyable
virtual angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
bool useLevelZeroTexture);
+ virtual void invalidateTextures() {}
+
protected:
const angle::Subject *mSubject;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
index 58b63f05384..78dd75bf962 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/VertexBuffer.cpp
@@ -159,6 +159,7 @@ angle::Result StreamingVertexBufferInterface::reserveSpace(const gl::Context *co
mWritePosition = 0;
}
+ mReservedSpace = size;
return angle::Result::Continue;
}
@@ -181,7 +182,6 @@ angle::Result StreamingVertexBufferInterface::storeDynamicAttribute(
checkedPosition += spaceRequired;
ANGLE_CHECK_GL_ALLOC(GetImplAs<ContextD3D>(context), checkedPosition.IsValid());
- ANGLE_TRY(reserveSpace(context, mReservedSpace));
mReservedSpace = 0;
ANGLE_TRY(mVertexBuffer->storeVertexAttributes(context, attrib, binding, currentValueType,
@@ -215,7 +215,7 @@ angle::Result StreamingVertexBufferInterface::reserveVertexSpace(const gl::Conte
// Protect against integer overflow
ANGLE_CHECK_GL_ALLOC(GetImplAs<ContextD3D>(context), alignedRequiredSpace.IsValid());
- mReservedSpace = alignedRequiredSpace.ValueOrDie();
+ ANGLE_TRY(reserveSpace(context, alignedRequiredSpace.ValueOrDie()));
return angle::Result::Continue;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
index 0ec1a2aa61d..9f6061fdfb9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
@@ -557,16 +557,7 @@ angle::Result Buffer11::unmap(const gl::Context *context, GLboolean *result)
angle::Result Buffer11::markTransformFeedbackUsage(const gl::Context *context)
{
- BufferStorage *transformFeedbackStorage = nullptr;
- ANGLE_TRY(getBufferStorage(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
- &transformFeedbackStorage));
-
- if (transformFeedbackStorage)
- {
- onStorageUpdate(transformFeedbackStorage);
- }
-
- invalidateStaticData(context);
+ ANGLE_TRY(markBufferUsage(context, BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK));
return angle::Result::Continue;
}
@@ -628,6 +619,20 @@ void Buffer11::markBufferUsage(BufferUsage usage)
mIdleness[usage] = 0;
}
+angle::Result Buffer11::markBufferUsage(const gl::Context *context, BufferUsage usage)
+{
+ BufferStorage *bufferStorage = nullptr;
+ ANGLE_TRY(getBufferStorage(context, usage, &bufferStorage));
+
+ if (bufferStorage)
+ {
+ onStorageUpdate(bufferStorage);
+ }
+
+ invalidateStaticData(context);
+ return angle::Result::Continue;
+}
+
angle::Result Buffer11::garbageCollection(const gl::Context *context, BufferUsage currentUsage)
{
if (currentUsage != BUFFER_USAGE_SYSTEM_MEMORY && canDeallocateSystemMemory())
@@ -696,6 +701,12 @@ angle::Result Buffer11::getConstantBufferRange(const gl::Context *context,
return angle::Result::Continue;
}
+angle::Result Buffer11::markRawBufferUsage(const gl::Context *context)
+{
+ ANGLE_TRY(markBufferUsage(context, BUFFER_USAGE_RAW_UAV));
+ return angle::Result::Continue;
+}
+
angle::Result Buffer11::getRawUAVRange(const gl::Context *context,
GLintptr offset,
GLsizeiptr size,
@@ -704,14 +715,6 @@ angle::Result Buffer11::getRawUAVRange(const gl::Context *context,
NativeStorage *nativeStorage = nullptr;
ANGLE_TRY(getBufferStorage(context, BUFFER_USAGE_RAW_UAV, &nativeStorage));
- BufferStorage *latestBuffer = nullptr;
- ANGLE_TRY(getLatestBufferStorage(context, &latestBuffer));
- // As UAVs could have been updated by the shader, they hold the latest version of the data.
- if (latestBuffer != nativeStorage)
- {
- onStorageUpdate(nativeStorage);
- }
-
return nativeStorage->getRawUAV(context, static_cast<unsigned int>(offset),
static_cast<unsigned int>(size), uavOut);
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
index 35b6745eb13..bcf8826badc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
@@ -75,6 +75,7 @@ class Buffer11 : public BufferD3D
GLsizeiptr size,
d3d11::UnorderedAccessView **uavOut);
+ angle::Result markRawBufferUsage(const gl::Context *context);
bool isMapped() const { return mMappedStorage != nullptr; }
angle::Result packPixels(const gl::Context *context,
const gl::FramebufferAttachment &readAttachment,
@@ -129,6 +130,7 @@ class Buffer11 : public BufferD3D
};
void markBufferUsage(BufferUsage usage);
+ angle::Result markBufferUsage(const gl::Context *context, BufferUsage usage);
angle::Result garbageCollection(const gl::Context *context, BufferUsage currentUsage);
angle::Result updateBufferStorage(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
index ae7d96305a7..189d72b74db 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Clear11.cpp
@@ -105,18 +105,6 @@ bool UpdateDataCache(RtvDsvClearInfo<T> *dataCache,
return cacheDirty;
}
-bool AllOffsetsAreNonNegative(const std::vector<gl::Offset> &viewportOffsets)
-{
- for (size_t i = 0u; i < viewportOffsets.size(); ++i)
- {
- const auto &offset = viewportOffsets[i];
- if (offset.x < 0 || offset.y < 0)
- {
- return false;
- }
- }
- return true;
-}
} // anonymous namespace
#define CLEARPS(Index) \
@@ -431,65 +419,39 @@ angle::Result Clear11::clearFramebuffer(const gl::Context *context,
framebufferSize = colorAttachment->getSize();
}
- const bool isSideBySideFBO =
- (fboData.getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE);
bool needScissoredClear = false;
- std::vector<D3D11_RECT> scissorRects;
+ D3D11_RECT scissorRect;
if (clearParams.scissorEnabled)
{
- const std::vector<gl::Offset> *viewportOffsets = fboData.getViewportOffsets();
- ASSERT(viewportOffsets != nullptr);
- ASSERT(AllOffsetsAreNonNegative(*fboData.getViewportOffsets()));
-
if (clearParams.scissor.x >= framebufferSize.width ||
clearParams.scissor.y >= framebufferSize.height || clearParams.scissor.width == 0 ||
clearParams.scissor.height == 0)
{
// The check assumes that the viewport offsets are not negative as according to the
- // ANGLE_multiview spec.
+ // OVR_multiview2 spec.
// Scissor rect is outside the renderbuffer or is an empty rect.
return angle::Result::Continue;
}
- if (isSideBySideFBO)
+ if (clearParams.scissor.x + clearParams.scissor.width <= 0 ||
+ clearParams.scissor.y + clearParams.scissor.height <= 0)
{
- // We always have to do a scissor clear for side-by-side framebuffers.
- needScissoredClear = true;
- }
- else
- {
- // Because the viewport offsets can generate scissor rectangles within the framebuffer's
- // bounds, we can do this check only for non-side-by-side framebuffers.
- if (clearParams.scissor.x + clearParams.scissor.width <= 0 ||
- clearParams.scissor.y + clearParams.scissor.height <= 0)
- {
- // Scissor rect is outside the renderbuffer.
- return angle::Result::Continue;
- }
- needScissoredClear =
- clearParams.scissor.x > 0 || clearParams.scissor.y > 0 ||
- clearParams.scissor.x + clearParams.scissor.width < framebufferSize.width ||
- clearParams.scissor.y + clearParams.scissor.height < framebufferSize.height;
+ // Scissor rect is outside the renderbuffer.
+ return angle::Result::Continue;
}
+ needScissoredClear =
+ clearParams.scissor.x > 0 || clearParams.scissor.y > 0 ||
+ clearParams.scissor.x + clearParams.scissor.width < framebufferSize.width ||
+ clearParams.scissor.y + clearParams.scissor.height < framebufferSize.height;
if (needScissoredClear)
{
- // Apply viewport offsets to compute the final scissor rectangles. This is valid also
- // for non-side-by-side framebuffers, because the default viewport offset is {0,0}.
- const size_t numViews = viewportOffsets->size();
- scissorRects.reserve(numViews);
- for (size_t i = 0u; i < numViews; ++i)
- {
- const gl::Offset &offset = (*viewportOffsets)[i];
- D3D11_RECT rect;
- int x = clearParams.scissor.x + offset.x;
- int y = clearParams.scissor.y + offset.y;
- rect.left = x;
- rect.right = x + clearParams.scissor.width;
- rect.top = y;
- rect.bottom = y + clearParams.scissor.height;
- scissorRects.emplace_back(rect);
- }
+ // Apply viewport offsets to compute the final scissor rectangles.
+ // Even in multiview all layers share the same viewport and scissor.
+ scissorRect.left = clearParams.scissor.x;
+ scissorRect.right = scissorRect.left + clearParams.scissor.width;
+ scissorRect.top = clearParams.scissor.y;
+ scissorRect.bottom = scissorRect.top + clearParams.scissor.height;
}
}
@@ -588,15 +550,10 @@ angle::Result Clear11::clearFramebuffer(const gl::Context *context,
{
// We shouldn't reach here if deviceContext1 is unavailable.
ASSERT(deviceContext1);
- // There must be at least one scissor rectangle.
- ASSERT(!scissorRects.empty());
- deviceContext1->ClearView(framebufferRTV.get(), clearValues, scissorRects.data(),
- static_cast<UINT>(scissorRects.size()));
+ deviceContext1->ClearView(framebufferRTV.get(), clearValues, &scissorRect, 1);
if (mRenderer->getWorkarounds().callClearTwice)
{
- deviceContext1->ClearView(framebufferRTV.get(), clearValues,
- scissorRects.data(),
- static_cast<UINT>(scissorRects.size()));
+ deviceContext1->ClearView(framebufferRTV.get(), clearValues, &scissorRect, 1);
}
}
else
@@ -770,8 +727,7 @@ angle::Result Clear11::clearFramebuffer(const gl::Context *context,
const d3d11::GeometryShader *gs = nullptr;
const d3d11::InputLayout *il = nullptr;
const d3d11::PixelShader *ps = nullptr;
- const bool hasLayeredLayout =
- (fboData.getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE);
+ const bool hasLayeredLayout = (fboData.isMultiview());
ANGLE_TRY(mShaderManager.getShadersAndLayout(context, mRenderer, clearParams.colorType, numRtvs,
hasLayeredLayout, &il, &vs, &gs, &ps));
@@ -798,26 +754,19 @@ angle::Result Clear11::clearFramebuffer(const gl::Context *context,
// Apply render targets
stateManager->setRenderTargets(&rtvs[0], numRtvs, dsv);
- // If scissors are necessary to be applied, then the number of clears is the number of scissor
- // rects. If no scissors are necessary, then a single full-size clear is enough.
- size_t necessaryNumClears = needScissoredClear ? scissorRects.size() : 1u;
- for (size_t i = 0u; i < necessaryNumClears; ++i)
+ if (needScissoredClear)
{
- if (needScissoredClear)
- {
- ASSERT(i < scissorRects.size());
- stateManager->setScissorRectD3D(scissorRects[i]);
- }
- // Draw the fullscreen quad.
- if (!hasLayeredLayout || isSideBySideFBO)
- {
- deviceContext->Draw(6, 0);
- }
- else
- {
- ASSERT(hasLayeredLayout);
- deviceContext->DrawInstanced(6, static_cast<UINT>(fboData.getNumViews()), 0, 0);
- }
+ stateManager->setScissorRectD3D(scissorRect);
+ }
+ // Draw the fullscreen quad.
+ if (!hasLayeredLayout)
+ {
+ deviceContext->Draw(6, 0);
+ }
+ else
+ {
+ ASSERT(hasLayeredLayout);
+ deviceContext->DrawInstanced(6, static_cast<UINT>(fboData.getNumViews()), 0, 0);
}
return angle::Result::Continue;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
index 3e673cf0f00..20dff59bcbc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
@@ -231,6 +231,12 @@ std::vector<PathImpl *> Context11::createPaths(GLsizei)
return std::vector<PathImpl *>();
}
+MemoryObjectImpl *Context11::createMemoryObject()
+{
+ UNREACHABLE();
+ return nullptr;
+}
+
angle::Result Context11::flush(const gl::Context *context)
{
return mRenderer->flush(this);
@@ -384,7 +390,7 @@ angle::Result Context11::drawElementsIndirect(const gl::Context *context,
}
}
-GLenum Context11::getResetStatus()
+gl::GraphicsResetStatus Context11::getResetStatus()
{
return mRenderer->getResetStatus();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
index df1e2611742..02570e67b3c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Context11.h
@@ -65,6 +65,9 @@ class Context11 : public ContextD3D, public MultisampleTextureInitializer
// Path object creation.
std::vector<PathImpl *> createPaths(GLsizei) override;
+ // Memory object creation.
+ MemoryObjectImpl *createMemoryObject() override;
+
// Flush and finish.
angle::Result flush(const gl::Context *context) override;
angle::Result finish(const gl::Context *context) override;
@@ -107,7 +110,7 @@ class Context11 : public ContextD3D, public MultisampleTextureInitializer
const void *indirect) override;
// Device loss
- GLenum getResetStatus() override;
+ gl::GraphicsResetStatus getResetStatus() override;
// Vendor and description strings.
std::string getVendorString() const override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
index b71011b4a6a..f80a307964f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp
@@ -8,35 +8,19 @@
#include "libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h"
-#include "common/debug.h"
#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
+#include <VersionHelpers.h>
+
namespace rx
{
-DebugAnnotator11::DebugAnnotator11()
- : mInitialized(false), mD3d11Module(nullptr), mUserDefinedAnnotation(nullptr)
-{
- // D3D11 devices can't be created during DllMain.
- // We defer device creation until the object is actually used.
-}
-
-DebugAnnotator11::~DebugAnnotator11()
-{
- if (mInitialized)
- {
- SafeRelease(mUserDefinedAnnotation);
+DebugAnnotator11::DebugAnnotator11() {}
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- FreeLibrary(mD3d11Module);
-#endif // !ANGLE_ENABLE_WINDOWS_STORE
- }
-}
+DebugAnnotator11::~DebugAnnotator11() {}
void DebugAnnotator11::beginEvent(const char *eventName, const char *eventMessage)
{
- initializeDevice();
-
angle::LoggingAnnotator::beginEvent(eventName, eventMessage);
if (mUserDefinedAnnotation != nullptr)
{
@@ -48,8 +32,6 @@ void DebugAnnotator11::beginEvent(const char *eventName, const char *eventMessag
void DebugAnnotator11::endEvent(const char *eventName)
{
- initializeDevice();
-
angle::LoggingAnnotator::endEvent(eventName);
if (mUserDefinedAnnotation != nullptr)
{
@@ -59,8 +41,6 @@ void DebugAnnotator11::endEvent(const char *eventName)
void DebugAnnotator11::setMarker(const char *markerName)
{
- initializeDevice();
-
angle::LoggingAnnotator::setMarker(markerName);
if (mUserDefinedAnnotation != nullptr)
{
@@ -72,55 +52,31 @@ void DebugAnnotator11::setMarker(const char *markerName)
bool DebugAnnotator11::getStatus()
{
-#if defined(ANGLE_ENABLE_WINDOWS_STORE)
- static_assert(NTDDI_VERSION >= NTDDI_WIN10, "GetStatus only works on Win10 and above");
- initializeDevice();
-
if (mUserDefinedAnnotation != nullptr)
{
return !!(mUserDefinedAnnotation->GetStatus());
}
- return true; // Default if initializeDevice() failed
-#else
- // We can't detect GetStatus() on desktop ANGLE builds so always return true.
- return true;
-#endif // ANGLE_ENABLE_WINDOWS_STORE
+ return false;
}
-void DebugAnnotator11::initializeDevice()
+void DebugAnnotator11::initialize(ID3D11DeviceContext *context)
{
- if (!mInitialized)
+ // ID3DUserDefinedAnnotation.GetStatus only works on Windows10 or greater.
+ // Returning true unconditionally from DebugAnnotator11::getStatus() means
+ // writing out all compiled shaders to temporary files even if debugging
+ // tools are not attached. See rx::ShaderD3D::prepareSourceAndReturnOptions.
+ // If you want debug annotations, you must use Windows 10.
+ if (IsWindows10OrGreater())
{
-#if !defined(ANGLE_ENABLE_WINDOWS_STORE)
- mD3d11Module = LoadLibrary(TEXT("d3d11.dll"));
- ASSERT(mD3d11Module);
-
- PFN_D3D11_CREATE_DEVICE D3D11CreateDevice =
- (PFN_D3D11_CREATE_DEVICE)GetProcAddress(mD3d11Module, "D3D11CreateDevice");
- ASSERT(D3D11CreateDevice != nullptr);
-#endif // !ANGLE_ENABLE_WINDOWS_STORE
-
- ID3D11Device *device = nullptr;
- ID3D11DeviceContext *context = nullptr;
-
- HRESULT hr = E_FAIL;
-
- // Create a D3D_DRIVER_TYPE_NULL device, which is much cheaper than other types of device.
- hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_NULL, nullptr, 0, nullptr, 0,
- D3D11_SDK_VERSION, &device, nullptr, &context);
- ASSERT(SUCCEEDED(hr));
- if (SUCCEEDED(hr))
- {
- mUserDefinedAnnotation =
- d3d11::DynamicCastComObject<ID3DUserDefinedAnnotation>(context);
- ASSERT(mUserDefinedAnnotation != nullptr);
- mInitialized = true;
- }
-
- SafeRelease(device);
- SafeRelease(context);
+ mUserDefinedAnnotation.Attach(
+ d3d11::DynamicCastComObject<ID3DUserDefinedAnnotation>(context));
}
}
+void DebugAnnotator11::release()
+{
+ mUserDefinedAnnotation.Reset();
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
index ad6c885faf7..c4650c27d0e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h
@@ -19,17 +19,15 @@ class DebugAnnotator11 : public angle::LoggingAnnotator
public:
DebugAnnotator11();
~DebugAnnotator11() override;
+ void initialize(ID3D11DeviceContext *context);
+ void release();
void beginEvent(const char *eventName, const char *eventMessage) override;
void endEvent(const char *eventName) override;
void setMarker(const char *markerName) override;
bool getStatus() override;
private:
- void initializeDevice();
-
- bool mInitialized;
- HMODULE mD3d11Module;
- ID3DUserDefinedAnnotation *mUserDefinedAnnotation;
+ angle::ComPtr<ID3DUserDefinedAnnotation> mUserDefinedAnnotation;
static constexpr size_t kMaxMessageLength = 256;
wchar_t mWCharMessage[kMaxMessageLength];
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index 9b67ac4ff59..33dfa6b035e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -68,13 +68,6 @@
# include "libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.h"
#endif
-// Include the D3D9 debug annotator header for use by the desktop D3D11 renderer
-// because the D3D11 interface method ID3DUserDefinedAnnotation::GetStatus
-// doesn't work with the Graphics Diagnostics tools in Visual Studio 2013.
-#ifdef ANGLE_ENABLE_D3D9
-# include "libANGLE/renderer/d3d/d3d9/DebugAnnotator9.h"
-#endif
-
// Enable ANGLE_SKIP_DXGI_1_2_CHECK if there is not a possibility of using cross-process
// HWNDs or the Windows 7 Platform Update (KB2670838) is expected to be installed.
#ifndef ANGLE_SKIP_DXGI_1_2_CHECK
@@ -420,8 +413,7 @@ Renderer11::Renderer11(egl::Display *display)
mLastHistogramUpdateTime(
ANGLEPlatformCurrent()->monotonicallyIncreasingTime(ANGLEPlatformCurrent())),
mDebug(nullptr),
- mScratchMemoryBuffer(ScratchMemoryBufferLifetime),
- mAnnotator(nullptr)
+ mScratchMemoryBuffer(ScratchMemoryBufferLifetime)
{
mLineLoopIB = nullptr;
mTriangleFanIB = nullptr;
@@ -536,19 +528,6 @@ Renderer11::Renderer11(egl::Display *display)
const EGLenum presentPath = static_cast<EGLenum>(attributes.get(
EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE));
mPresentPathFastEnabled = (presentPath == EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE);
-
-// The D3D11 renderer must choose the D3D9 debug annotator because the D3D11 interface
-// method ID3DUserDefinedAnnotation::GetStatus on desktop builds doesn't work with the Graphics
-// Diagnostics tools in Visual Studio 2013.
-// The D3D9 annotator works properly for both D3D11 and D3D9.
-// Incorrect status reporting can cause ANGLE to log unnecessary debug events.
-#ifdef ANGLE_ENABLE_D3D9
- mAnnotator = new DebugAnnotator9();
-#else
- mAnnotator = new DebugAnnotator11();
-#endif
- ASSERT(mAnnotator);
- gl::InitializeDebugAnnotations(mAnnotator);
}
Renderer11::~Renderer11()
@@ -835,6 +814,9 @@ egl::Error Renderer11::initializeD3DDevice()
d3d11::SetDebugName(mDeviceContext, "DeviceContext");
+ mAnnotator.initialize(mDeviceContext);
+ gl::InitializeDebugAnnotations(&mAnnotator);
+
return egl::NoError();
}
@@ -1344,6 +1326,7 @@ egl::Error Renderer11::getD3DTextureInfo(const egl::Config *configuration,
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
case DXGI_FORMAT_R16G16B16A16_FLOAT:
case DXGI_FORMAT_R32G32B32A32_FLOAT:
+ case DXGI_FORMAT_R10G10B10A2_UNORM:
break;
default:
@@ -1930,11 +1913,8 @@ void Renderer11::release()
{
mScratchMemoryBuffer.clear();
- if (mAnnotator != nullptr)
- {
- gl::UninitializeDebugAnnotations();
- SafeDelete(mAnnotator);
- }
+ mAnnotator.release();
+ gl::UninitializeDebugAnnotations();
releaseDeviceResources();
@@ -3747,7 +3727,7 @@ gl::Version Renderer11::getMaxSupportedESVersion() const
gl::DebugAnnotator *Renderer11::getAnnotator()
{
- return mAnnotator;
+ return &mAnnotator;
}
angle::Result Renderer11::dispatchCompute(const gl::Context *context,
@@ -3755,6 +3735,14 @@ angle::Result Renderer11::dispatchCompute(const gl::Context *context,
GLuint numGroupsY,
GLuint numGroupsZ)
{
+ const gl::State &glState = context->getState();
+ const gl::Program *program = glState.getProgram();
+ if (program->getActiveShaderStorageBlockCount() > 0 ||
+ program->getActiveAtomicCounterBufferCount() > 0)
+ {
+ ANGLE_TRY(markRawBufferUsage(context));
+ }
+
ANGLE_TRY(mStateManager.updateStateForCompute(context, numGroupsX, numGroupsY, numGroupsZ));
mDeviceContext->Dispatch(numGroupsX, numGroupsY, numGroupsZ);
@@ -3763,6 +3751,13 @@ angle::Result Renderer11::dispatchCompute(const gl::Context *context,
angle::Result Renderer11::dispatchComputeIndirect(const gl::Context *context, GLintptr indirect)
{
const auto &glState = context->getState();
+ const gl::Program *program = glState.getProgram();
+ if (program->getActiveShaderStorageBlockCount() > 0 ||
+ program->getActiveAtomicCounterBufferCount() > 0)
+ {
+ ANGLE_TRY(markRawBufferUsage(context));
+ }
+
auto *dispatchIndirectBuffer = glState.getTargetBuffer(gl::BufferBinding::DispatchIndirect);
ASSERT(dispatchIndirectBuffer);
@@ -3946,6 +3941,36 @@ angle::Result Renderer11::mapResource(const gl::Context *context,
return angle::Result::Continue;
}
+angle::Result Renderer11::markRawBufferUsage(const gl::Context *context)
+{
+ const gl::State &glState = context->getState();
+ const gl::Program *program = glState.getProgram();
+ for (size_t blockIndex = 0; blockIndex < program->getActiveShaderStorageBlockCount();
+ blockIndex++)
+ {
+ GLuint binding = program->getShaderStorageBlockBinding(static_cast<GLuint>(blockIndex));
+ const auto &shaderStorageBuffer = glState.getIndexedShaderStorageBuffer(binding);
+ if (shaderStorageBuffer.get() != nullptr)
+ {
+ Buffer11 *bufferStorage = GetImplAs<Buffer11>(shaderStorageBuffer.get());
+ ANGLE_TRY(bufferStorage->markRawBufferUsage(context));
+ }
+ }
+
+ for (const auto &atomicCounterBuffer : program->getState().getAtomicCounterBuffers())
+ {
+ GLuint binding = atomicCounterBuffer.binding;
+ const auto &buffer = glState.getIndexedAtomicCounterBuffer(binding);
+
+ if (buffer.get() != nullptr)
+ {
+ Buffer11 *bufferStorage = GetImplAs<Buffer11>(buffer.get());
+ ANGLE_TRY(bufferStorage->markRawBufferUsage(context));
+ }
+ }
+ return angle::Result::Continue;
+}
+
angle::Result Renderer11::markTransformFeedbackUsage(const gl::Context *context)
{
const gl::State &glState = context->getState();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
index 9861b9b85cc..0929bfd369d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
@@ -549,6 +549,8 @@ class Renderer11 : public RendererD3D
d3d11::ANGLED3D11DeviceType getDeviceType() const;
+ // Make sure that the raw buffer is the latest buffer.
+ angle::Result markRawBufferUsage(const gl::Context *context);
angle::Result markTransformFeedbackUsage(const gl::Context *context);
angle::Result drawWithGeometryShaderAndTransformFeedback(Context11 *context11,
gl::PrimitiveMode mode,
@@ -605,7 +607,7 @@ class Renderer11 : public RendererD3D
angle::ScratchBuffer mScratchMemoryBuffer;
- gl::DebugAnnotator *mAnnotator;
+ DebugAnnotator11 mAnnotator;
mutable Optional<bool> mSupportsShareHandles;
ResourceManager11 mResourceManager11;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
index 0fb14ae8b84..cce51910797 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
@@ -8,6 +8,7 @@
#include "libANGLE/renderer/d3d/d3d11/StateManager11.h"
+#include "common/angleutils.h"
#include "common/bitset_utils.h"
#include "common/mathutil.h"
#include "common/utilities.h"
@@ -489,6 +490,19 @@ void ShaderConstants11::onViewportChange(const gl::Rectangle &glViewport,
mVertex.viewScale[1] = mPixel.viewScale[1];
}
+// Update the ShaderConstants with a new first vertex and return whether the update dirties them.
+ANGLE_INLINE bool ShaderConstants11::onFirstVertexChange(GLint firstVertex)
+{
+ uint32_t newFirstVertex = static_cast<uint32_t>(firstVertex);
+ bool firstVertexDirty = (mVertex.firstVertex != newFirstVertex);
+ if (firstVertexDirty)
+ {
+ mVertex.firstVertex = newFirstVertex;
+ mShaderConstantsDirty.set(gl::ShaderType::Vertex);
+ }
+ return firstVertexDirty;
+}
+
void ShaderConstants11::onSamplerChange(gl::ShaderType shaderType,
unsigned int samplerIndex,
const gl::Texture &texture,
@@ -1138,7 +1152,7 @@ void StateManager11::syncState(const gl::Context *context, const gl::State::Dirt
invalidateProgramAtomicCounterBuffers();
invalidateProgramShaderStorageBuffers();
invalidateDriverUniforms();
- // If ANGLE_multiview is enabled, the attribute divisor has to be updated for each
+ // If OVR_multiview2 is enabled, the attribute divisor has to be updated for each
// binding. When using compute, there could be no vertex array.
if (mIsMultiviewEnabled && mVertexArray11)
{
@@ -1174,37 +1188,12 @@ void StateManager11::handleMultiviewDrawFramebufferChange(const gl::Context *con
const gl::Framebuffer *drawFramebuffer = glState.getDrawFramebuffer();
ASSERT(drawFramebuffer != nullptr);
- // Update viewport offsets.
- const std::vector<gl::Offset> *attachmentViewportOffsets =
- drawFramebuffer->getViewportOffsets();
- const std::vector<gl::Offset> &viewportOffsets =
- attachmentViewportOffsets != nullptr
- ? *attachmentViewportOffsets
- : gl::FramebufferAttachment::GetDefaultViewportOffsetVector();
- if (mViewportOffsets != viewportOffsets)
+ if (drawFramebuffer->isMultiview())
{
- mViewportOffsets = viewportOffsets;
-
- // Because new viewport offsets are to be applied, we have to mark the internal viewport and
- // scissor state as dirty.
- invalidateViewport(context);
- mInternalDirtyBits.set(DIRTY_BIT_SCISSOR_STATE);
- }
- switch (drawFramebuffer->getMultiviewLayout())
- {
- case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
- mShaderConstants.setMultiviewWriteToViewportIndex(1.0f);
- break;
- case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
- // Because the base view index is applied as an offset to the 2D texture array when the
- // RTV is created, we just have to pass a boolean to select which code path is to be
- // used.
- mShaderConstants.setMultiviewWriteToViewportIndex(0.0f);
- break;
- default:
- // There is no need to update the value in the constant buffer if the active framebuffer
- // object does not have a multiview layout.
- break;
+ // Because the base view index is applied as an offset to the 2D texture array when the
+ // RTV is created, we just have to pass a boolean to select which code path is to be
+ // used.
+ mShaderConstants.setMultiviewWriteToViewportIndex(0.0f);
}
}
@@ -1368,19 +1357,14 @@ void StateManager11::syncScissorRectangle(const gl::Rectangle &scissor, bool ena
if (enabled)
{
- std::array<D3D11_RECT, gl::IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS> rectangles;
- const UINT numRectangles = static_cast<UINT>(mViewportOffsets.size());
- for (UINT i = 0u; i < numRectangles; ++i)
- {
- D3D11_RECT &rect = rectangles[i];
- int x = scissor.x + mViewportOffsets[i].x;
- int y = modifiedScissorY + mViewportOffsets[i].y;
- rect.left = std::max(0, x);
- rect.top = std::max(0, y);
- rect.right = x + std::max(0, scissor.width);
- rect.bottom = y + std::max(0, scissor.height);
- }
- mRenderer->getDeviceContext()->RSSetScissorRects(numRectangles, rectangles.data());
+ D3D11_RECT rect;
+ int x = scissor.x;
+ int y = modifiedScissorY;
+ rect.left = std::max(0, x);
+ rect.top = std::max(0, y);
+ rect.right = x + std::max(0, scissor.width);
+ rect.bottom = y + std::max(0, scissor.height);
+ mRenderer->getDeviceContext()->RSSetScissorRects(1, &rect);
}
mCurScissorRect = scissor;
@@ -1412,65 +1396,58 @@ void StateManager11::syncViewport(const gl::Context *context)
}
const auto &viewport = glState.getViewport();
- std::array<D3D11_VIEWPORT, gl::IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS> dxViewports;
- const UINT numRectangles = static_cast<UINT>(mViewportOffsets.size());
int dxViewportTopLeftX = 0;
int dxViewportTopLeftY = 0;
int dxViewportWidth = 0;
int dxViewportHeight = 0;
- for (UINT i = 0u; i < numRectangles; ++i)
- {
- dxViewportTopLeftX = gl::clamp(viewport.x + mViewportOffsets[i].x, dxMinViewportBoundsX,
- dxMaxViewportBoundsX);
- dxViewportTopLeftY = gl::clamp(viewport.y + mViewportOffsets[i].y, dxMinViewportBoundsY,
- dxMaxViewportBoundsY);
- dxViewportWidth = gl::clamp(viewport.width, 0, dxMaxViewportBoundsX - dxViewportTopLeftX);
- dxViewportHeight = gl::clamp(viewport.height, 0, dxMaxViewportBoundsY - dxViewportTopLeftY);
+ dxViewportTopLeftX = gl::clamp(viewport.x, dxMinViewportBoundsX, dxMaxViewportBoundsX);
+ dxViewportTopLeftY = gl::clamp(viewport.y, dxMinViewportBoundsY, dxMaxViewportBoundsY);
+ dxViewportWidth = gl::clamp(viewport.width, 0, dxMaxViewportBoundsX - dxViewportTopLeftX);
+ dxViewportHeight = gl::clamp(viewport.height, 0, dxMaxViewportBoundsY - dxViewportTopLeftY);
- D3D11_VIEWPORT &dxViewport = dxViewports[i];
- dxViewport.TopLeftX = static_cast<float>(dxViewportTopLeftX);
- if (mCurPresentPathFastEnabled)
- {
- // When present path fast is active and we're rendering to framebuffer 0, we must invert
- // the viewport in Y-axis.
- // NOTE: We delay the inversion until right before the call to RSSetViewports, and leave
- // dxViewportTopLeftY unchanged. This allows us to calculate viewAdjust below using the
- // unaltered dxViewportTopLeftY value.
- dxViewport.TopLeftY = static_cast<float>(mCurPresentPathFastColorBufferHeight -
- dxViewportTopLeftY - dxViewportHeight);
- }
- else
- {
- dxViewport.TopLeftY = static_cast<float>(dxViewportTopLeftY);
- }
+ D3D11_VIEWPORT dxViewport;
+ dxViewport.TopLeftX = static_cast<float>(dxViewportTopLeftX);
+ if (mCurPresentPathFastEnabled)
+ {
+ // When present path fast is active and we're rendering to framebuffer 0, we must invert
+ // the viewport in Y-axis.
+ // NOTE: We delay the inversion until right before the call to RSSetViewports, and leave
+ // dxViewportTopLeftY unchanged. This allows us to calculate viewAdjust below using the
+ // unaltered dxViewportTopLeftY value.
+ dxViewport.TopLeftY = static_cast<float>(mCurPresentPathFastColorBufferHeight -
+ dxViewportTopLeftY - dxViewportHeight);
+ }
+ else
+ {
+ dxViewport.TopLeftY = static_cast<float>(dxViewportTopLeftY);
+ }
- // The es 3.1 spec section 9.2 states that, "If there are no attachments, rendering
- // will be limited to a rectangle having a lower left of (0, 0) and an upper right of
- // (width, height), where width and height are the framebuffer object's default width
- // and height." See http://anglebug.com/1594
- // If the Framebuffer has no color attachment and the default width or height is smaller
- // than the current viewport, use the smaller of the two sizes.
- // If framebuffer default width or height is 0, the params should not set.
- if (!framebuffer->getFirstNonNullAttachment() &&
- (framebuffer->getDefaultWidth() || framebuffer->getDefaultHeight()))
- {
- dxViewport.Width =
- static_cast<GLfloat>(std::min(viewport.width, framebuffer->getDefaultWidth()));
- dxViewport.Height =
- static_cast<GLfloat>(std::min(viewport.height, framebuffer->getDefaultHeight()));
- }
- else
- {
- dxViewport.Width = static_cast<float>(dxViewportWidth);
- dxViewport.Height = static_cast<float>(dxViewportHeight);
- }
- dxViewport.MinDepth = actualZNear;
- dxViewport.MaxDepth = actualZFar;
+ // The es 3.1 spec section 9.2 states that, "If there are no attachments, rendering
+ // will be limited to a rectangle having a lower left of (0, 0) and an upper right of
+ // (width, height), where width and height are the framebuffer object's default width
+ // and height." See http://anglebug.com/1594
+ // If the Framebuffer has no color attachment and the default width or height is smaller
+ // than the current viewport, use the smaller of the two sizes.
+ // If framebuffer default width or height is 0, the params should not set.
+ if (!framebuffer->getFirstNonNullAttachment() &&
+ (framebuffer->getDefaultWidth() || framebuffer->getDefaultHeight()))
+ {
+ dxViewport.Width =
+ static_cast<GLfloat>(std::min(viewport.width, framebuffer->getDefaultWidth()));
+ dxViewport.Height =
+ static_cast<GLfloat>(std::min(viewport.height, framebuffer->getDefaultHeight()));
+ }
+ else
+ {
+ dxViewport.Width = static_cast<float>(dxViewportWidth);
+ dxViewport.Height = static_cast<float>(dxViewportHeight);
}
+ dxViewport.MinDepth = actualZNear;
+ dxViewport.MaxDepth = actualZFar;
- mRenderer->getDeviceContext()->RSSetViewports(numRectangles, dxViewports.data());
+ mRenderer->getDeviceContext()->RSSetViewports(1, &dxViewport);
mCurViewport = viewport;
mCurNear = actualZNear;
@@ -1884,8 +1861,7 @@ angle::Result StateManager11::ensureInitialized(const gl::Context *context)
mShaderConstants.init(caps);
- mIsMultiviewEnabled = extensions.multiview;
- mViewportOffsets.resize(1u);
+ mIsMultiviewEnabled = extensions.multiview2;
ANGLE_TRY(mVertexDataManager.initialize(context));
@@ -2172,6 +2148,15 @@ angle::Result StateManager11::updateState(const gl::Context *context,
invalidateInputLayout();
}
+ // The ShaderConstants only need to be updated when the program uses vertexID
+ if (mProgramD3D->usesVertexID())
+ {
+ if (mShaderConstants.onFirstVertexChange(firstVertex))
+ {
+ mInternalDirtyBits.set(DIRTY_BIT_DRIVER_UNIFORMS);
+ }
+ }
+
if (indexTypeOrInvalid != gl::DrawElementsType::InvalidEnum)
{
ANGLE_TRY(applyIndexBuffer(context, vertexOrIndexCount, indexTypeOrInvalid, indices));
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
index 6c37949f210..c04d0a4d419 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
@@ -44,6 +44,7 @@ class ShaderConstants11 : angle::NonCopyable
const D3D11_VIEWPORT &dxViewport,
bool is9_3,
bool presentPathFast);
+ bool onFirstVertexChange(GLint firstVertex);
void onImageLayerChange(gl::ShaderType shaderType, unsigned int imageIndex, int layer);
void onSamplerChange(gl::ShaderType shaderType,
unsigned int samplerIndex,
@@ -68,7 +69,7 @@ class ShaderConstants11 : angle::NonCopyable
viewCoords{.0f},
viewScale{.0f},
multiviewWriteToViewportIndex{.0f},
- padding{.0f}
+ firstVertex{0}
{}
float depthRange[4];
@@ -80,8 +81,7 @@ class ShaderConstants11 : angle::NonCopyable
// whenever a multi-view draw framebuffer is made active.
float multiviewWriteToViewportIndex;
- // Added here to manually pad the struct.
- float padding;
+ uint32_t firstVertex;
};
struct Pixel
@@ -217,6 +217,9 @@ class StateManager11 final : angle::NonCopyable
// Called by VertexArray11 element array buffer sync.
void invalidateIndexBuffer();
+ // Called by TextureStorage11. Also called internally.
+ void invalidateTexturesAndSamplers();
+
void setRenderTarget(ID3D11RenderTargetView *rtv, ID3D11DepthStencilView *dsv);
void setRenderTargets(ID3D11RenderTargetView **rtvs, UINT numRtvs, ID3D11DepthStencilView *dsv);
@@ -376,7 +379,6 @@ class StateManager11 final : angle::NonCopyable
angle::Result syncTransformFeedbackBuffers(const gl::Context *context);
// These are currently only called internally.
- void invalidateTexturesAndSamplers();
void invalidateDriverUniforms();
void invalidateProgramUniforms();
void invalidateConstantBuffer(unsigned int slot);
@@ -473,11 +475,6 @@ class StateManager11 final : angle::NonCopyable
float mCurNear;
float mCurFar;
- // The viewport offsets are guaranteed to be updated whenever the gl::State::DirtyBits are
- // resolved and can be applied to the viewport and scissor whenever the internal viewport and
- // scissor bits are resolved.
- std::vector<gl::Offset> mViewportOffsets;
-
// Things needed in viewport state
ShaderConstants11 mShaderConstants;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
index 031df72e4ce..885ef726936 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.cpp
@@ -702,6 +702,11 @@ angle::Result TextureStorage11::copyToStorage(const gl::Context *context,
return angle::Result::Continue;
}
+void TextureStorage11::invalidateTextures()
+{
+ mRenderer->getStateManager()->invalidateTexturesAndSamplers();
+}
+
angle::Result TextureStorage11::setData(const gl::Context *context,
const gl::ImageIndex &index,
ImageD3D *image,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
index 82131cd9b03..f49bd08acdf 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/TextureStorage11.h
@@ -92,6 +92,7 @@ class TextureStorage11 : public TextureStorage
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixelData) override;
+ void invalidateTextures() override;
virtual angle::Result getSRVForSampler(const gl::Context *context,
const gl::TextureState &textureState,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h
index 07b199ace9c..aebdba1a5c3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/converged/CompositorNativeWindow11.h
@@ -12,11 +12,11 @@
#include "libANGLE/renderer/d3d/d3d11/NativeWindow11.h"
-#include <DispatcherQueue.h>
-#include <VersionHelpers.h>
-#include <Windows.ui.composition.interop.h>
+#include <dispatcherqueue.h>
+#include <versionhelpers.h>
#include <windows.foundation.metadata.h>
#include <windows.ui.composition.h>
+#include <windows.ui.composition.interop.h>
#include <wrl.h>
namespace rx
@@ -112,4 +112,4 @@ class CompositorNativeWindow11 : public NativeWindow11
} // namespace rx
-#endif // LIBANGLE_RENDERER_D3D_D3D11_CONVERGED_COMPOSITORNATIVEWINDOW11_H_ \ No newline at end of file
+#endif // LIBANGLE_RENDERER_D3D_D3D11_CONVERGED_COMPOSITORNATIVEWINDOW11_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp
index 51668abbe9b..51668abbe9b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py
index d262b43b8b0..4b69c5551d0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_blit11helper.py
@@ -6,6 +6,7 @@
#
# gen_blit11helper.py:
# Generates the code for retrieving the various blit shaders for D3D11
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
import sys, os, pprint
from datetime import date
@@ -335,22 +336,42 @@ def write_gni_file(shader_filename_list):
out.close()
-map_blitshader_cases = []
-shader_includes = []
-blitshadertype_cases = []
-blitshadertype_enums = []
-blitshaderop_enums = []
-shader_filenames = []
-
-map_blitshader_cases = get_map_blitshader_cases()
-shader_includes = get_shader_includes()
-blitshadertype_cases = get_blitshader_cases()
-blitshaderop_enums = get_blitshaderop_enums()
-blitshadertype_enums = get_blitshadertype_enums()
-shader_filenames = get_shader_filenames()
-
-write_inc_file("\n".join([d for d in blitshadertype_cases]), "\n".join(
- [c for c in map_blitshader_cases]), "\n".join([i for i in shader_includes]),
- "\n".join([e for e in blitshaderop_enums]), "\n".join(
- [e for e in blitshadertype_enums]))
-write_gni_file("\n".join([s for s in shader_filenames]))
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = []
+ outputs = ['Blit11Helper_autogen.inc', 'd3d11_blit_shaders_autogen.gni']
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ map_blitshader_cases = []
+ shader_includes = []
+ blitshadertype_cases = []
+ blitshadertype_enums = []
+ blitshaderop_enums = []
+ shader_filenames = []
+
+ map_blitshader_cases = get_map_blitshader_cases()
+ shader_includes = get_shader_includes()
+ blitshadertype_cases = get_blitshader_cases()
+ blitshaderop_enums = get_blitshaderop_enums()
+ blitshadertype_enums = get_blitshadertype_enums()
+ shader_filenames = get_shader_filenames()
+
+ write_inc_file("\n".join([d for d in blitshadertype_cases]), "\n".join(
+ [c for c in map_blitshader_cases]), "\n".join([i for i in shader_includes]),
+ "\n".join([e for e in blitshaderop_enums]), "\n".join(
+ [e for e in blitshadertype_enums]))
+ write_gni_file("\n".join([s for s in shader_filenames]))
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py
index 38da2093321..2b7e1755ece 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py
@@ -5,6 +5,7 @@
#
# gen_dxgi_format_table.py:
# Code generation for DXGI format map.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
import sys
@@ -82,52 +83,78 @@ def format_case(dxgi_format, result):
def undefined_case(dxgi_format):
return template_undefined_case.format(dxgi_format = dxgi_format)
-component_cases = ""
-format_cases = ""
-input_data = 'dxgi_format_data.json'
-
-dxgi_map = angle_format.load_json(input_data)
-
-types = {
- 'SNORM': 'GL_SIGNED_NORMALIZED',
- 'UNORM': 'GL_UNSIGNED_NORMALIZED',
- 'SINT': 'GL_INT',
- 'UINT': 'GL_UNSIGNED_INT',
- 'FLOAT': 'GL_FLOAT',
- 'SHAREDEXP': 'GL_FLOAT'
-}
-
-all_angle = angle_format.get_all_angle_formats()
-
-for dxgi_format, angle_format in sorted(dxgi_map.iteritems()):
-
- found = [ctype in dxgi_format for ctype in types.keys()]
- count = reduce((lambda a, b: int(a) + int(b)), found)
-
- component_type = 'GL_NONE'
-
- if count == 1:
- gltype = next(gltype for ctype, gltype in types.iteritems() if ctype in dxgi_format)
- component_cases += format_case(dxgi_format, gltype)
- else:
- component_cases += undefined_case(dxgi_format)
-
- if angle_format == "":
- angle_format = dxgi_format
-
- if angle_format in all_angle:
- angle_format = "Format::Get(FormatID::" + angle_format + ")"
- format_cases += format_case(dxgi_format, angle_format)
- else:
- format_cases += undefined_case(dxgi_format)
-
-with open('dxgi_format_map_autogen.cpp', 'wt') as out_file:
- output_cpp = template_cpp.format(
- script_name = sys.argv[0],
- data_source_name = input_data,
- copyright_year = date.today().year,
- component_type_cases = component_cases,
- format_cases = format_cases)
- out_file.write(output_cpp)
- out_file.close()
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [
+ '../../angle_format.py',
+ '../../angle_format_map.json',
+ 'dxgi_format_data.json',
+ ]
+ outputs = ['dxgi_format_map_autogen.cpp']
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ component_cases = ""
+ format_cases = ""
+
+ input_data = 'dxgi_format_data.json'
+
+ dxgi_map = angle_format.load_json(input_data)
+
+ types = {
+ 'SNORM': 'GL_SIGNED_NORMALIZED',
+ 'UNORM': 'GL_UNSIGNED_NORMALIZED',
+ 'SINT': 'GL_INT',
+ 'UINT': 'GL_UNSIGNED_INT',
+ 'FLOAT': 'GL_FLOAT',
+ 'SHAREDEXP': 'GL_FLOAT'
+ }
+
+ all_angle = angle_format.get_all_angle_formats()
+
+ for dxgi_format, a_format in sorted(dxgi_map.iteritems()):
+
+ found = [ctype in dxgi_format for ctype in types.keys()]
+ count = reduce((lambda a, b: int(a) + int(b)), found)
+
+ component_type = 'GL_NONE'
+
+ if count == 1:
+ gltype = next(gltype for ctype, gltype in types.iteritems() if ctype in dxgi_format)
+ component_cases += format_case(dxgi_format, gltype)
+ else:
+ component_cases += undefined_case(dxgi_format)
+
+ if a_format == "":
+ a_format = dxgi_format
+
+ if a_format in all_angle:
+ a_format = "Format::Get(FormatID::" + a_format + ")"
+ format_cases += format_case(dxgi_format, a_format)
+ else:
+ format_cases += undefined_case(dxgi_format)
+
+ with open('dxgi_format_map_autogen.cpp', 'wt') as out_file:
+ output_cpp = template_cpp.format(
+ script_name = sys.argv[0],
+ data_source_name = input_data,
+ copyright_year = date.today().year,
+ component_type_cases = component_cases,
+ format_cases = format_cases)
+ out_file.write(output_cpp)
+ out_file.close()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py
index 593daf976cc..e31cb0ccf19 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py
@@ -6,8 +6,9 @@
# gen_dxgi_support_tables.py:
# Code generation for the DXGI support tables. Determines which formats
# are natively support in D3D10+.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
#
-# TODO: The "never supported" formats should not be combined with the
+# NOTE: The "never supported" formats should not be combined with the
# "supported" and "optional" ones. At the moment, this does not cause
# any issues as ANGLE does not internally check for "never supported".
#
@@ -167,8 +168,6 @@ const DXGISupport &GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL feat
}} // namespace rx
"""
-table_init = ""
-
def do_format(format_data):
table_data = {'9_3': '', '10_0': '', '10_1': '', '11_0': '', '11_1': ''}
@@ -290,24 +289,45 @@ def join_table_data(table_data_1, table_data_2):
'11_0': table_data_1['11_0'] + table_data_2['11_0'],
'11_1': table_data_1['11_1'] + table_data_2['11_1']}
-with open('dxgi_support_data.json') as dxgi_file:
- file_data = dxgi_file.read()
- dxgi_file.close()
- json_data = json.loads(file_data)
- table_data = {'9_3': '', '10_0': '', '10_1': '', '11_0': '', '11_1': ''}
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = ['dxgi_support_data.json']
+ outputs = ['dxgi_support_table_autogen.cpp']
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ with open('dxgi_support_data.json') as dxgi_file:
+ file_data = dxgi_file.read()
+ dxgi_file.close()
+ json_data = json.loads(file_data)
+
+ table_data = {'9_3': '', '10_0': '', '10_1': '', '11_0': '', '11_1': ''}
+
+ for format_data in json_data:
+ table_data = join_table_data(table_data, do_format(format_data))
- for format_data in json_data:
- table_data = join_table_data(table_data, do_format(format_data))
+ out_data = template.format(prefix=macro_prefix,
+ table_data_9_3=table_data['9_3'],
+ table_data_10_0=table_data['10_0'],
+ table_data_10_1=table_data['10_1'],
+ table_data_11_0=table_data['11_0'],
+ table_data_11_1=table_data['11_1'])
- out_data = template.format(prefix=macro_prefix,
- table_data_9_3=table_data['9_3'],
- table_data_10_0=table_data['10_0'],
- table_data_10_1=table_data['10_1'],
- table_data_11_0=table_data['11_0'],
- table_data_11_1=table_data['11_1'])
+ with open('dxgi_support_table_autogen.cpp', 'wt') as out_file:
+ out_file.write(out_data)
+ out_file.close()
+ return 0
- with open('dxgi_support_table.cpp', 'wt') as out_file:
- out_file.write(out_data)
- out_file.close()
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py
index d19d99ea185..1a4121a91db 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py
@@ -5,6 +5,7 @@
#
# gen_texture_format_table.py:
# Code generation for texture format map
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
#
from datetime import date
@@ -266,16 +267,38 @@ def parse_json_into_switch_angle_format_string(json_map, json_data):
return table_data
-json_map = angle_format.load_with_override(os.path.abspath('texture_format_map.json'))
-data_source_name = 'texture_format_data.json'
-json_data = angle_format.load_json(data_source_name)
-
-angle_format_cases = parse_json_into_switch_angle_format_string(json_map, json_data)
-output_cpp = template_texture_format_table_autogen_cpp.format(
- script_name = sys.argv[0],
- copyright_year = date.today().year,
- angle_format_info_cases = angle_format_cases,
- data_source_name = data_source_name)
-with open('texture_format_table_autogen.cpp', 'wt') as out_file:
- out_file.write(output_cpp)
- out_file.close()
+
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = ['../../angle_format.py', 'texture_format_data.json', 'texture_format_map.json']
+ outputs = ['texture_format_table_autogen.cpp']
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ json_map = angle_format.load_with_override(os.path.abspath('texture_format_map.json'))
+ data_source_name = 'texture_format_data.json'
+ json_data = angle_format.load_json(data_source_name)
+
+ angle_format_cases = parse_json_into_switch_angle_format_string(json_map, json_data)
+ output_cpp = template_texture_format_table_autogen_cpp.format(
+ script_name = sys.argv[0],
+ copyright_year = date.today().year,
+ angle_format_info_cases = angle_format_cases,
+ data_source_name = data_source_name)
+ with open('texture_format_table_autogen.cpp', 'wt') as out_file:
+ out_file.write(output_cpp)
+ out_file.close()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
index 0d855df3820..c5bfd574e27 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
@@ -1610,17 +1610,17 @@ void GenerateCaps(ID3D11Device *device,
extensions->robustBufferAccessBehavior = true;
extensions->blendMinMax = true;
// https://docs.microsoft.com/en-us/windows/desktop/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware
- extensions->floatBlend = true;
- extensions->framebufferBlit = GetFramebufferBlitSupport(featureLevel);
- extensions->framebufferMultisample = GetFramebufferMultisampleSupport(featureLevel);
- extensions->instancedArraysANGLE = GetInstancingSupport(featureLevel);
- extensions->instancedArraysEXT = GetInstancingSupport(featureLevel);
- extensions->packReverseRowOrder = true;
- extensions->standardDerivatives = GetDerivativeInstructionSupport(featureLevel);
- extensions->shaderTextureLOD = GetShaderTextureLODSupport(featureLevel);
- extensions->fragDepth = true;
- extensions->multiview = IsMultiviewSupported(featureLevel);
- if (extensions->multiview)
+ extensions->floatBlend = true;
+ extensions->framebufferBlit = GetFramebufferBlitSupport(featureLevel);
+ extensions->framebufferMultisample = GetFramebufferMultisampleSupport(featureLevel);
+ extensions->instancedArraysANGLE = GetInstancingSupport(featureLevel);
+ extensions->instancedArraysEXT = GetInstancingSupport(featureLevel);
+ extensions->packReverseRowOrder = true;
+ extensions->standardDerivatives = GetDerivativeInstructionSupport(featureLevel);
+ extensions->shaderTextureLOD = GetShaderTextureLODSupport(featureLevel);
+ extensions->fragDepth = true;
+ extensions->multiview2 = IsMultiviewSupported(featureLevel);
+ if (extensions->multiview2)
{
extensions->maxViews =
std::min(static_cast<GLuint>(gl::IMPLEMENTATION_ANGLE_MULTIVIEW_MAX_VIEWS),
@@ -1644,7 +1644,7 @@ void GenerateCaps(ID3D11Device *device,
extensions->copyCompressedTexture = true;
extensions->textureStorageMultisample2DArray = true;
extensions->multiviewMultisample =
- (extensions->multiview && extensions->textureStorageMultisample2DArray);
+ (extensions->multiview2 && extensions->textureStorageMultisample2DArray);
extensions->copyTexture3d = true;
extensions->textureBorderClamp = true;
extensions->textureMultisample = true;
@@ -2383,6 +2383,7 @@ angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps
workarounds.flushAfterEndingTransformFeedback = IsNvidia(adapterDesc.VendorId);
workarounds.getDimensionsIgnoresBaseLevel = IsNvidia(adapterDesc.VendorId);
workarounds.skipVSConstantRegisterZero = IsNvidia(adapterDesc.VendorId);
+ workarounds.forceAtomicValueResolution = IsNvidia(adapterDesc.VendorId);
if (IsIntel(adapterDesc.VendorId))
{
@@ -2403,6 +2404,11 @@ angle::WorkaroundsD3D GenerateWorkarounds(const Renderer11DeviceCaps &deviceCaps
}
}
+ if (IsAMD(adapterDesc.VendorId))
+ {
+ workarounds.disableB5G6R5Support = true;
+ }
+
// TODO(jmadill): Disable when we have a fixed driver version.
workarounds.emulateTinyStencilTextures = IsAMD(adapterDesc.VendorId);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp
index b4933ab6ecc..0c94b4ea0a1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp
@@ -1,7 +1,7 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_texture_format_table.py using data from texture_format_data.json
//
-// Copyright 2018 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.
//
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
index da4fabcb868..85011c4db28 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
@@ -133,6 +133,12 @@ std::vector<PathImpl *> Context9::createPaths(GLsizei)
return std::vector<PathImpl *>();
}
+MemoryObjectImpl *Context9::createMemoryObject()
+{
+ UNREACHABLE();
+ return nullptr;
+}
+
angle::Result Context9::flush(const gl::Context *context)
{
return mRenderer->flush(context);
@@ -207,7 +213,7 @@ angle::Result Context9::drawElementsIndirect(const gl::Context *context,
return angle::Result::Stop;
}
-GLenum Context9::getResetStatus()
+gl::GraphicsResetStatus Context9::getResetStatus()
{
return mRenderer->getResetStatus();
}
@@ -276,6 +282,7 @@ GLint64 Context9::getTimestamp()
angle::Result Context9::onMakeCurrent(const gl::Context *context)
{
+ mRenderer->getStateManager()->setAllDirtyBits();
return mRenderer->ensureVertexDataManagerInitialized(context);
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
index 944231ad992..2960671add8 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Context9.h
@@ -64,6 +64,9 @@ class Context9 : public ContextD3D
// Path object creation
std::vector<PathImpl *> createPaths(GLsizei) override;
+ // Memory object creation.
+ MemoryObjectImpl *createMemoryObject() override;
+
// Flush and finish.
angle::Result flush(const gl::Context *context) override;
angle::Result finish(const gl::Context *context) override;
@@ -106,7 +109,7 @@ class Context9 : public ContextD3D
const void *indirect) override;
// Device loss
- GLenum getResetStatus() override;
+ gl::GraphicsResetStatus getResetStatus() override;
// Vendor and description strings.
std::string getVendorString() const override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index 49a1d9ee53c..f4a4ce4375b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -194,7 +194,7 @@ void Renderer9::release()
egl::Error Renderer9::initialize()
{
TRACE_EVENT0("gpu.angle", "GetModuleHandle_d3d9");
- mD3d9Module = GetModuleHandle(TEXT("d3d9.dll"));
+ mD3d9Module = ::LoadLibrary(TEXT("d3d9.dll"));
if (mD3d9Module == nullptr)
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h
index bfad798ac03..2457303731a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/StateManager9.h
@@ -68,6 +68,7 @@ class StateManager9 final : angle::NonCopyable
int getRenderTargetWidth() const { return mRenderTargetBounds.width; }
int getRenderTargetHeight() const { return mRenderTargetBounds.height; }
+ void setAllDirtyBits() { mDirtyBits.set(); }
void resetDirtyBits() { mDirtyBits.reset(); }
private:
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py b/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py
index 2b0262fb9ff..0f48129c850 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gen_angle_format_table.py
@@ -5,6 +5,7 @@
#
# gen_angle_format_table.py:
# Code generation for ANGLE format map.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
#
import angle_format
@@ -90,11 +91,13 @@ const Format *GetFormatInfoTable()
}} // namespace angle
"""
+
def is_depth_stencil(angle_format):
if not 'channels' in angle_format or not angle_format['channels']:
return False
return 'd' in angle_format['channels'] or 's' in angle_format['channels']
+
def get_component_suffix(angle_format):
if angle_format['componentType'] == 'float':
return 'F'
@@ -102,6 +105,7 @@ def get_component_suffix(angle_format):
return 'S'
return ""
+
def get_channel_struct(angle_format):
if 'bits' not in angle_format or angle_format['bits'] is None:
return None
@@ -136,12 +140,14 @@ def get_channel_struct(angle_format):
return struct_name
+
def get_mip_generation_function(angle_format):
channel_struct = get_channel_struct(angle_format)
if is_depth_stencil(angle_format) or channel_struct == None or "BLOCK" in angle_format["id"]:
return 'nullptr'
return 'GenerateMip<' + channel_struct + '>'
+
def get_color_read_write_component_type(angle_format):
component_type_map = {
'uint': 'GLuint',
@@ -152,6 +158,7 @@ def get_color_read_write_component_type(angle_format):
}
return component_type_map[angle_format['componentType']]
+
def get_color_read_function(angle_format):
channel_struct = get_channel_struct(angle_format)
if channel_struct == None:
@@ -163,6 +170,7 @@ def get_color_read_function(angle_format):
read_component_type = get_color_read_write_component_type(angle_format)
return 'ReadColor<' + channel_struct + ', '+ read_component_type + '>'
+
def get_color_write_function(angle_format):
channel_struct = get_channel_struct(angle_format)
if channel_struct == None:
@@ -194,6 +202,7 @@ def get_named_component_type(component_type):
else:
raise ValueError("Unknown component type for " + component_type)
+
def get_component_alignment_mask(channels, bits):
if channels == None or bits == None:
return "std::numeric_limits<GLuint>::max()"
@@ -216,6 +225,7 @@ def get_component_alignment_mask(channels, bits):
# Can happen for 4-bit RGBA.
return "std::numeric_limits<GLuint>::max()"
+
def json_to_table_data(format_id, json, angle_to_gl):
table_data = ""
@@ -280,6 +290,7 @@ def json_to_table_data(format_id, json, angle_to_gl):
return format_entry_template.format(**parsed)
+
def parse_angle_format_table(all_angle, json_data, angle_to_gl):
table_data = ''
for format_id in sorted(all_angle):
@@ -289,6 +300,7 @@ def parse_angle_format_table(all_angle, json_data, angle_to_gl):
return table_data
+
def gen_enum_string(all_angle):
enum_data = ' NONE'
for format_id in sorted(all_angle):
@@ -301,6 +313,7 @@ case_template = """ case {gl_format}:
return FormatID::{angle_format};
"""
+
def gen_map_switch_string(gl_to_angle):
switch_data = '';
for gl_format in sorted(gl_to_angle.keys()):
@@ -312,33 +325,56 @@ def gen_map_switch_string(gl_to_angle):
switch_data += " return FormatID::NONE;"
return switch_data;
-gl_to_angle = angle_format.load_forward_table('angle_format_map.json')
-angle_to_gl = angle_format.load_inverse_table('angle_format_map.json')
-data_source_name = 'angle_format_data.json'
-json_data = angle_format.load_json(data_source_name)
-all_angle = angle_to_gl.keys()
-
-angle_format_cases = parse_angle_format_table(
- all_angle, json_data, angle_to_gl)
-switch_data = gen_map_switch_string(gl_to_angle)
-output_cpp = template_autogen_inl.format(
- script_name = sys.argv[0],
- copyright_year = date.today().year,
- angle_format_info_cases = angle_format_cases,
- angle_format_switch = switch_data,
- data_source_name = data_source_name)
-with open('Format_table_autogen.cpp', 'wt') as out_file:
- out_file.write(output_cpp)
- out_file.close()
-
-enum_data = gen_enum_string(all_angle)
-num_angle_formats = len(all_angle)
-output_h = template_autogen_h.format(
- script_name = sys.argv[0],
- copyright_year = date.today().year,
- angle_format_enum = enum_data,
- data_source_name = data_source_name,
- num_angle_formats = num_angle_formats)
-with open('FormatID_autogen.h', 'wt') as out_file:
- out_file.write(output_h)
- out_file.close()
+
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = ['angle_format.py', 'angle_format_data.json', 'angle_format_map.json']
+ outputs = ['Format_table_autogen.cpp', 'FormatID_autogen.h']
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ gl_to_angle = angle_format.load_forward_table('angle_format_map.json')
+ angle_to_gl = angle_format.load_inverse_table('angle_format_map.json')
+ data_source_name = 'angle_format_data.json'
+ json_data = angle_format.load_json(data_source_name)
+ all_angle = angle_to_gl.keys()
+
+ angle_format_cases = parse_angle_format_table(
+ all_angle, json_data, angle_to_gl)
+ switch_data = gen_map_switch_string(gl_to_angle)
+ output_cpp = template_autogen_inl.format(
+ script_name = sys.argv[0],
+ copyright_year = date.today().year,
+ angle_format_info_cases = angle_format_cases,
+ angle_format_switch = switch_data,
+ data_source_name = data_source_name)
+ with open('Format_table_autogen.cpp', 'wt') as out_file:
+ out_file.write(output_cpp)
+ out_file.close()
+
+ enum_data = gen_enum_string(all_angle)
+ num_angle_formats = len(all_angle)
+ output_h = template_autogen_h.format(
+ script_name = sys.argv[0],
+ copyright_year = date.today().year,
+ angle_format_enum = enum_data,
+ data_source_name = data_source_name,
+ num_angle_formats = num_angle_formats)
+ with open('FormatID_autogen.h', 'wt') as out_file:
+ out_file.write(output_h)
+ out_file.close()
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gen_load_functions_table.py b/chromium/third_party/angle/src/libANGLE/renderer/gen_load_functions_table.py
index 75c6c009a8b..4b08f0e8981 100755
--- a/chromium/third_party/angle/src/libANGLE/renderer/gen_load_functions_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gen_load_functions_table.py
@@ -7,6 +7,7 @@
# Code generation for the load function tables used for texture formats. These mappings are
# not renderer specific. The mappings are done from the GL internal format, to the ANGLE
# format ID, and then for the specific data type.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
#
import json, sys
@@ -85,6 +86,7 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum {internal_format}, FormatID {angle_fo
break;
}}
// clang-format on
+ ASSERT(internalFormat == GL_NONE || angleFormat == angle::FormatID::NONE);
static LoadFunctionMap emptyLoadFunctionsMap;
return emptyLoadFunctionsMap;
@@ -184,15 +186,35 @@ def parse_json(json_data):
return table_data, load_functions_data
-json_data = angle_format.load_json('load_functions_data.json')
+def main():
-switch_data, load_functions_data = parse_json(json_data)
-output = template.format(internal_format = internal_format_param,
- angle_format = angle_format_param,
- switch_data = switch_data,
- load_functions_data = load_functions_data,
- copyright_year = date.today().year)
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = ['load_functions_data.json']
+ outputs = ['load_functions_table_autogen.cpp']
-with open('load_functions_table_autogen.cpp', 'wt') as out_file:
- out_file.write(output)
- out_file.close()
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ json_data = angle_format.load_json('load_functions_data.json')
+
+ switch_data, load_functions_data = parse_json(json_data)
+ output = template.format(internal_format = internal_format_param,
+ angle_format = angle_format_param,
+ switch_data = switch_data,
+ load_functions_data = load_functions_data,
+ copyright_year = date.today().year)
+
+ with open('load_functions_table_autogen.cpp', 'wt') as out_file:
+ out_file.write(output)
+ out_file.close()
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.cpp
index c494c7afba3..9af41d804a9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.cpp
@@ -40,18 +40,9 @@ void ClearMultiviewGL::clearMultiviewFBO(const gl::FramebufferState &state,
GLint stencil)
{
const gl::FramebufferAttachment *firstAttachment = state.getFirstNonNullAttachment();
- switch (firstAttachment->getMultiviewLayout())
+ if (firstAttachment->isMultiview())
{
- case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
- clearLayeredFBO(state, clearCommandType, mask, buffer, drawbuffer, values, depth,
- stencil);
- break;
- case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
- clearSideBySideFBO(state, scissorBase, clearCommandType, mask, buffer, drawbuffer,
- values, depth, stencil);
- break;
- default:
- UNREACHABLE();
+ clearLayeredFBO(state, clearCommandType, mask, buffer, drawbuffer, values, depth, stencil);
}
}
@@ -69,7 +60,7 @@ void ClearMultiviewGL::clearLayeredFBO(const gl::FramebufferState &state,
mStateManager->bindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
const gl::FramebufferAttachment *firstAttachment = state.getFirstNonNullAttachment();
- ASSERT(firstAttachment->getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE);
+ ASSERT(firstAttachment->isMultiview());
const auto &drawBuffers = state.getDrawBufferStates();
mFunctions->drawBuffers(static_cast<GLsizei>(drawBuffers.size()), drawBuffers.data());
@@ -86,30 +77,6 @@ void ClearMultiviewGL::clearLayeredFBO(const gl::FramebufferState &state,
detachTextures(state);
}
-void ClearMultiviewGL::clearSideBySideFBO(const gl::FramebufferState &state,
- const gl::Rectangle &scissorBase,
- ClearCommandType clearCommandType,
- GLbitfield mask,
- GLenum buffer,
- GLint drawbuffer,
- const uint8_t *values,
- GLfloat depth,
- GLint stencil)
-{
- const gl::FramebufferAttachment *firstAttachment = state.getFirstNonNullAttachment();
- ASSERT(firstAttachment->getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE);
-
- const auto &viewportOffsets = firstAttachment->getMultiviewViewportOffsets();
- for (size_t i = 0u; i < viewportOffsets.size(); ++i)
- {
- gl::Rectangle scissor(scissorBase.x + viewportOffsets[i].x,
- scissorBase.y + viewportOffsets[i].y, scissorBase.width,
- scissorBase.height);
- mStateManager->setScissorIndexed(0u, scissor);
- genericClear(clearCommandType, mask, buffer, drawbuffer, values, depth, stencil);
- }
-}
-
void ClearMultiviewGL::genericClear(ClearCommandType clearCommandType,
GLbitfield mask,
GLenum buffer,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.h
index cdbbfad1327..b6c30afee6e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ClearMultiviewGL.h
@@ -68,15 +68,6 @@ class ClearMultiviewGL : angle::NonCopyable
const uint8_t *values,
GLfloat depth,
GLint stencil);
- void clearSideBySideFBO(const gl::FramebufferState &state,
- const gl::Rectangle &scissorBase,
- ClearCommandType clearCommandType,
- GLbitfield mask,
- GLenum buffer,
- GLint drawbuffer,
- const uint8_t *values,
- GLfloat depth,
- GLint stencil);
void genericClear(ClearCommandType clearCommandType,
GLbitfield mask,
GLenum buffer,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
index 14464ccdaa6..bb3b4aa2252 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.cpp
@@ -168,6 +168,12 @@ std::vector<PathImpl *> ContextGL::createPaths(GLsizei range)
return ret;
}
+MemoryObjectImpl *ContextGL::createMemoryObject()
+{
+ UNREACHABLE();
+ return nullptr;
+}
+
angle::Result ContextGL::flush(const gl::Context *context)
{
return mRenderer->flush();
@@ -478,7 +484,7 @@ void ContextGL::stencilThenCoverStrokePathInstanced(const std::vector<gl::Path *
transformType, transformValues);
}
-GLenum ContextGL::getResetStatus()
+gl::GraphicsResetStatus ContextGL::getResetStatus()
{
return mRenderer->getResetStatus();
}
@@ -608,4 +614,10 @@ angle::Result ContextGL::memoryBarrierByRegion(const gl::Context *context, GLbit
{
return mRenderer->memoryBarrierByRegion(barriers);
}
+
+void ContextGL::setMaxShaderCompilerThreads(GLuint count)
+{
+ mRenderer->setMaxShaderCompilerThreads(count);
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
index 263e40f5fcb..eebc5e26965 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ContextGL.h
@@ -75,6 +75,9 @@ class ContextGL : public ContextImpl
// Path object creation
std::vector<PathImpl *> createPaths(GLsizei range) override;
+ // Memory object creation.
+ MemoryObjectImpl *createMemoryObject() override;
+
// Flush and finish.
angle::Result flush(const gl::Context *context) override;
angle::Result finish(const gl::Context *context) override;
@@ -161,7 +164,7 @@ class ContextGL : public ContextImpl
const GLfloat *transformValues) override;
// Device loss
- GLenum getResetStatus() override;
+ gl::GraphicsResetStatus getResetStatus() override;
// Vendor and description strings.
std::string getVendorString() const override;
@@ -213,6 +216,8 @@ class ContextGL : public ContextImpl
angle::Result memoryBarrier(const gl::Context *context, GLbitfield barriers) override;
angle::Result memoryBarrierByRegion(const gl::Context *context, GLbitfield barriers) override;
+ void setMaxShaderCompilerThreads(GLuint count) override;
+
private:
angle::Result setDrawArraysState(const gl::Context *context,
GLint first,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp
index 754cfe7d8b1..3d9161d45a6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp
@@ -1128,6 +1128,11 @@ void DispatchTableGL::initProcsDesktopGL(const gl::Version &version,
ASSIGN("glIsQueryARB", isQuery);
}
+ if (extensions.count("GL_ARB_parallel_shader_compile") != 0)
+ {
+ ASSIGN("glMaxShaderCompilerThreadsARB", maxShaderCompilerThreadsARB);
+ }
+
if (extensions.count("GL_ARB_point_parameters") != 0)
{
ASSIGN("glPointParameterfARB", pointParameterf);
@@ -2699,6 +2704,11 @@ void DispatchTableGL::initProcsSharedExtensions(const std::set<std::string> &ext
ASSIGN("glValidateProgramPipelineEXT", validateProgramPipeline);
}
+ if (extensions.count("GL_KHR_parallel_shader_compile") != 0)
+ {
+ ASSIGN("glMaxShaderCompilerThreadsKHR", maxShaderCompilerThreadsKHR);
+ }
+
if (extensions.count("GL_NV_fence") != 0)
{
ASSIGN("glDeleteFencesNV", deleteFencesNV);
@@ -2746,6 +2756,11 @@ void DispatchTableGL::initProcsSharedExtensions(const std::set<std::string> &ext
ASSIGN("glStencilThenCoverStrokePathInstancedNV", stencilThenCoverStrokePathInstancedNV);
ASSIGN("glStencilThenCoverStrokePathNV", stencilThenCoverStrokePathNV);
}
+
+ if (extensions.count("GL_OVR_multiview") != 0)
+ {
+ ASSIGN("glFramebufferTextureMultiviewOVR", framebufferTextureMultiviewOVR);
+ }
}
#if defined(ANGLE_ENABLE_OPENGL_NULL)
@@ -3849,6 +3864,11 @@ void DispatchTableGL::initProcsDesktopGLNULL(const gl::Version &version,
isQuery = &glIsQueryNULL;
}
+ if (extensions.count("GL_ARB_parallel_shader_compile") != 0)
+ {
+ maxShaderCompilerThreadsARB = &glMaxShaderCompilerThreadsARBNULL;
+ }
+
if (extensions.count("GL_ARB_point_parameters") != 0)
{
pointParameterf = &glPointParameterfNULL;
@@ -5419,6 +5439,11 @@ void DispatchTableGL::initProcsSharedExtensionsNULL(const std::set<std::string>
validateProgramPipeline = &glValidateProgramPipelineNULL;
}
+ if (extensions.count("GL_KHR_parallel_shader_compile") != 0)
+ {
+ maxShaderCompilerThreadsKHR = &glMaxShaderCompilerThreadsKHRNULL;
+ }
+
if (extensions.count("GL_NV_fence") != 0)
{
deleteFencesNV = &glDeleteFencesNVNULL;
@@ -5466,6 +5491,11 @@ void DispatchTableGL::initProcsSharedExtensionsNULL(const std::set<std::string>
stencilThenCoverStrokePathInstancedNV = &glStencilThenCoverStrokePathInstancedNVNULL;
stencilThenCoverStrokePathNV = &glStencilThenCoverStrokePathNVNULL;
}
+
+ if (extensions.count("GL_OVR_multiview") != 0)
+ {
+ framebufferTextureMultiviewOVR = &glFramebufferTextureMultiviewOVRNULL;
+ }
}
#endif // defined(ANGLE_ENABLE_OPENGL_NULL)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h
index b32ae5190f5..f6f044a9eb3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/DispatchTableGL_autogen.h
@@ -26,223 +26,224 @@ namespace rx
class DispatchTableGL : angle::NonCopyable
{
public:
+ // clang-format off
// 1.0
- PFNGLBLENDFUNCPROC blendFunc = nullptr;
- PFNGLCLEARPROC clear = nullptr;
- PFNGLCLEARCOLORPROC clearColor = nullptr;
- PFNGLCLEARDEPTHPROC clearDepth = nullptr;
- PFNGLCLEARSTENCILPROC clearStencil = nullptr;
- PFNGLCOLORMASKPROC colorMask = nullptr;
- PFNGLCULLFACEPROC cullFace = nullptr;
- PFNGLDEPTHFUNCPROC depthFunc = nullptr;
- PFNGLDEPTHMASKPROC depthMask = nullptr;
- PFNGLDEPTHRANGEPROC depthRange = nullptr;
- PFNGLDISABLEPROC disable = nullptr;
- PFNGLDRAWBUFFERPROC drawBuffer = nullptr;
- PFNGLENABLEPROC enable = nullptr;
- PFNGLFINISHPROC finish = nullptr;
- PFNGLFLUSHPROC flush = nullptr;
- PFNGLFRONTFACEPROC frontFace = nullptr;
- PFNGLGETBOOLEANVPROC getBooleanv = nullptr;
- PFNGLGETDOUBLEVPROC getDoublev = nullptr;
- PFNGLGETERRORPROC getError = nullptr;
- PFNGLGETFLOATVPROC getFloatv = nullptr;
- PFNGLGETINTEGERVPROC getIntegerv = nullptr;
- PFNGLGETSTRINGPROC getString = nullptr;
- PFNGLGETTEXIMAGEPROC getTexImage = nullptr;
+ PFNGLBLENDFUNCPROC blendFunc = nullptr;
+ PFNGLCLEARPROC clear = nullptr;
+ PFNGLCLEARCOLORPROC clearColor = nullptr;
+ PFNGLCLEARDEPTHPROC clearDepth = nullptr;
+ PFNGLCLEARSTENCILPROC clearStencil = nullptr;
+ PFNGLCOLORMASKPROC colorMask = nullptr;
+ PFNGLCULLFACEPROC cullFace = nullptr;
+ PFNGLDEPTHFUNCPROC depthFunc = nullptr;
+ PFNGLDEPTHMASKPROC depthMask = nullptr;
+ PFNGLDEPTHRANGEPROC depthRange = nullptr;
+ PFNGLDISABLEPROC disable = nullptr;
+ PFNGLDRAWBUFFERPROC drawBuffer = nullptr;
+ PFNGLENABLEPROC enable = nullptr;
+ PFNGLFINISHPROC finish = nullptr;
+ PFNGLFLUSHPROC flush = nullptr;
+ PFNGLFRONTFACEPROC frontFace = nullptr;
+ PFNGLGETBOOLEANVPROC getBooleanv = nullptr;
+ PFNGLGETDOUBLEVPROC getDoublev = nullptr;
+ PFNGLGETERRORPROC getError = nullptr;
+ PFNGLGETFLOATVPROC getFloatv = nullptr;
+ PFNGLGETINTEGERVPROC getIntegerv = nullptr;
+ PFNGLGETSTRINGPROC getString = nullptr;
+ PFNGLGETTEXIMAGEPROC getTexImage = nullptr;
PFNGLGETTEXLEVELPARAMETERFVPROC getTexLevelParameterfv = nullptr;
PFNGLGETTEXLEVELPARAMETERIVPROC getTexLevelParameteriv = nullptr;
- PFNGLGETTEXPARAMETERFVPROC getTexParameterfv = nullptr;
- PFNGLGETTEXPARAMETERIVPROC getTexParameteriv = nullptr;
- PFNGLHINTPROC hint = nullptr;
- PFNGLISENABLEDPROC isEnabled = nullptr;
- PFNGLLINEWIDTHPROC lineWidth = nullptr;
- PFNGLLOGICOPPROC logicOp = nullptr;
- PFNGLPIXELSTOREFPROC pixelStoref = nullptr;
- PFNGLPIXELSTOREIPROC pixelStorei = nullptr;
- PFNGLPOINTSIZEPROC pointSize = nullptr;
- PFNGLPOLYGONMODEPROC polygonMode = nullptr;
- PFNGLREADBUFFERPROC readBuffer = nullptr;
- PFNGLREADPIXELSPROC readPixels = nullptr;
- PFNGLSCISSORPROC scissor = nullptr;
- PFNGLSTENCILFUNCPROC stencilFunc = nullptr;
- PFNGLSTENCILMASKPROC stencilMask = nullptr;
- PFNGLSTENCILOPPROC stencilOp = nullptr;
- PFNGLTEXIMAGE1DPROC texImage1D = nullptr;
- PFNGLTEXIMAGE2DPROC texImage2D = nullptr;
- PFNGLTEXPARAMETERFPROC texParameterf = nullptr;
- PFNGLTEXPARAMETERFVPROC texParameterfv = nullptr;
- PFNGLTEXPARAMETERIPROC texParameteri = nullptr;
- PFNGLTEXPARAMETERIVPROC texParameteriv = nullptr;
- PFNGLVIEWPORTPROC viewport = nullptr;
+ PFNGLGETTEXPARAMETERFVPROC getTexParameterfv = nullptr;
+ PFNGLGETTEXPARAMETERIVPROC getTexParameteriv = nullptr;
+ PFNGLHINTPROC hint = nullptr;
+ PFNGLISENABLEDPROC isEnabled = nullptr;
+ PFNGLLINEWIDTHPROC lineWidth = nullptr;
+ PFNGLLOGICOPPROC logicOp = nullptr;
+ PFNGLPIXELSTOREFPROC pixelStoref = nullptr;
+ PFNGLPIXELSTOREIPROC pixelStorei = nullptr;
+ PFNGLPOINTSIZEPROC pointSize = nullptr;
+ PFNGLPOLYGONMODEPROC polygonMode = nullptr;
+ PFNGLREADBUFFERPROC readBuffer = nullptr;
+ PFNGLREADPIXELSPROC readPixels = nullptr;
+ PFNGLSCISSORPROC scissor = nullptr;
+ PFNGLSTENCILFUNCPROC stencilFunc = nullptr;
+ PFNGLSTENCILMASKPROC stencilMask = nullptr;
+ PFNGLSTENCILOPPROC stencilOp = nullptr;
+ PFNGLTEXIMAGE1DPROC texImage1D = nullptr;
+ PFNGLTEXIMAGE2DPROC texImage2D = nullptr;
+ PFNGLTEXPARAMETERFPROC texParameterf = nullptr;
+ PFNGLTEXPARAMETERFVPROC texParameterfv = nullptr;
+ PFNGLTEXPARAMETERIPROC texParameteri = nullptr;
+ PFNGLTEXPARAMETERIVPROC texParameteriv = nullptr;
+ PFNGLVIEWPORTPROC viewport = nullptr;
// 1.1
- PFNGLBINDTEXTUREPROC bindTexture = nullptr;
- PFNGLCOPYTEXIMAGE1DPROC copyTexImage1D = nullptr;
- PFNGLCOPYTEXIMAGE2DPROC copyTexImage2D = nullptr;
+ PFNGLBINDTEXTUREPROC bindTexture = nullptr;
+ PFNGLCOPYTEXIMAGE1DPROC copyTexImage1D = nullptr;
+ PFNGLCOPYTEXIMAGE2DPROC copyTexImage2D = nullptr;
PFNGLCOPYTEXSUBIMAGE1DPROC copyTexSubImage1D = nullptr;
PFNGLCOPYTEXSUBIMAGE2DPROC copyTexSubImage2D = nullptr;
- PFNGLDELETETEXTURESPROC deleteTextures = nullptr;
- PFNGLDRAWARRAYSPROC drawArrays = nullptr;
- PFNGLDRAWELEMENTSPROC drawElements = nullptr;
- PFNGLGENTEXTURESPROC genTextures = nullptr;
- PFNGLISTEXTUREPROC isTexture = nullptr;
- PFNGLPOLYGONOFFSETPROC polygonOffset = nullptr;
- PFNGLTEXSUBIMAGE1DPROC texSubImage1D = nullptr;
- PFNGLTEXSUBIMAGE2DPROC texSubImage2D = nullptr;
+ PFNGLDELETETEXTURESPROC deleteTextures = nullptr;
+ PFNGLDRAWARRAYSPROC drawArrays = nullptr;
+ PFNGLDRAWELEMENTSPROC drawElements = nullptr;
+ PFNGLGENTEXTURESPROC genTextures = nullptr;
+ PFNGLISTEXTUREPROC isTexture = nullptr;
+ PFNGLPOLYGONOFFSETPROC polygonOffset = nullptr;
+ PFNGLTEXSUBIMAGE1DPROC texSubImage1D = nullptr;
+ PFNGLTEXSUBIMAGE2DPROC texSubImage2D = nullptr;
// 1.2
- PFNGLBLENDCOLORPROC blendColor = nullptr;
- PFNGLBLENDEQUATIONPROC blendEquation = nullptr;
+ PFNGLBLENDCOLORPROC blendColor = nullptr;
+ PFNGLBLENDEQUATIONPROC blendEquation = nullptr;
PFNGLCOPYTEXSUBIMAGE3DPROC copyTexSubImage3D = nullptr;
PFNGLDRAWRANGEELEMENTSPROC drawRangeElements = nullptr;
- PFNGLTEXIMAGE3DPROC texImage3D = nullptr;
- PFNGLTEXSUBIMAGE3DPROC texSubImage3D = nullptr;
+ PFNGLTEXIMAGE3DPROC texImage3D = nullptr;
+ PFNGLTEXSUBIMAGE3DPROC texSubImage3D = nullptr;
// 1.2 Extensions
PFNGLDELETEFENCESNVPROC deleteFencesNV = nullptr;
- PFNGLFINISHFENCENVPROC finishFenceNV = nullptr;
- PFNGLGENFENCESNVPROC genFencesNV = nullptr;
- PFNGLGETFENCEIVNVPROC getFenceivNV = nullptr;
- PFNGLISFENCENVPROC isFenceNV = nullptr;
- PFNGLSETFENCENVPROC setFenceNV = nullptr;
- PFNGLTESTFENCENVPROC testFenceNV = nullptr;
+ PFNGLFINISHFENCENVPROC finishFenceNV = nullptr;
+ PFNGLGENFENCESNVPROC genFencesNV = nullptr;
+ PFNGLGETFENCEIVNVPROC getFenceivNV = nullptr;
+ PFNGLISFENCENVPROC isFenceNV = nullptr;
+ PFNGLSETFENCENVPROC setFenceNV = nullptr;
+ PFNGLTESTFENCENVPROC testFenceNV = nullptr;
// 1.3
- PFNGLACTIVETEXTUREPROC activeTexture = nullptr;
- PFNGLCOMPRESSEDTEXIMAGE1DPROC compressedTexImage1D = nullptr;
- PFNGLCOMPRESSEDTEXIMAGE2DPROC compressedTexImage2D = nullptr;
- PFNGLCOMPRESSEDTEXIMAGE3DPROC compressedTexImage3D = nullptr;
+ PFNGLACTIVETEXTUREPROC activeTexture = nullptr;
+ PFNGLCOMPRESSEDTEXIMAGE1DPROC compressedTexImage1D = nullptr;
+ PFNGLCOMPRESSEDTEXIMAGE2DPROC compressedTexImage2D = nullptr;
+ PFNGLCOMPRESSEDTEXIMAGE3DPROC compressedTexImage3D = nullptr;
PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC compressedTexSubImage1D = nullptr;
PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC compressedTexSubImage2D = nullptr;
PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC compressedTexSubImage3D = nullptr;
- PFNGLGETCOMPRESSEDTEXIMAGEPROC getCompressedTexImage = nullptr;
- PFNGLSAMPLECOVERAGEPROC sampleCoverage = nullptr;
+ PFNGLGETCOMPRESSEDTEXIMAGEPROC getCompressedTexImage = nullptr;
+ PFNGLSAMPLECOVERAGEPROC sampleCoverage = nullptr;
// 1.4
PFNGLBLENDFUNCSEPARATEPROC blendFuncSeparate = nullptr;
- PFNGLMULTIDRAWARRAYSPROC multiDrawArrays = nullptr;
+ PFNGLMULTIDRAWARRAYSPROC multiDrawArrays = nullptr;
PFNGLMULTIDRAWELEMENTSPROC multiDrawElements = nullptr;
- PFNGLPOINTPARAMETERFPROC pointParameterf = nullptr;
- PFNGLPOINTPARAMETERFVPROC pointParameterfv = nullptr;
- PFNGLPOINTPARAMETERIPROC pointParameteri = nullptr;
- PFNGLPOINTPARAMETERIVPROC pointParameteriv = nullptr;
+ PFNGLPOINTPARAMETERFPROC pointParameterf = nullptr;
+ PFNGLPOINTPARAMETERFVPROC pointParameterfv = nullptr;
+ PFNGLPOINTPARAMETERIPROC pointParameteri = nullptr;
+ PFNGLPOINTPARAMETERIVPROC pointParameteriv = nullptr;
// 1.5
- PFNGLBEGINQUERYPROC beginQuery = nullptr;
- PFNGLBINDBUFFERPROC bindBuffer = nullptr;
- PFNGLBUFFERDATAPROC bufferData = nullptr;
- PFNGLBUFFERSUBDATAPROC bufferSubData = nullptr;
- PFNGLDELETEBUFFERSPROC deleteBuffers = nullptr;
- PFNGLDELETEQUERIESPROC deleteQueries = nullptr;
- PFNGLENDQUERYPROC endQuery = nullptr;
- PFNGLGENBUFFERSPROC genBuffers = nullptr;
- PFNGLGENQUERIESPROC genQueries = nullptr;
+ PFNGLBEGINQUERYPROC beginQuery = nullptr;
+ PFNGLBINDBUFFERPROC bindBuffer = nullptr;
+ PFNGLBUFFERDATAPROC bufferData = nullptr;
+ PFNGLBUFFERSUBDATAPROC bufferSubData = nullptr;
+ PFNGLDELETEBUFFERSPROC deleteBuffers = nullptr;
+ PFNGLDELETEQUERIESPROC deleteQueries = nullptr;
+ PFNGLENDQUERYPROC endQuery = nullptr;
+ PFNGLGENBUFFERSPROC genBuffers = nullptr;
+ PFNGLGENQUERIESPROC genQueries = nullptr;
PFNGLGETBUFFERPARAMETERIVPROC getBufferParameteriv = nullptr;
- PFNGLGETBUFFERPOINTERVPROC getBufferPointerv = nullptr;
- PFNGLGETBUFFERSUBDATAPROC getBufferSubData = nullptr;
- PFNGLGETQUERYOBJECTIVPROC getQueryObjectiv = nullptr;
- PFNGLGETQUERYOBJECTUIVPROC getQueryObjectuiv = nullptr;
- PFNGLGETQUERYIVPROC getQueryiv = nullptr;
- PFNGLISBUFFERPROC isBuffer = nullptr;
- PFNGLISQUERYPROC isQuery = nullptr;
- PFNGLMAPBUFFERPROC mapBuffer = nullptr;
- PFNGLUNMAPBUFFERPROC unmapBuffer = nullptr;
+ PFNGLGETBUFFERPOINTERVPROC getBufferPointerv = nullptr;
+ PFNGLGETBUFFERSUBDATAPROC getBufferSubData = nullptr;
+ PFNGLGETQUERYOBJECTIVPROC getQueryObjectiv = nullptr;
+ PFNGLGETQUERYOBJECTUIVPROC getQueryObjectuiv = nullptr;
+ PFNGLGETQUERYIVPROC getQueryiv = nullptr;
+ PFNGLISBUFFERPROC isBuffer = nullptr;
+ PFNGLISQUERYPROC isQuery = nullptr;
+ PFNGLMAPBUFFERPROC mapBuffer = nullptr;
+ PFNGLUNMAPBUFFERPROC unmapBuffer = nullptr;
// 2.0
- PFNGLATTACHSHADERPROC attachShader = nullptr;
- PFNGLBINDATTRIBLOCATIONPROC bindAttribLocation = nullptr;
- PFNGLBLENDEQUATIONSEPARATEPROC blendEquationSeparate = nullptr;
- PFNGLCOMPILESHADERPROC compileShader = nullptr;
- PFNGLCREATEPROGRAMPROC createProgram = nullptr;
- PFNGLCREATESHADERPROC createShader = nullptr;
- PFNGLDELETEPROGRAMPROC deleteProgram = nullptr;
- PFNGLDELETESHADERPROC deleteShader = nullptr;
- PFNGLDETACHSHADERPROC detachShader = nullptr;
+ PFNGLATTACHSHADERPROC attachShader = nullptr;
+ PFNGLBINDATTRIBLOCATIONPROC bindAttribLocation = nullptr;
+ PFNGLBLENDEQUATIONSEPARATEPROC blendEquationSeparate = nullptr;
+ PFNGLCOMPILESHADERPROC compileShader = nullptr;
+ PFNGLCREATEPROGRAMPROC createProgram = nullptr;
+ PFNGLCREATESHADERPROC createShader = nullptr;
+ PFNGLDELETEPROGRAMPROC deleteProgram = nullptr;
+ PFNGLDELETESHADERPROC deleteShader = nullptr;
+ PFNGLDETACHSHADERPROC detachShader = nullptr;
PFNGLDISABLEVERTEXATTRIBARRAYPROC disableVertexAttribArray = nullptr;
- PFNGLDRAWBUFFERSPROC drawBuffers = nullptr;
- PFNGLENABLEVERTEXATTRIBARRAYPROC enableVertexAttribArray = nullptr;
- PFNGLGETACTIVEATTRIBPROC getActiveAttrib = nullptr;
- PFNGLGETACTIVEUNIFORMPROC getActiveUniform = nullptr;
- PFNGLGETATTACHEDSHADERSPROC getAttachedShaders = nullptr;
- PFNGLGETATTRIBLOCATIONPROC getAttribLocation = nullptr;
- PFNGLGETPROGRAMINFOLOGPROC getProgramInfoLog = nullptr;
- PFNGLGETPROGRAMIVPROC getProgramiv = nullptr;
- PFNGLGETSHADERINFOLOGPROC getShaderInfoLog = nullptr;
- PFNGLGETSHADERSOURCEPROC getShaderSource = nullptr;
- PFNGLGETSHADERIVPROC getShaderiv = nullptr;
- PFNGLGETUNIFORMLOCATIONPROC getUniformLocation = nullptr;
- PFNGLGETUNIFORMFVPROC getUniformfv = nullptr;
- PFNGLGETUNIFORMIVPROC getUniformiv = nullptr;
- PFNGLGETVERTEXATTRIBPOINTERVPROC getVertexAttribPointerv = nullptr;
- PFNGLGETVERTEXATTRIBDVPROC getVertexAttribdv = nullptr;
- PFNGLGETVERTEXATTRIBFVPROC getVertexAttribfv = nullptr;
- PFNGLGETVERTEXATTRIBIVPROC getVertexAttribiv = nullptr;
- PFNGLISPROGRAMPROC isProgram = nullptr;
- PFNGLISSHADERPROC isShader = nullptr;
- PFNGLLINKPROGRAMPROC linkProgram = nullptr;
- PFNGLSHADERSOURCEPROC shaderSource = nullptr;
- PFNGLSTENCILFUNCSEPARATEPROC stencilFuncSeparate = nullptr;
- PFNGLSTENCILMASKSEPARATEPROC stencilMaskSeparate = nullptr;
- PFNGLSTENCILOPSEPARATEPROC stencilOpSeparate = nullptr;
- PFNGLUNIFORM1FPROC uniform1f = nullptr;
- PFNGLUNIFORM1FVPROC uniform1fv = nullptr;
- PFNGLUNIFORM1IPROC uniform1i = nullptr;
- PFNGLUNIFORM1IVPROC uniform1iv = nullptr;
- PFNGLUNIFORM2FPROC uniform2f = nullptr;
- PFNGLUNIFORM2FVPROC uniform2fv = nullptr;
- PFNGLUNIFORM2IPROC uniform2i = nullptr;
- PFNGLUNIFORM2IVPROC uniform2iv = nullptr;
- PFNGLUNIFORM3FPROC uniform3f = nullptr;
- PFNGLUNIFORM3FVPROC uniform3fv = nullptr;
- PFNGLUNIFORM3IPROC uniform3i = nullptr;
- PFNGLUNIFORM3IVPROC uniform3iv = nullptr;
- PFNGLUNIFORM4FPROC uniform4f = nullptr;
- PFNGLUNIFORM4FVPROC uniform4fv = nullptr;
- PFNGLUNIFORM4IPROC uniform4i = nullptr;
- PFNGLUNIFORM4IVPROC uniform4iv = nullptr;
- PFNGLUNIFORMMATRIX2FVPROC uniformMatrix2fv = nullptr;
- PFNGLUNIFORMMATRIX3FVPROC uniformMatrix3fv = nullptr;
- PFNGLUNIFORMMATRIX4FVPROC uniformMatrix4fv = nullptr;
- PFNGLUSEPROGRAMPROC useProgram = nullptr;
- PFNGLVALIDATEPROGRAMPROC validateProgram = nullptr;
- PFNGLVERTEXATTRIB1DPROC vertexAttrib1d = nullptr;
- PFNGLVERTEXATTRIB1DVPROC vertexAttrib1dv = nullptr;
- PFNGLVERTEXATTRIB1FPROC vertexAttrib1f = nullptr;
- PFNGLVERTEXATTRIB1FVPROC vertexAttrib1fv = nullptr;
- PFNGLVERTEXATTRIB1SPROC vertexAttrib1s = nullptr;
- PFNGLVERTEXATTRIB1SVPROC vertexAttrib1sv = nullptr;
- PFNGLVERTEXATTRIB2DPROC vertexAttrib2d = nullptr;
- PFNGLVERTEXATTRIB2DVPROC vertexAttrib2dv = nullptr;
- PFNGLVERTEXATTRIB2FPROC vertexAttrib2f = nullptr;
- PFNGLVERTEXATTRIB2FVPROC vertexAttrib2fv = nullptr;
- PFNGLVERTEXATTRIB2SPROC vertexAttrib2s = nullptr;
- PFNGLVERTEXATTRIB2SVPROC vertexAttrib2sv = nullptr;
- PFNGLVERTEXATTRIB3DPROC vertexAttrib3d = nullptr;
- PFNGLVERTEXATTRIB3DVPROC vertexAttrib3dv = nullptr;
- PFNGLVERTEXATTRIB3FPROC vertexAttrib3f = nullptr;
- PFNGLVERTEXATTRIB3FVPROC vertexAttrib3fv = nullptr;
- PFNGLVERTEXATTRIB3SPROC vertexAttrib3s = nullptr;
- PFNGLVERTEXATTRIB3SVPROC vertexAttrib3sv = nullptr;
- PFNGLVERTEXATTRIB4NBVPROC vertexAttrib4Nbv = nullptr;
- PFNGLVERTEXATTRIB4NIVPROC vertexAttrib4Niv = nullptr;
- PFNGLVERTEXATTRIB4NSVPROC vertexAttrib4Nsv = nullptr;
- PFNGLVERTEXATTRIB4NUBPROC vertexAttrib4Nub = nullptr;
- PFNGLVERTEXATTRIB4NUBVPROC vertexAttrib4Nubv = nullptr;
- PFNGLVERTEXATTRIB4NUIVPROC vertexAttrib4Nuiv = nullptr;
- PFNGLVERTEXATTRIB4NUSVPROC vertexAttrib4Nusv = nullptr;
- PFNGLVERTEXATTRIB4BVPROC vertexAttrib4bv = nullptr;
- PFNGLVERTEXATTRIB4DPROC vertexAttrib4d = nullptr;
- PFNGLVERTEXATTRIB4DVPROC vertexAttrib4dv = nullptr;
- PFNGLVERTEXATTRIB4FPROC vertexAttrib4f = nullptr;
- PFNGLVERTEXATTRIB4FVPROC vertexAttrib4fv = nullptr;
- PFNGLVERTEXATTRIB4IVPROC vertexAttrib4iv = nullptr;
- PFNGLVERTEXATTRIB4SPROC vertexAttrib4s = nullptr;
- PFNGLVERTEXATTRIB4SVPROC vertexAttrib4sv = nullptr;
- PFNGLVERTEXATTRIB4UBVPROC vertexAttrib4ubv = nullptr;
- PFNGLVERTEXATTRIB4UIVPROC vertexAttrib4uiv = nullptr;
- PFNGLVERTEXATTRIB4USVPROC vertexAttrib4usv = nullptr;
- PFNGLVERTEXATTRIBPOINTERPROC vertexAttribPointer = nullptr;
+ PFNGLDRAWBUFFERSPROC drawBuffers = nullptr;
+ PFNGLENABLEVERTEXATTRIBARRAYPROC enableVertexAttribArray = nullptr;
+ PFNGLGETACTIVEATTRIBPROC getActiveAttrib = nullptr;
+ PFNGLGETACTIVEUNIFORMPROC getActiveUniform = nullptr;
+ PFNGLGETATTACHEDSHADERSPROC getAttachedShaders = nullptr;
+ PFNGLGETATTRIBLOCATIONPROC getAttribLocation = nullptr;
+ PFNGLGETPROGRAMINFOLOGPROC getProgramInfoLog = nullptr;
+ PFNGLGETPROGRAMIVPROC getProgramiv = nullptr;
+ PFNGLGETSHADERINFOLOGPROC getShaderInfoLog = nullptr;
+ PFNGLGETSHADERSOURCEPROC getShaderSource = nullptr;
+ PFNGLGETSHADERIVPROC getShaderiv = nullptr;
+ PFNGLGETUNIFORMLOCATIONPROC getUniformLocation = nullptr;
+ PFNGLGETUNIFORMFVPROC getUniformfv = nullptr;
+ PFNGLGETUNIFORMIVPROC getUniformiv = nullptr;
+ PFNGLGETVERTEXATTRIBPOINTERVPROC getVertexAttribPointerv = nullptr;
+ PFNGLGETVERTEXATTRIBDVPROC getVertexAttribdv = nullptr;
+ PFNGLGETVERTEXATTRIBFVPROC getVertexAttribfv = nullptr;
+ PFNGLGETVERTEXATTRIBIVPROC getVertexAttribiv = nullptr;
+ PFNGLISPROGRAMPROC isProgram = nullptr;
+ PFNGLISSHADERPROC isShader = nullptr;
+ PFNGLLINKPROGRAMPROC linkProgram = nullptr;
+ PFNGLSHADERSOURCEPROC shaderSource = nullptr;
+ PFNGLSTENCILFUNCSEPARATEPROC stencilFuncSeparate = nullptr;
+ PFNGLSTENCILMASKSEPARATEPROC stencilMaskSeparate = nullptr;
+ PFNGLSTENCILOPSEPARATEPROC stencilOpSeparate = nullptr;
+ PFNGLUNIFORM1FPROC uniform1f = nullptr;
+ PFNGLUNIFORM1FVPROC uniform1fv = nullptr;
+ PFNGLUNIFORM1IPROC uniform1i = nullptr;
+ PFNGLUNIFORM1IVPROC uniform1iv = nullptr;
+ PFNGLUNIFORM2FPROC uniform2f = nullptr;
+ PFNGLUNIFORM2FVPROC uniform2fv = nullptr;
+ PFNGLUNIFORM2IPROC uniform2i = nullptr;
+ PFNGLUNIFORM2IVPROC uniform2iv = nullptr;
+ PFNGLUNIFORM3FPROC uniform3f = nullptr;
+ PFNGLUNIFORM3FVPROC uniform3fv = nullptr;
+ PFNGLUNIFORM3IPROC uniform3i = nullptr;
+ PFNGLUNIFORM3IVPROC uniform3iv = nullptr;
+ PFNGLUNIFORM4FPROC uniform4f = nullptr;
+ PFNGLUNIFORM4FVPROC uniform4fv = nullptr;
+ PFNGLUNIFORM4IPROC uniform4i = nullptr;
+ PFNGLUNIFORM4IVPROC uniform4iv = nullptr;
+ PFNGLUNIFORMMATRIX2FVPROC uniformMatrix2fv = nullptr;
+ PFNGLUNIFORMMATRIX3FVPROC uniformMatrix3fv = nullptr;
+ PFNGLUNIFORMMATRIX4FVPROC uniformMatrix4fv = nullptr;
+ PFNGLUSEPROGRAMPROC useProgram = nullptr;
+ PFNGLVALIDATEPROGRAMPROC validateProgram = nullptr;
+ PFNGLVERTEXATTRIB1DPROC vertexAttrib1d = nullptr;
+ PFNGLVERTEXATTRIB1DVPROC vertexAttrib1dv = nullptr;
+ PFNGLVERTEXATTRIB1FPROC vertexAttrib1f = nullptr;
+ PFNGLVERTEXATTRIB1FVPROC vertexAttrib1fv = nullptr;
+ PFNGLVERTEXATTRIB1SPROC vertexAttrib1s = nullptr;
+ PFNGLVERTEXATTRIB1SVPROC vertexAttrib1sv = nullptr;
+ PFNGLVERTEXATTRIB2DPROC vertexAttrib2d = nullptr;
+ PFNGLVERTEXATTRIB2DVPROC vertexAttrib2dv = nullptr;
+ PFNGLVERTEXATTRIB2FPROC vertexAttrib2f = nullptr;
+ PFNGLVERTEXATTRIB2FVPROC vertexAttrib2fv = nullptr;
+ PFNGLVERTEXATTRIB2SPROC vertexAttrib2s = nullptr;
+ PFNGLVERTEXATTRIB2SVPROC vertexAttrib2sv = nullptr;
+ PFNGLVERTEXATTRIB3DPROC vertexAttrib3d = nullptr;
+ PFNGLVERTEXATTRIB3DVPROC vertexAttrib3dv = nullptr;
+ PFNGLVERTEXATTRIB3FPROC vertexAttrib3f = nullptr;
+ PFNGLVERTEXATTRIB3FVPROC vertexAttrib3fv = nullptr;
+ PFNGLVERTEXATTRIB3SPROC vertexAttrib3s = nullptr;
+ PFNGLVERTEXATTRIB3SVPROC vertexAttrib3sv = nullptr;
+ PFNGLVERTEXATTRIB4NBVPROC vertexAttrib4Nbv = nullptr;
+ PFNGLVERTEXATTRIB4NIVPROC vertexAttrib4Niv = nullptr;
+ PFNGLVERTEXATTRIB4NSVPROC vertexAttrib4Nsv = nullptr;
+ PFNGLVERTEXATTRIB4NUBPROC vertexAttrib4Nub = nullptr;
+ PFNGLVERTEXATTRIB4NUBVPROC vertexAttrib4Nubv = nullptr;
+ PFNGLVERTEXATTRIB4NUIVPROC vertexAttrib4Nuiv = nullptr;
+ PFNGLVERTEXATTRIB4NUSVPROC vertexAttrib4Nusv = nullptr;
+ PFNGLVERTEXATTRIB4BVPROC vertexAttrib4bv = nullptr;
+ PFNGLVERTEXATTRIB4DPROC vertexAttrib4d = nullptr;
+ PFNGLVERTEXATTRIB4DVPROC vertexAttrib4dv = nullptr;
+ PFNGLVERTEXATTRIB4FPROC vertexAttrib4f = nullptr;
+ PFNGLVERTEXATTRIB4FVPROC vertexAttrib4fv = nullptr;
+ PFNGLVERTEXATTRIB4IVPROC vertexAttrib4iv = nullptr;
+ PFNGLVERTEXATTRIB4SPROC vertexAttrib4s = nullptr;
+ PFNGLVERTEXATTRIB4SVPROC vertexAttrib4sv = nullptr;
+ PFNGLVERTEXATTRIB4UBVPROC vertexAttrib4ubv = nullptr;
+ PFNGLVERTEXATTRIB4UIVPROC vertexAttrib4uiv = nullptr;
+ PFNGLVERTEXATTRIB4USVPROC vertexAttrib4usv = nullptr;
+ PFNGLVERTEXATTRIBPOINTERPROC vertexAttribPointer = nullptr;
// 2.1
PFNGLUNIFORMMATRIX2X3FVPROC uniformMatrix2x3fv = nullptr;
@@ -253,523 +254,531 @@ class DispatchTableGL : angle::NonCopyable
PFNGLUNIFORMMATRIX4X3FVPROC uniformMatrix4x3fv = nullptr;
// 3.0
- PFNGLBEGINCONDITIONALRENDERPROC beginConditionalRender = nullptr;
- PFNGLBEGINTRANSFORMFEEDBACKPROC beginTransformFeedback = nullptr;
- PFNGLBINDBUFFERBASEPROC bindBufferBase = nullptr;
- PFNGLBINDBUFFERRANGEPROC bindBufferRange = nullptr;
- PFNGLBINDFRAGDATALOCATIONPROC bindFragDataLocation = nullptr;
- PFNGLBINDFRAMEBUFFERPROC bindFramebuffer = nullptr;
- PFNGLBINDRENDERBUFFERPROC bindRenderbuffer = nullptr;
- PFNGLBINDVERTEXARRAYPROC bindVertexArray = nullptr;
- PFNGLBLITFRAMEBUFFERPROC blitFramebuffer = nullptr;
- PFNGLCHECKFRAMEBUFFERSTATUSPROC checkFramebufferStatus = nullptr;
- PFNGLCLAMPCOLORPROC clampColor = nullptr;
- PFNGLCLEARBUFFERFIPROC clearBufferfi = nullptr;
- PFNGLCLEARBUFFERFVPROC clearBufferfv = nullptr;
- PFNGLCLEARBUFFERIVPROC clearBufferiv = nullptr;
- PFNGLCLEARBUFFERUIVPROC clearBufferuiv = nullptr;
- PFNGLCOLORMASKIPROC colorMaski = nullptr;
- PFNGLDELETEFRAMEBUFFERSPROC deleteFramebuffers = nullptr;
- PFNGLDELETERENDERBUFFERSPROC deleteRenderbuffers = nullptr;
- PFNGLDELETEVERTEXARRAYSPROC deleteVertexArrays = nullptr;
- PFNGLDISABLEIPROC disablei = nullptr;
- PFNGLENABLEIPROC enablei = nullptr;
- PFNGLENDCONDITIONALRENDERPROC endConditionalRender = nullptr;
- PFNGLENDTRANSFORMFEEDBACKPROC endTransformFeedback = nullptr;
- PFNGLFLUSHMAPPEDBUFFERRANGEPROC flushMappedBufferRange = nullptr;
- PFNGLFRAMEBUFFERRENDERBUFFERPROC framebufferRenderbuffer = nullptr;
- PFNGLFRAMEBUFFERTEXTURE1DPROC framebufferTexture1D = nullptr;
- PFNGLFRAMEBUFFERTEXTURE2DPROC framebufferTexture2D = nullptr;
- PFNGLFRAMEBUFFERTEXTURE3DPROC framebufferTexture3D = nullptr;
- PFNGLFRAMEBUFFERTEXTURELAYERPROC framebufferTextureLayer = nullptr;
- PFNGLGENFRAMEBUFFERSPROC genFramebuffers = nullptr;
- PFNGLGENRENDERBUFFERSPROC genRenderbuffers = nullptr;
- PFNGLGENVERTEXARRAYSPROC genVertexArrays = nullptr;
- PFNGLGENERATEMIPMAPPROC generateMipmap = nullptr;
- PFNGLGETBOOLEANI_VPROC getBooleani_v = nullptr;
- PFNGLGETFRAGDATALOCATIONPROC getFragDataLocation = nullptr;
+ PFNGLBEGINCONDITIONALRENDERPROC beginConditionalRender = nullptr;
+ PFNGLBEGINTRANSFORMFEEDBACKPROC beginTransformFeedback = nullptr;
+ PFNGLBINDBUFFERBASEPROC bindBufferBase = nullptr;
+ PFNGLBINDBUFFERRANGEPROC bindBufferRange = nullptr;
+ PFNGLBINDFRAGDATALOCATIONPROC bindFragDataLocation = nullptr;
+ PFNGLBINDFRAMEBUFFERPROC bindFramebuffer = nullptr;
+ PFNGLBINDRENDERBUFFERPROC bindRenderbuffer = nullptr;
+ PFNGLBINDVERTEXARRAYPROC bindVertexArray = nullptr;
+ PFNGLBLITFRAMEBUFFERPROC blitFramebuffer = nullptr;
+ PFNGLCHECKFRAMEBUFFERSTATUSPROC checkFramebufferStatus = nullptr;
+ PFNGLCLAMPCOLORPROC clampColor = nullptr;
+ PFNGLCLEARBUFFERFIPROC clearBufferfi = nullptr;
+ PFNGLCLEARBUFFERFVPROC clearBufferfv = nullptr;
+ PFNGLCLEARBUFFERIVPROC clearBufferiv = nullptr;
+ PFNGLCLEARBUFFERUIVPROC clearBufferuiv = nullptr;
+ PFNGLCOLORMASKIPROC colorMaski = nullptr;
+ PFNGLDELETEFRAMEBUFFERSPROC deleteFramebuffers = nullptr;
+ PFNGLDELETERENDERBUFFERSPROC deleteRenderbuffers = nullptr;
+ PFNGLDELETEVERTEXARRAYSPROC deleteVertexArrays = nullptr;
+ PFNGLDISABLEIPROC disablei = nullptr;
+ PFNGLENABLEIPROC enablei = nullptr;
+ PFNGLENDCONDITIONALRENDERPROC endConditionalRender = nullptr;
+ PFNGLENDTRANSFORMFEEDBACKPROC endTransformFeedback = nullptr;
+ PFNGLFLUSHMAPPEDBUFFERRANGEPROC flushMappedBufferRange = nullptr;
+ PFNGLFRAMEBUFFERRENDERBUFFERPROC framebufferRenderbuffer = nullptr;
+ PFNGLFRAMEBUFFERTEXTURE1DPROC framebufferTexture1D = nullptr;
+ PFNGLFRAMEBUFFERTEXTURE2DPROC framebufferTexture2D = nullptr;
+ PFNGLFRAMEBUFFERTEXTURE3DPROC framebufferTexture3D = nullptr;
+ PFNGLFRAMEBUFFERTEXTURELAYERPROC framebufferTextureLayer = nullptr;
+ PFNGLGENFRAMEBUFFERSPROC genFramebuffers = nullptr;
+ PFNGLGENRENDERBUFFERSPROC genRenderbuffers = nullptr;
+ PFNGLGENVERTEXARRAYSPROC genVertexArrays = nullptr;
+ PFNGLGENERATEMIPMAPPROC generateMipmap = nullptr;
+ PFNGLGETBOOLEANI_VPROC getBooleani_v = nullptr;
+ PFNGLGETFRAGDATALOCATIONPROC getFragDataLocation = nullptr;
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC getFramebufferAttachmentParameteriv = nullptr;
- PFNGLGETINTEGERI_VPROC getIntegeri_v = nullptr;
- PFNGLGETRENDERBUFFERPARAMETERIVPROC getRenderbufferParameteriv = nullptr;
- PFNGLGETSTRINGIPROC getStringi = nullptr;
- PFNGLGETTEXPARAMETERIIVPROC getTexParameterIiv = nullptr;
- PFNGLGETTEXPARAMETERIUIVPROC getTexParameterIuiv = nullptr;
- PFNGLGETTRANSFORMFEEDBACKVARYINGPROC getTransformFeedbackVarying = nullptr;
- PFNGLGETUNIFORMUIVPROC getUniformuiv = nullptr;
- PFNGLGETVERTEXATTRIBIIVPROC getVertexAttribIiv = nullptr;
- PFNGLGETVERTEXATTRIBIUIVPROC getVertexAttribIuiv = nullptr;
- PFNGLISENABLEDIPROC isEnabledi = nullptr;
- PFNGLISFRAMEBUFFERPROC isFramebuffer = nullptr;
- PFNGLISRENDERBUFFERPROC isRenderbuffer = nullptr;
- PFNGLISVERTEXARRAYPROC isVertexArray = nullptr;
- PFNGLMAPBUFFERRANGEPROC mapBufferRange = nullptr;
- PFNGLRENDERBUFFERSTORAGEPROC renderbufferStorage = nullptr;
- PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC renderbufferStorageMultisample = nullptr;
- PFNGLTEXPARAMETERIIVPROC texParameterIiv = nullptr;
- PFNGLTEXPARAMETERIUIVPROC texParameterIuiv = nullptr;
- PFNGLTRANSFORMFEEDBACKVARYINGSPROC transformFeedbackVaryings = nullptr;
- PFNGLUNIFORM1UIPROC uniform1ui = nullptr;
- PFNGLUNIFORM1UIVPROC uniform1uiv = nullptr;
- PFNGLUNIFORM2UIPROC uniform2ui = nullptr;
- PFNGLUNIFORM2UIVPROC uniform2uiv = nullptr;
- PFNGLUNIFORM3UIPROC uniform3ui = nullptr;
- PFNGLUNIFORM3UIVPROC uniform3uiv = nullptr;
- PFNGLUNIFORM4UIPROC uniform4ui = nullptr;
- PFNGLUNIFORM4UIVPROC uniform4uiv = nullptr;
- PFNGLVERTEXATTRIBI1IPROC vertexAttribI1i = nullptr;
- PFNGLVERTEXATTRIBI1IVPROC vertexAttribI1iv = nullptr;
- PFNGLVERTEXATTRIBI1UIPROC vertexAttribI1ui = nullptr;
- PFNGLVERTEXATTRIBI1UIVPROC vertexAttribI1uiv = nullptr;
- PFNGLVERTEXATTRIBI2IPROC vertexAttribI2i = nullptr;
- PFNGLVERTEXATTRIBI2IVPROC vertexAttribI2iv = nullptr;
- PFNGLVERTEXATTRIBI2UIPROC vertexAttribI2ui = nullptr;
- PFNGLVERTEXATTRIBI2UIVPROC vertexAttribI2uiv = nullptr;
- PFNGLVERTEXATTRIBI3IPROC vertexAttribI3i = nullptr;
- PFNGLVERTEXATTRIBI3IVPROC vertexAttribI3iv = nullptr;
- PFNGLVERTEXATTRIBI3UIPROC vertexAttribI3ui = nullptr;
- PFNGLVERTEXATTRIBI3UIVPROC vertexAttribI3uiv = nullptr;
- PFNGLVERTEXATTRIBI4BVPROC vertexAttribI4bv = nullptr;
- PFNGLVERTEXATTRIBI4IPROC vertexAttribI4i = nullptr;
- PFNGLVERTEXATTRIBI4IVPROC vertexAttribI4iv = nullptr;
- PFNGLVERTEXATTRIBI4SVPROC vertexAttribI4sv = nullptr;
- PFNGLVERTEXATTRIBI4UBVPROC vertexAttribI4ubv = nullptr;
- PFNGLVERTEXATTRIBI4UIPROC vertexAttribI4ui = nullptr;
- PFNGLVERTEXATTRIBI4UIVPROC vertexAttribI4uiv = nullptr;
- PFNGLVERTEXATTRIBI4USVPROC vertexAttribI4usv = nullptr;
- PFNGLVERTEXATTRIBIPOINTERPROC vertexAttribIPointer = nullptr;
+ PFNGLGETINTEGERI_VPROC getIntegeri_v = nullptr;
+ PFNGLGETRENDERBUFFERPARAMETERIVPROC getRenderbufferParameteriv = nullptr;
+ PFNGLGETSTRINGIPROC getStringi = nullptr;
+ PFNGLGETTEXPARAMETERIIVPROC getTexParameterIiv = nullptr;
+ PFNGLGETTEXPARAMETERIUIVPROC getTexParameterIuiv = nullptr;
+ PFNGLGETTRANSFORMFEEDBACKVARYINGPROC getTransformFeedbackVarying = nullptr;
+ PFNGLGETUNIFORMUIVPROC getUniformuiv = nullptr;
+ PFNGLGETVERTEXATTRIBIIVPROC getVertexAttribIiv = nullptr;
+ PFNGLGETVERTEXATTRIBIUIVPROC getVertexAttribIuiv = nullptr;
+ PFNGLISENABLEDIPROC isEnabledi = nullptr;
+ PFNGLISFRAMEBUFFERPROC isFramebuffer = nullptr;
+ PFNGLISRENDERBUFFERPROC isRenderbuffer = nullptr;
+ PFNGLISVERTEXARRAYPROC isVertexArray = nullptr;
+ PFNGLMAPBUFFERRANGEPROC mapBufferRange = nullptr;
+ PFNGLRENDERBUFFERSTORAGEPROC renderbufferStorage = nullptr;
+ PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC renderbufferStorageMultisample = nullptr;
+ PFNGLTEXPARAMETERIIVPROC texParameterIiv = nullptr;
+ PFNGLTEXPARAMETERIUIVPROC texParameterIuiv = nullptr;
+ PFNGLTRANSFORMFEEDBACKVARYINGSPROC transformFeedbackVaryings = nullptr;
+ PFNGLUNIFORM1UIPROC uniform1ui = nullptr;
+ PFNGLUNIFORM1UIVPROC uniform1uiv = nullptr;
+ PFNGLUNIFORM2UIPROC uniform2ui = nullptr;
+ PFNGLUNIFORM2UIVPROC uniform2uiv = nullptr;
+ PFNGLUNIFORM3UIPROC uniform3ui = nullptr;
+ PFNGLUNIFORM3UIVPROC uniform3uiv = nullptr;
+ PFNGLUNIFORM4UIPROC uniform4ui = nullptr;
+ PFNGLUNIFORM4UIVPROC uniform4uiv = nullptr;
+ PFNGLVERTEXATTRIBI1IPROC vertexAttribI1i = nullptr;
+ PFNGLVERTEXATTRIBI1IVPROC vertexAttribI1iv = nullptr;
+ PFNGLVERTEXATTRIBI1UIPROC vertexAttribI1ui = nullptr;
+ PFNGLVERTEXATTRIBI1UIVPROC vertexAttribI1uiv = nullptr;
+ PFNGLVERTEXATTRIBI2IPROC vertexAttribI2i = nullptr;
+ PFNGLVERTEXATTRIBI2IVPROC vertexAttribI2iv = nullptr;
+ PFNGLVERTEXATTRIBI2UIPROC vertexAttribI2ui = nullptr;
+ PFNGLVERTEXATTRIBI2UIVPROC vertexAttribI2uiv = nullptr;
+ PFNGLVERTEXATTRIBI3IPROC vertexAttribI3i = nullptr;
+ PFNGLVERTEXATTRIBI3IVPROC vertexAttribI3iv = nullptr;
+ PFNGLVERTEXATTRIBI3UIPROC vertexAttribI3ui = nullptr;
+ PFNGLVERTEXATTRIBI3UIVPROC vertexAttribI3uiv = nullptr;
+ PFNGLVERTEXATTRIBI4BVPROC vertexAttribI4bv = nullptr;
+ PFNGLVERTEXATTRIBI4IPROC vertexAttribI4i = nullptr;
+ PFNGLVERTEXATTRIBI4IVPROC vertexAttribI4iv = nullptr;
+ PFNGLVERTEXATTRIBI4SVPROC vertexAttribI4sv = nullptr;
+ PFNGLVERTEXATTRIBI4UBVPROC vertexAttribI4ubv = nullptr;
+ PFNGLVERTEXATTRIBI4UIPROC vertexAttribI4ui = nullptr;
+ PFNGLVERTEXATTRIBI4UIVPROC vertexAttribI4uiv = nullptr;
+ PFNGLVERTEXATTRIBI4USVPROC vertexAttribI4usv = nullptr;
+ PFNGLVERTEXATTRIBIPOINTERPROC vertexAttribIPointer = nullptr;
// 3.1
- PFNGLCOPYBUFFERSUBDATAPROC copyBufferSubData = nullptr;
- PFNGLDRAWARRAYSINSTANCEDPROC drawArraysInstanced = nullptr;
- PFNGLDRAWELEMENTSINSTANCEDPROC drawElementsInstanced = nullptr;
+ PFNGLCOPYBUFFERSUBDATAPROC copyBufferSubData = nullptr;
+ PFNGLDRAWARRAYSINSTANCEDPROC drawArraysInstanced = nullptr;
+ PFNGLDRAWELEMENTSINSTANCEDPROC drawElementsInstanced = nullptr;
PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC getActiveUniformBlockName = nullptr;
- PFNGLGETACTIVEUNIFORMBLOCKIVPROC getActiveUniformBlockiv = nullptr;
- PFNGLGETACTIVEUNIFORMNAMEPROC getActiveUniformName = nullptr;
- PFNGLGETACTIVEUNIFORMSIVPROC getActiveUniformsiv = nullptr;
- PFNGLGETUNIFORMBLOCKINDEXPROC getUniformBlockIndex = nullptr;
- PFNGLGETUNIFORMINDICESPROC getUniformIndices = nullptr;
- PFNGLPRIMITIVERESTARTINDEXPROC primitiveRestartIndex = nullptr;
- PFNGLTEXBUFFERPROC texBuffer = nullptr;
- PFNGLUNIFORMBLOCKBINDINGPROC uniformBlockBinding = nullptr;
+ PFNGLGETACTIVEUNIFORMBLOCKIVPROC getActiveUniformBlockiv = nullptr;
+ PFNGLGETACTIVEUNIFORMNAMEPROC getActiveUniformName = nullptr;
+ PFNGLGETACTIVEUNIFORMSIVPROC getActiveUniformsiv = nullptr;
+ PFNGLGETUNIFORMBLOCKINDEXPROC getUniformBlockIndex = nullptr;
+ PFNGLGETUNIFORMINDICESPROC getUniformIndices = nullptr;
+ PFNGLPRIMITIVERESTARTINDEXPROC primitiveRestartIndex = nullptr;
+ PFNGLTEXBUFFERPROC texBuffer = nullptr;
+ PFNGLUNIFORMBLOCKBINDINGPROC uniformBlockBinding = nullptr;
// 3.2
- PFNGLCLIENTWAITSYNCPROC clientWaitSync = nullptr;
- PFNGLDELETESYNCPROC deleteSync = nullptr;
- PFNGLDRAWELEMENTSBASEVERTEXPROC drawElementsBaseVertex = nullptr;
+ PFNGLCLIENTWAITSYNCPROC clientWaitSync = nullptr;
+ PFNGLDELETESYNCPROC deleteSync = nullptr;
+ PFNGLDRAWELEMENTSBASEVERTEXPROC drawElementsBaseVertex = nullptr;
PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC drawElementsInstancedBaseVertex = nullptr;
- PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC drawRangeElementsBaseVertex = nullptr;
- PFNGLFENCESYNCPROC fenceSync = nullptr;
- PFNGLFRAMEBUFFERTEXTUREPROC framebufferTexture = nullptr;
- PFNGLGETBUFFERPARAMETERI64VPROC getBufferParameteri64v = nullptr;
- PFNGLGETINTEGER64I_VPROC getInteger64i_v = nullptr;
- PFNGLGETINTEGER64VPROC getInteger64v = nullptr;
- PFNGLGETMULTISAMPLEFVPROC getMultisamplefv = nullptr;
- PFNGLGETSYNCIVPROC getSynciv = nullptr;
- PFNGLISSYNCPROC isSync = nullptr;
- PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC multiDrawElementsBaseVertex = nullptr;
- PFNGLPROVOKINGVERTEXPROC provokingVertex = nullptr;
- PFNGLSAMPLEMASKIPROC sampleMaski = nullptr;
- PFNGLTEXIMAGE2DMULTISAMPLEPROC texImage2DMultisample = nullptr;
- PFNGLTEXIMAGE3DMULTISAMPLEPROC texImage3DMultisample = nullptr;
- PFNGLWAITSYNCPROC waitSync = nullptr;
+ PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC drawRangeElementsBaseVertex = nullptr;
+ PFNGLFENCESYNCPROC fenceSync = nullptr;
+ PFNGLFRAMEBUFFERTEXTUREPROC framebufferTexture = nullptr;
+ PFNGLGETBUFFERPARAMETERI64VPROC getBufferParameteri64v = nullptr;
+ PFNGLGETINTEGER64I_VPROC getInteger64i_v = nullptr;
+ PFNGLGETINTEGER64VPROC getInteger64v = nullptr;
+ PFNGLGETMULTISAMPLEFVPROC getMultisamplefv = nullptr;
+ PFNGLGETSYNCIVPROC getSynciv = nullptr;
+ PFNGLISSYNCPROC isSync = nullptr;
+ PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC multiDrawElementsBaseVertex = nullptr;
+ PFNGLPROVOKINGVERTEXPROC provokingVertex = nullptr;
+ PFNGLSAMPLEMASKIPROC sampleMaski = nullptr;
+ PFNGLTEXIMAGE2DMULTISAMPLEPROC texImage2DMultisample = nullptr;
+ PFNGLTEXIMAGE3DMULTISAMPLEPROC texImage3DMultisample = nullptr;
+ PFNGLWAITSYNCPROC waitSync = nullptr;
// 3.3
PFNGLBINDFRAGDATALOCATIONINDEXEDPROC bindFragDataLocationIndexed = nullptr;
- PFNGLBINDSAMPLERPROC bindSampler = nullptr;
- PFNGLDELETESAMPLERSPROC deleteSamplers = nullptr;
- PFNGLGENSAMPLERSPROC genSamplers = nullptr;
- PFNGLGETFRAGDATAINDEXPROC getFragDataIndex = nullptr;
- PFNGLGETQUERYOBJECTI64VPROC getQueryObjecti64v = nullptr;
- PFNGLGETQUERYOBJECTUI64VPROC getQueryObjectui64v = nullptr;
- PFNGLGETSAMPLERPARAMETERIIVPROC getSamplerParameterIiv = nullptr;
- PFNGLGETSAMPLERPARAMETERIUIVPROC getSamplerParameterIuiv = nullptr;
- PFNGLGETSAMPLERPARAMETERFVPROC getSamplerParameterfv = nullptr;
- PFNGLGETSAMPLERPARAMETERIVPROC getSamplerParameteriv = nullptr;
- PFNGLISSAMPLERPROC isSampler = nullptr;
- PFNGLQUERYCOUNTERPROC queryCounter = nullptr;
- PFNGLSAMPLERPARAMETERIIVPROC samplerParameterIiv = nullptr;
- PFNGLSAMPLERPARAMETERIUIVPROC samplerParameterIuiv = nullptr;
- PFNGLSAMPLERPARAMETERFPROC samplerParameterf = nullptr;
- PFNGLSAMPLERPARAMETERFVPROC samplerParameterfv = nullptr;
- PFNGLSAMPLERPARAMETERIPROC samplerParameteri = nullptr;
- PFNGLSAMPLERPARAMETERIVPROC samplerParameteriv = nullptr;
- PFNGLVERTEXATTRIBDIVISORPROC vertexAttribDivisor = nullptr;
- PFNGLVERTEXATTRIBP1UIPROC vertexAttribP1ui = nullptr;
- PFNGLVERTEXATTRIBP1UIVPROC vertexAttribP1uiv = nullptr;
- PFNGLVERTEXATTRIBP2UIPROC vertexAttribP2ui = nullptr;
- PFNGLVERTEXATTRIBP2UIVPROC vertexAttribP2uiv = nullptr;
- PFNGLVERTEXATTRIBP3UIPROC vertexAttribP3ui = nullptr;
- PFNGLVERTEXATTRIBP3UIVPROC vertexAttribP3uiv = nullptr;
- PFNGLVERTEXATTRIBP4UIPROC vertexAttribP4ui = nullptr;
- PFNGLVERTEXATTRIBP4UIVPROC vertexAttribP4uiv = nullptr;
+ PFNGLBINDSAMPLERPROC bindSampler = nullptr;
+ PFNGLDELETESAMPLERSPROC deleteSamplers = nullptr;
+ PFNGLGENSAMPLERSPROC genSamplers = nullptr;
+ PFNGLGETFRAGDATAINDEXPROC getFragDataIndex = nullptr;
+ PFNGLGETQUERYOBJECTI64VPROC getQueryObjecti64v = nullptr;
+ PFNGLGETQUERYOBJECTUI64VPROC getQueryObjectui64v = nullptr;
+ PFNGLGETSAMPLERPARAMETERIIVPROC getSamplerParameterIiv = nullptr;
+ PFNGLGETSAMPLERPARAMETERIUIVPROC getSamplerParameterIuiv = nullptr;
+ PFNGLGETSAMPLERPARAMETERFVPROC getSamplerParameterfv = nullptr;
+ PFNGLGETSAMPLERPARAMETERIVPROC getSamplerParameteriv = nullptr;
+ PFNGLISSAMPLERPROC isSampler = nullptr;
+ PFNGLQUERYCOUNTERPROC queryCounter = nullptr;
+ PFNGLSAMPLERPARAMETERIIVPROC samplerParameterIiv = nullptr;
+ PFNGLSAMPLERPARAMETERIUIVPROC samplerParameterIuiv = nullptr;
+ PFNGLSAMPLERPARAMETERFPROC samplerParameterf = nullptr;
+ PFNGLSAMPLERPARAMETERFVPROC samplerParameterfv = nullptr;
+ PFNGLSAMPLERPARAMETERIPROC samplerParameteri = nullptr;
+ PFNGLSAMPLERPARAMETERIVPROC samplerParameteriv = nullptr;
+ PFNGLVERTEXATTRIBDIVISORPROC vertexAttribDivisor = nullptr;
+ PFNGLVERTEXATTRIBP1UIPROC vertexAttribP1ui = nullptr;
+ PFNGLVERTEXATTRIBP1UIVPROC vertexAttribP1uiv = nullptr;
+ PFNGLVERTEXATTRIBP2UIPROC vertexAttribP2ui = nullptr;
+ PFNGLVERTEXATTRIBP2UIVPROC vertexAttribP2uiv = nullptr;
+ PFNGLVERTEXATTRIBP3UIPROC vertexAttribP3ui = nullptr;
+ PFNGLVERTEXATTRIBP3UIVPROC vertexAttribP3uiv = nullptr;
+ PFNGLVERTEXATTRIBP4UIPROC vertexAttribP4ui = nullptr;
+ PFNGLVERTEXATTRIBP4UIVPROC vertexAttribP4uiv = nullptr;
// 4.0
- PFNGLBEGINQUERYINDEXEDPROC beginQueryIndexed = nullptr;
- PFNGLBINDTRANSFORMFEEDBACKPROC bindTransformFeedback = nullptr;
- PFNGLBLENDEQUATIONSEPARATEIPROC blendEquationSeparatei = nullptr;
- PFNGLBLENDEQUATIONIPROC blendEquationi = nullptr;
- PFNGLBLENDFUNCSEPARATEIPROC blendFuncSeparatei = nullptr;
- PFNGLBLENDFUNCIPROC blendFunci = nullptr;
- PFNGLDELETETRANSFORMFEEDBACKSPROC deleteTransformFeedbacks = nullptr;
- PFNGLDRAWARRAYSINDIRECTPROC drawArraysIndirect = nullptr;
- PFNGLDRAWELEMENTSINDIRECTPROC drawElementsIndirect = nullptr;
- PFNGLDRAWTRANSFORMFEEDBACKPROC drawTransformFeedback = nullptr;
- PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC drawTransformFeedbackStream = nullptr;
- PFNGLENDQUERYINDEXEDPROC endQueryIndexed = nullptr;
- PFNGLGENTRANSFORMFEEDBACKSPROC genTransformFeedbacks = nullptr;
- PFNGLGETACTIVESUBROUTINENAMEPROC getActiveSubroutineName = nullptr;
+ PFNGLBEGINQUERYINDEXEDPROC beginQueryIndexed = nullptr;
+ PFNGLBINDTRANSFORMFEEDBACKPROC bindTransformFeedback = nullptr;
+ PFNGLBLENDEQUATIONSEPARATEIPROC blendEquationSeparatei = nullptr;
+ PFNGLBLENDEQUATIONIPROC blendEquationi = nullptr;
+ PFNGLBLENDFUNCSEPARATEIPROC blendFuncSeparatei = nullptr;
+ PFNGLBLENDFUNCIPROC blendFunci = nullptr;
+ PFNGLDELETETRANSFORMFEEDBACKSPROC deleteTransformFeedbacks = nullptr;
+ PFNGLDRAWARRAYSINDIRECTPROC drawArraysIndirect = nullptr;
+ PFNGLDRAWELEMENTSINDIRECTPROC drawElementsIndirect = nullptr;
+ PFNGLDRAWTRANSFORMFEEDBACKPROC drawTransformFeedback = nullptr;
+ PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC drawTransformFeedbackStream = nullptr;
+ PFNGLENDQUERYINDEXEDPROC endQueryIndexed = nullptr;
+ PFNGLGENTRANSFORMFEEDBACKSPROC genTransformFeedbacks = nullptr;
+ PFNGLGETACTIVESUBROUTINENAMEPROC getActiveSubroutineName = nullptr;
PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC getActiveSubroutineUniformName = nullptr;
- PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC getActiveSubroutineUniformiv = nullptr;
- PFNGLGETPROGRAMSTAGEIVPROC getProgramStageiv = nullptr;
- PFNGLGETQUERYINDEXEDIVPROC getQueryIndexediv = nullptr;
- PFNGLGETSUBROUTINEINDEXPROC getSubroutineIndex = nullptr;
- PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC getSubroutineUniformLocation = nullptr;
- PFNGLGETUNIFORMSUBROUTINEUIVPROC getUniformSubroutineuiv = nullptr;
- PFNGLGETUNIFORMDVPROC getUniformdv = nullptr;
- PFNGLISTRANSFORMFEEDBACKPROC isTransformFeedback = nullptr;
- PFNGLMINSAMPLESHADINGPROC minSampleShading = nullptr;
- PFNGLPATCHPARAMETERFVPROC patchParameterfv = nullptr;
- PFNGLPATCHPARAMETERIPROC patchParameteri = nullptr;
- PFNGLPAUSETRANSFORMFEEDBACKPROC pauseTransformFeedback = nullptr;
- PFNGLRESUMETRANSFORMFEEDBACKPROC resumeTransformFeedback = nullptr;
- PFNGLUNIFORM1DPROC uniform1d = nullptr;
- PFNGLUNIFORM1DVPROC uniform1dv = nullptr;
- PFNGLUNIFORM2DPROC uniform2d = nullptr;
- PFNGLUNIFORM2DVPROC uniform2dv = nullptr;
- PFNGLUNIFORM3DPROC uniform3d = nullptr;
- PFNGLUNIFORM3DVPROC uniform3dv = nullptr;
- PFNGLUNIFORM4DPROC uniform4d = nullptr;
- PFNGLUNIFORM4DVPROC uniform4dv = nullptr;
- PFNGLUNIFORMMATRIX2DVPROC uniformMatrix2dv = nullptr;
- PFNGLUNIFORMMATRIX2X3DVPROC uniformMatrix2x3dv = nullptr;
- PFNGLUNIFORMMATRIX2X4DVPROC uniformMatrix2x4dv = nullptr;
- PFNGLUNIFORMMATRIX3DVPROC uniformMatrix3dv = nullptr;
- PFNGLUNIFORMMATRIX3X2DVPROC uniformMatrix3x2dv = nullptr;
- PFNGLUNIFORMMATRIX3X4DVPROC uniformMatrix3x4dv = nullptr;
- PFNGLUNIFORMMATRIX4DVPROC uniformMatrix4dv = nullptr;
- PFNGLUNIFORMMATRIX4X2DVPROC uniformMatrix4x2dv = nullptr;
- PFNGLUNIFORMMATRIX4X3DVPROC uniformMatrix4x3dv = nullptr;
- PFNGLUNIFORMSUBROUTINESUIVPROC uniformSubroutinesuiv = nullptr;
+ PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC getActiveSubroutineUniformiv = nullptr;
+ PFNGLGETPROGRAMSTAGEIVPROC getProgramStageiv = nullptr;
+ PFNGLGETQUERYINDEXEDIVPROC getQueryIndexediv = nullptr;
+ PFNGLGETSUBROUTINEINDEXPROC getSubroutineIndex = nullptr;
+ PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC getSubroutineUniformLocation = nullptr;
+ PFNGLGETUNIFORMSUBROUTINEUIVPROC getUniformSubroutineuiv = nullptr;
+ PFNGLGETUNIFORMDVPROC getUniformdv = nullptr;
+ PFNGLISTRANSFORMFEEDBACKPROC isTransformFeedback = nullptr;
+ PFNGLMINSAMPLESHADINGPROC minSampleShading = nullptr;
+ PFNGLPATCHPARAMETERFVPROC patchParameterfv = nullptr;
+ PFNGLPATCHPARAMETERIPROC patchParameteri = nullptr;
+ PFNGLPAUSETRANSFORMFEEDBACKPROC pauseTransformFeedback = nullptr;
+ PFNGLRESUMETRANSFORMFEEDBACKPROC resumeTransformFeedback = nullptr;
+ PFNGLUNIFORM1DPROC uniform1d = nullptr;
+ PFNGLUNIFORM1DVPROC uniform1dv = nullptr;
+ PFNGLUNIFORM2DPROC uniform2d = nullptr;
+ PFNGLUNIFORM2DVPROC uniform2dv = nullptr;
+ PFNGLUNIFORM3DPROC uniform3d = nullptr;
+ PFNGLUNIFORM3DVPROC uniform3dv = nullptr;
+ PFNGLUNIFORM4DPROC uniform4d = nullptr;
+ PFNGLUNIFORM4DVPROC uniform4dv = nullptr;
+ PFNGLUNIFORMMATRIX2DVPROC uniformMatrix2dv = nullptr;
+ PFNGLUNIFORMMATRIX2X3DVPROC uniformMatrix2x3dv = nullptr;
+ PFNGLUNIFORMMATRIX2X4DVPROC uniformMatrix2x4dv = nullptr;
+ PFNGLUNIFORMMATRIX3DVPROC uniformMatrix3dv = nullptr;
+ PFNGLUNIFORMMATRIX3X2DVPROC uniformMatrix3x2dv = nullptr;
+ PFNGLUNIFORMMATRIX3X4DVPROC uniformMatrix3x4dv = nullptr;
+ PFNGLUNIFORMMATRIX4DVPROC uniformMatrix4dv = nullptr;
+ PFNGLUNIFORMMATRIX4X2DVPROC uniformMatrix4x2dv = nullptr;
+ PFNGLUNIFORMMATRIX4X3DVPROC uniformMatrix4x3dv = nullptr;
+ PFNGLUNIFORMSUBROUTINESUIVPROC uniformSubroutinesuiv = nullptr;
// 4.1
- PFNGLACTIVESHADERPROGRAMPROC activeShaderProgram = nullptr;
- PFNGLBINDPROGRAMPIPELINEPROC bindProgramPipeline = nullptr;
- PFNGLCLEARDEPTHFPROC clearDepthf = nullptr;
- PFNGLCREATESHADERPROGRAMVPROC createShaderProgramv = nullptr;
- PFNGLDELETEPROGRAMPIPELINESPROC deleteProgramPipelines = nullptr;
- PFNGLDEPTHRANGEARRAYVPROC depthRangeArrayv = nullptr;
- PFNGLDEPTHRANGEINDEXEDPROC depthRangeIndexed = nullptr;
- PFNGLDEPTHRANGEFPROC depthRangef = nullptr;
- PFNGLGENPROGRAMPIPELINESPROC genProgramPipelines = nullptr;
- PFNGLGETDOUBLEI_VPROC getDoublei_v = nullptr;
- PFNGLGETFLOATI_VPROC getFloati_v = nullptr;
- PFNGLGETPROGRAMBINARYPROC getProgramBinary = nullptr;
+ PFNGLACTIVESHADERPROGRAMPROC activeShaderProgram = nullptr;
+ PFNGLBINDPROGRAMPIPELINEPROC bindProgramPipeline = nullptr;
+ PFNGLCLEARDEPTHFPROC clearDepthf = nullptr;
+ PFNGLCREATESHADERPROGRAMVPROC createShaderProgramv = nullptr;
+ PFNGLDELETEPROGRAMPIPELINESPROC deleteProgramPipelines = nullptr;
+ PFNGLDEPTHRANGEARRAYVPROC depthRangeArrayv = nullptr;
+ PFNGLDEPTHRANGEINDEXEDPROC depthRangeIndexed = nullptr;
+ PFNGLDEPTHRANGEFPROC depthRangef = nullptr;
+ PFNGLGENPROGRAMPIPELINESPROC genProgramPipelines = nullptr;
+ PFNGLGETDOUBLEI_VPROC getDoublei_v = nullptr;
+ PFNGLGETFLOATI_VPROC getFloati_v = nullptr;
+ PFNGLGETPROGRAMBINARYPROC getProgramBinary = nullptr;
PFNGLGETPROGRAMPIPELINEINFOLOGPROC getProgramPipelineInfoLog = nullptr;
- PFNGLGETPROGRAMPIPELINEIVPROC getProgramPipelineiv = nullptr;
- PFNGLGETSHADERPRECISIONFORMATPROC getShaderPrecisionFormat = nullptr;
- PFNGLGETVERTEXATTRIBLDVPROC getVertexAttribLdv = nullptr;
- PFNGLISPROGRAMPIPELINEPROC isProgramPipeline = nullptr;
- PFNGLPROGRAMBINARYPROC programBinary = nullptr;
- PFNGLPROGRAMPARAMETERIPROC programParameteri = nullptr;
- PFNGLPROGRAMUNIFORM1DPROC programUniform1d = nullptr;
- PFNGLPROGRAMUNIFORM1DVPROC programUniform1dv = nullptr;
- PFNGLPROGRAMUNIFORM1FPROC programUniform1f = nullptr;
- PFNGLPROGRAMUNIFORM1FVPROC programUniform1fv = nullptr;
- PFNGLPROGRAMUNIFORM1IPROC programUniform1i = nullptr;
- PFNGLPROGRAMUNIFORM1IVPROC programUniform1iv = nullptr;
- PFNGLPROGRAMUNIFORM1UIPROC programUniform1ui = nullptr;
- PFNGLPROGRAMUNIFORM1UIVPROC programUniform1uiv = nullptr;
- PFNGLPROGRAMUNIFORM2DPROC programUniform2d = nullptr;
- PFNGLPROGRAMUNIFORM2DVPROC programUniform2dv = nullptr;
- PFNGLPROGRAMUNIFORM2FPROC programUniform2f = nullptr;
- PFNGLPROGRAMUNIFORM2FVPROC programUniform2fv = nullptr;
- PFNGLPROGRAMUNIFORM2IPROC programUniform2i = nullptr;
- PFNGLPROGRAMUNIFORM2IVPROC programUniform2iv = nullptr;
- PFNGLPROGRAMUNIFORM2UIPROC programUniform2ui = nullptr;
- PFNGLPROGRAMUNIFORM2UIVPROC programUniform2uiv = nullptr;
- PFNGLPROGRAMUNIFORM3DPROC programUniform3d = nullptr;
- PFNGLPROGRAMUNIFORM3DVPROC programUniform3dv = nullptr;
- PFNGLPROGRAMUNIFORM3FPROC programUniform3f = nullptr;
- PFNGLPROGRAMUNIFORM3FVPROC programUniform3fv = nullptr;
- PFNGLPROGRAMUNIFORM3IPROC programUniform3i = nullptr;
- PFNGLPROGRAMUNIFORM3IVPROC programUniform3iv = nullptr;
- PFNGLPROGRAMUNIFORM3UIPROC programUniform3ui = nullptr;
- PFNGLPROGRAMUNIFORM3UIVPROC programUniform3uiv = nullptr;
- PFNGLPROGRAMUNIFORM4DPROC programUniform4d = nullptr;
- PFNGLPROGRAMUNIFORM4DVPROC programUniform4dv = nullptr;
- PFNGLPROGRAMUNIFORM4FPROC programUniform4f = nullptr;
- PFNGLPROGRAMUNIFORM4FVPROC programUniform4fv = nullptr;
- PFNGLPROGRAMUNIFORM4IPROC programUniform4i = nullptr;
- PFNGLPROGRAMUNIFORM4IVPROC programUniform4iv = nullptr;
- PFNGLPROGRAMUNIFORM4UIPROC programUniform4ui = nullptr;
- PFNGLPROGRAMUNIFORM4UIVPROC programUniform4uiv = nullptr;
- PFNGLPROGRAMUNIFORMMATRIX2DVPROC programUniformMatrix2dv = nullptr;
- PFNGLPROGRAMUNIFORMMATRIX2FVPROC programUniformMatrix2fv = nullptr;
+ PFNGLGETPROGRAMPIPELINEIVPROC getProgramPipelineiv = nullptr;
+ PFNGLGETSHADERPRECISIONFORMATPROC getShaderPrecisionFormat = nullptr;
+ PFNGLGETVERTEXATTRIBLDVPROC getVertexAttribLdv = nullptr;
+ PFNGLISPROGRAMPIPELINEPROC isProgramPipeline = nullptr;
+ PFNGLPROGRAMBINARYPROC programBinary = nullptr;
+ PFNGLPROGRAMPARAMETERIPROC programParameteri = nullptr;
+ PFNGLPROGRAMUNIFORM1DPROC programUniform1d = nullptr;
+ PFNGLPROGRAMUNIFORM1DVPROC programUniform1dv = nullptr;
+ PFNGLPROGRAMUNIFORM1FPROC programUniform1f = nullptr;
+ PFNGLPROGRAMUNIFORM1FVPROC programUniform1fv = nullptr;
+ PFNGLPROGRAMUNIFORM1IPROC programUniform1i = nullptr;
+ PFNGLPROGRAMUNIFORM1IVPROC programUniform1iv = nullptr;
+ PFNGLPROGRAMUNIFORM1UIPROC programUniform1ui = nullptr;
+ PFNGLPROGRAMUNIFORM1UIVPROC programUniform1uiv = nullptr;
+ PFNGLPROGRAMUNIFORM2DPROC programUniform2d = nullptr;
+ PFNGLPROGRAMUNIFORM2DVPROC programUniform2dv = nullptr;
+ PFNGLPROGRAMUNIFORM2FPROC programUniform2f = nullptr;
+ PFNGLPROGRAMUNIFORM2FVPROC programUniform2fv = nullptr;
+ PFNGLPROGRAMUNIFORM2IPROC programUniform2i = nullptr;
+ PFNGLPROGRAMUNIFORM2IVPROC programUniform2iv = nullptr;
+ PFNGLPROGRAMUNIFORM2UIPROC programUniform2ui = nullptr;
+ PFNGLPROGRAMUNIFORM2UIVPROC programUniform2uiv = nullptr;
+ PFNGLPROGRAMUNIFORM3DPROC programUniform3d = nullptr;
+ PFNGLPROGRAMUNIFORM3DVPROC programUniform3dv = nullptr;
+ PFNGLPROGRAMUNIFORM3FPROC programUniform3f = nullptr;
+ PFNGLPROGRAMUNIFORM3FVPROC programUniform3fv = nullptr;
+ PFNGLPROGRAMUNIFORM3IPROC programUniform3i = nullptr;
+ PFNGLPROGRAMUNIFORM3IVPROC programUniform3iv = nullptr;
+ PFNGLPROGRAMUNIFORM3UIPROC programUniform3ui = nullptr;
+ PFNGLPROGRAMUNIFORM3UIVPROC programUniform3uiv = nullptr;
+ PFNGLPROGRAMUNIFORM4DPROC programUniform4d = nullptr;
+ PFNGLPROGRAMUNIFORM4DVPROC programUniform4dv = nullptr;
+ PFNGLPROGRAMUNIFORM4FPROC programUniform4f = nullptr;
+ PFNGLPROGRAMUNIFORM4FVPROC programUniform4fv = nullptr;
+ PFNGLPROGRAMUNIFORM4IPROC programUniform4i = nullptr;
+ PFNGLPROGRAMUNIFORM4IVPROC programUniform4iv = nullptr;
+ PFNGLPROGRAMUNIFORM4UIPROC programUniform4ui = nullptr;
+ PFNGLPROGRAMUNIFORM4UIVPROC programUniform4uiv = nullptr;
+ PFNGLPROGRAMUNIFORMMATRIX2DVPROC programUniformMatrix2dv = nullptr;
+ PFNGLPROGRAMUNIFORMMATRIX2FVPROC programUniformMatrix2fv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC programUniformMatrix2x3dv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC programUniformMatrix2x3fv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC programUniformMatrix2x4dv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC programUniformMatrix2x4fv = nullptr;
- PFNGLPROGRAMUNIFORMMATRIX3DVPROC programUniformMatrix3dv = nullptr;
- PFNGLPROGRAMUNIFORMMATRIX3FVPROC programUniformMatrix3fv = nullptr;
+ PFNGLPROGRAMUNIFORMMATRIX3DVPROC programUniformMatrix3dv = nullptr;
+ PFNGLPROGRAMUNIFORMMATRIX3FVPROC programUniformMatrix3fv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC programUniformMatrix3x2dv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC programUniformMatrix3x2fv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC programUniformMatrix3x4dv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC programUniformMatrix3x4fv = nullptr;
- PFNGLPROGRAMUNIFORMMATRIX4DVPROC programUniformMatrix4dv = nullptr;
- PFNGLPROGRAMUNIFORMMATRIX4FVPROC programUniformMatrix4fv = nullptr;
+ PFNGLPROGRAMUNIFORMMATRIX4DVPROC programUniformMatrix4dv = nullptr;
+ PFNGLPROGRAMUNIFORMMATRIX4FVPROC programUniformMatrix4fv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC programUniformMatrix4x2dv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC programUniformMatrix4x2fv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC programUniformMatrix4x3dv = nullptr;
PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC programUniformMatrix4x3fv = nullptr;
- PFNGLRELEASESHADERCOMPILERPROC releaseShaderCompiler = nullptr;
- PFNGLSCISSORARRAYVPROC scissorArrayv = nullptr;
- PFNGLSCISSORINDEXEDPROC scissorIndexed = nullptr;
- PFNGLSCISSORINDEXEDVPROC scissorIndexedv = nullptr;
- PFNGLSHADERBINARYPROC shaderBinary = nullptr;
- PFNGLUSEPROGRAMSTAGESPROC useProgramStages = nullptr;
- PFNGLVALIDATEPROGRAMPIPELINEPROC validateProgramPipeline = nullptr;
- PFNGLVERTEXATTRIBL1DPROC vertexAttribL1d = nullptr;
- PFNGLVERTEXATTRIBL1DVPROC vertexAttribL1dv = nullptr;
- PFNGLVERTEXATTRIBL2DPROC vertexAttribL2d = nullptr;
- PFNGLVERTEXATTRIBL2DVPROC vertexAttribL2dv = nullptr;
- PFNGLVERTEXATTRIBL3DPROC vertexAttribL3d = nullptr;
- PFNGLVERTEXATTRIBL3DVPROC vertexAttribL3dv = nullptr;
- PFNGLVERTEXATTRIBL4DPROC vertexAttribL4d = nullptr;
- PFNGLVERTEXATTRIBL4DVPROC vertexAttribL4dv = nullptr;
- PFNGLVERTEXATTRIBLPOINTERPROC vertexAttribLPointer = nullptr;
- PFNGLVIEWPORTARRAYVPROC viewportArrayv = nullptr;
- PFNGLVIEWPORTINDEXEDFPROC viewportIndexedf = nullptr;
- PFNGLVIEWPORTINDEXEDFVPROC viewportIndexedfv = nullptr;
+ PFNGLRELEASESHADERCOMPILERPROC releaseShaderCompiler = nullptr;
+ PFNGLSCISSORARRAYVPROC scissorArrayv = nullptr;
+ PFNGLSCISSORINDEXEDPROC scissorIndexed = nullptr;
+ PFNGLSCISSORINDEXEDVPROC scissorIndexedv = nullptr;
+ PFNGLSHADERBINARYPROC shaderBinary = nullptr;
+ PFNGLUSEPROGRAMSTAGESPROC useProgramStages = nullptr;
+ PFNGLVALIDATEPROGRAMPIPELINEPROC validateProgramPipeline = nullptr;
+ PFNGLVERTEXATTRIBL1DPROC vertexAttribL1d = nullptr;
+ PFNGLVERTEXATTRIBL1DVPROC vertexAttribL1dv = nullptr;
+ PFNGLVERTEXATTRIBL2DPROC vertexAttribL2d = nullptr;
+ PFNGLVERTEXATTRIBL2DVPROC vertexAttribL2dv = nullptr;
+ PFNGLVERTEXATTRIBL3DPROC vertexAttribL3d = nullptr;
+ PFNGLVERTEXATTRIBL3DVPROC vertexAttribL3dv = nullptr;
+ PFNGLVERTEXATTRIBL4DPROC vertexAttribL4d = nullptr;
+ PFNGLVERTEXATTRIBL4DVPROC vertexAttribL4dv = nullptr;
+ PFNGLVERTEXATTRIBLPOINTERPROC vertexAttribLPointer = nullptr;
+ PFNGLVIEWPORTARRAYVPROC viewportArrayv = nullptr;
+ PFNGLVIEWPORTINDEXEDFPROC viewportIndexedf = nullptr;
+ PFNGLVIEWPORTINDEXEDFVPROC viewportIndexedfv = nullptr;
// 4.2
- PFNGLBINDIMAGETEXTUREPROC bindImageTexture = nullptr;
- PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC drawArraysInstancedBaseInstance = nullptr;
+ PFNGLBINDIMAGETEXTUREPROC bindImageTexture = nullptr;
+ PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC drawArraysInstancedBaseInstance = nullptr;
PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC drawElementsInstancedBaseInstance = nullptr;
- PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC
- drawElementsInstancedBaseVertexBaseInstance = nullptr;
- PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC drawTransformFeedbackInstanced = nullptr;
+ PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC drawElementsInstancedBaseVertexBaseInstance = nullptr;
+ PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC drawTransformFeedbackInstanced = nullptr;
PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC drawTransformFeedbackStreamInstanced = nullptr;
- PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC getActiveAtomicCounterBufferiv = nullptr;
- PFNGLGETINTERNALFORMATIVPROC getInternalformativ = nullptr;
- PFNGLMEMORYBARRIERPROC memoryBarrier = nullptr;
- PFNGLTEXSTORAGE1DPROC texStorage1D = nullptr;
- PFNGLTEXSTORAGE2DPROC texStorage2D = nullptr;
- PFNGLTEXSTORAGE3DPROC texStorage3D = nullptr;
+ PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC getActiveAtomicCounterBufferiv = nullptr;
+ PFNGLGETINTERNALFORMATIVPROC getInternalformativ = nullptr;
+ PFNGLMEMORYBARRIERPROC memoryBarrier = nullptr;
+ PFNGLTEXSTORAGE1DPROC texStorage1D = nullptr;
+ PFNGLTEXSTORAGE2DPROC texStorage2D = nullptr;
+ PFNGLTEXSTORAGE3DPROC texStorage3D = nullptr;
// 4.3
- PFNGLBINDVERTEXBUFFERPROC bindVertexBuffer = nullptr;
- PFNGLCLEARBUFFERDATAPROC clearBufferData = nullptr;
- PFNGLCLEARBUFFERSUBDATAPROC clearBufferSubData = nullptr;
- PFNGLCOPYIMAGESUBDATAPROC copyImageSubData = nullptr;
- PFNGLCOVERAGEMODULATIONNVPROC coverageModulationNV = nullptr;
- PFNGLDEBUGMESSAGECALLBACKPROC debugMessageCallback = nullptr;
- PFNGLDEBUGMESSAGECONTROLPROC debugMessageControl = nullptr;
- PFNGLDEBUGMESSAGEINSERTPROC debugMessageInsert = nullptr;
- PFNGLDISPATCHCOMPUTEPROC dispatchCompute = nullptr;
- PFNGLDISPATCHCOMPUTEINDIRECTPROC dispatchComputeIndirect = nullptr;
- PFNGLFRAMEBUFFERPARAMETERIPROC framebufferParameteri = nullptr;
- PFNGLGETDEBUGMESSAGELOGPROC getDebugMessageLog = nullptr;
- PFNGLGETFRAMEBUFFERPARAMETERIVPROC getFramebufferParameteriv = nullptr;
- PFNGLGETINTERNALFORMATI64VPROC getInternalformati64v = nullptr;
- PFNGLGETOBJECTLABELPROC getObjectLabel = nullptr;
- PFNGLGETOBJECTPTRLABELPROC getObjectPtrLabel = nullptr;
- PFNGLGETPOINTERVPROC getPointerv = nullptr;
- PFNGLGETPROGRAMINTERFACEIVPROC getProgramInterfaceiv = nullptr;
- PFNGLGETPROGRAMRESOURCEINDEXPROC getProgramResourceIndex = nullptr;
- PFNGLGETPROGRAMRESOURCELOCATIONPROC getProgramResourceLocation = nullptr;
+ PFNGLBINDVERTEXBUFFERPROC bindVertexBuffer = nullptr;
+ PFNGLCLEARBUFFERDATAPROC clearBufferData = nullptr;
+ PFNGLCLEARBUFFERSUBDATAPROC clearBufferSubData = nullptr;
+ PFNGLCOPYIMAGESUBDATAPROC copyImageSubData = nullptr;
+ PFNGLCOVERAGEMODULATIONNVPROC coverageModulationNV = nullptr;
+ PFNGLDEBUGMESSAGECALLBACKPROC debugMessageCallback = nullptr;
+ PFNGLDEBUGMESSAGECONTROLPROC debugMessageControl = nullptr;
+ PFNGLDEBUGMESSAGEINSERTPROC debugMessageInsert = nullptr;
+ PFNGLDISPATCHCOMPUTEPROC dispatchCompute = nullptr;
+ PFNGLDISPATCHCOMPUTEINDIRECTPROC dispatchComputeIndirect = nullptr;
+ PFNGLFRAMEBUFFERPARAMETERIPROC framebufferParameteri = nullptr;
+ PFNGLGETDEBUGMESSAGELOGPROC getDebugMessageLog = nullptr;
+ PFNGLGETFRAMEBUFFERPARAMETERIVPROC getFramebufferParameteriv = nullptr;
+ PFNGLGETINTERNALFORMATI64VPROC getInternalformati64v = nullptr;
+ PFNGLGETOBJECTLABELPROC getObjectLabel = nullptr;
+ PFNGLGETOBJECTPTRLABELPROC getObjectPtrLabel = nullptr;
+ PFNGLGETPOINTERVPROC getPointerv = nullptr;
+ PFNGLGETPROGRAMINTERFACEIVPROC getProgramInterfaceiv = nullptr;
+ PFNGLGETPROGRAMRESOURCEINDEXPROC getProgramResourceIndex = nullptr;
+ PFNGLGETPROGRAMRESOURCELOCATIONPROC getProgramResourceLocation = nullptr;
PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC getProgramResourceLocationIndex = nullptr;
- PFNGLGETPROGRAMRESOURCENAMEPROC getProgramResourceName = nullptr;
- PFNGLGETPROGRAMRESOURCEIVPROC getProgramResourceiv = nullptr;
- PFNGLINVALIDATEBUFFERDATAPROC invalidateBufferData = nullptr;
- PFNGLINVALIDATEBUFFERSUBDATAPROC invalidateBufferSubData = nullptr;
- PFNGLINVALIDATEFRAMEBUFFERPROC invalidateFramebuffer = nullptr;
- PFNGLINVALIDATESUBFRAMEBUFFERPROC invalidateSubFramebuffer = nullptr;
- PFNGLINVALIDATETEXIMAGEPROC invalidateTexImage = nullptr;
- PFNGLINVALIDATETEXSUBIMAGEPROC invalidateTexSubImage = nullptr;
- PFNGLMULTIDRAWARRAYSINDIRECTPROC multiDrawArraysIndirect = nullptr;
- PFNGLMULTIDRAWELEMENTSINDIRECTPROC multiDrawElementsIndirect = nullptr;
- PFNGLOBJECTLABELPROC objectLabel = nullptr;
- PFNGLOBJECTPTRLABELPROC objectPtrLabel = nullptr;
- PFNGLPOPDEBUGGROUPPROC popDebugGroup = nullptr;
- PFNGLPUSHDEBUGGROUPPROC pushDebugGroup = nullptr;
- PFNGLSHADERSTORAGEBLOCKBINDINGPROC shaderStorageBlockBinding = nullptr;
- PFNGLTEXBUFFERRANGEPROC texBufferRange = nullptr;
- PFNGLTEXSTORAGE2DMULTISAMPLEPROC texStorage2DMultisample = nullptr;
- PFNGLTEXSTORAGE3DMULTISAMPLEPROC texStorage3DMultisample = nullptr;
- PFNGLTEXTUREVIEWPROC textureView = nullptr;
- PFNGLVERTEXATTRIBBINDINGPROC vertexAttribBinding = nullptr;
- PFNGLVERTEXATTRIBFORMATPROC vertexAttribFormat = nullptr;
- PFNGLVERTEXATTRIBIFORMATPROC vertexAttribIFormat = nullptr;
- PFNGLVERTEXATTRIBLFORMATPROC vertexAttribLFormat = nullptr;
- PFNGLVERTEXBINDINGDIVISORPROC vertexBindingDivisor = nullptr;
+ PFNGLGETPROGRAMRESOURCENAMEPROC getProgramResourceName = nullptr;
+ PFNGLGETPROGRAMRESOURCEIVPROC getProgramResourceiv = nullptr;
+ PFNGLINVALIDATEBUFFERDATAPROC invalidateBufferData = nullptr;
+ PFNGLINVALIDATEBUFFERSUBDATAPROC invalidateBufferSubData = nullptr;
+ PFNGLINVALIDATEFRAMEBUFFERPROC invalidateFramebuffer = nullptr;
+ PFNGLINVALIDATESUBFRAMEBUFFERPROC invalidateSubFramebuffer = nullptr;
+ PFNGLINVALIDATETEXIMAGEPROC invalidateTexImage = nullptr;
+ PFNGLINVALIDATETEXSUBIMAGEPROC invalidateTexSubImage = nullptr;
+ PFNGLMULTIDRAWARRAYSINDIRECTPROC multiDrawArraysIndirect = nullptr;
+ PFNGLMULTIDRAWELEMENTSINDIRECTPROC multiDrawElementsIndirect = nullptr;
+ PFNGLOBJECTLABELPROC objectLabel = nullptr;
+ PFNGLOBJECTPTRLABELPROC objectPtrLabel = nullptr;
+ PFNGLPOPDEBUGGROUPPROC popDebugGroup = nullptr;
+ PFNGLPUSHDEBUGGROUPPROC pushDebugGroup = nullptr;
+ PFNGLSHADERSTORAGEBLOCKBINDINGPROC shaderStorageBlockBinding = nullptr;
+ PFNGLTEXBUFFERRANGEPROC texBufferRange = nullptr;
+ PFNGLTEXSTORAGE2DMULTISAMPLEPROC texStorage2DMultisample = nullptr;
+ PFNGLTEXSTORAGE3DMULTISAMPLEPROC texStorage3DMultisample = nullptr;
+ PFNGLTEXTUREVIEWPROC textureView = nullptr;
+ PFNGLVERTEXATTRIBBINDINGPROC vertexAttribBinding = nullptr;
+ PFNGLVERTEXATTRIBFORMATPROC vertexAttribFormat = nullptr;
+ PFNGLVERTEXATTRIBIFORMATPROC vertexAttribIFormat = nullptr;
+ PFNGLVERTEXATTRIBLFORMATPROC vertexAttribLFormat = nullptr;
+ PFNGLVERTEXBINDINGDIVISORPROC vertexBindingDivisor = nullptr;
// 4.4
- PFNGLBINDBUFFERSBASEPROC bindBuffersBase = nullptr;
- PFNGLBINDBUFFERSRANGEPROC bindBuffersRange = nullptr;
+ PFNGLBINDBUFFERSBASEPROC bindBuffersBase = nullptr;
+ PFNGLBINDBUFFERSRANGEPROC bindBuffersRange = nullptr;
PFNGLBINDIMAGETEXTURESPROC bindImageTextures = nullptr;
- PFNGLBINDSAMPLERSPROC bindSamplers = nullptr;
- PFNGLBINDTEXTURESPROC bindTextures = nullptr;
+ PFNGLBINDSAMPLERSPROC bindSamplers = nullptr;
+ PFNGLBINDTEXTURESPROC bindTextures = nullptr;
PFNGLBINDVERTEXBUFFERSPROC bindVertexBuffers = nullptr;
- PFNGLBUFFERSTORAGEPROC bufferStorage = nullptr;
- PFNGLCLEARTEXIMAGEPROC clearTexImage = nullptr;
- PFNGLCLEARTEXSUBIMAGEPROC clearTexSubImage = nullptr;
+ PFNGLBUFFERSTORAGEPROC bufferStorage = nullptr;
+ PFNGLCLEARTEXIMAGEPROC clearTexImage = nullptr;
+ PFNGLCLEARTEXSUBIMAGEPROC clearTexSubImage = nullptr;
// 4.5
- PFNGLBINDTEXTUREUNITPROC bindTextureUnit = nullptr;
- PFNGLBLITNAMEDFRAMEBUFFERPROC blitNamedFramebuffer = nullptr;
- PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC checkNamedFramebufferStatus = nullptr;
- PFNGLCLEARNAMEDBUFFERDATAPROC clearNamedBufferData = nullptr;
- PFNGLCLEARNAMEDBUFFERSUBDATAPROC clearNamedBufferSubData = nullptr;
- PFNGLCLEARNAMEDFRAMEBUFFERFIPROC clearNamedFramebufferfi = nullptr;
- PFNGLCLEARNAMEDFRAMEBUFFERFVPROC clearNamedFramebufferfv = nullptr;
- PFNGLCLEARNAMEDFRAMEBUFFERIVPROC clearNamedFramebufferiv = nullptr;
- PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC clearNamedFramebufferuiv = nullptr;
- PFNGLCLIPCONTROLPROC clipControl = nullptr;
- PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC compressedTextureSubImage1D = nullptr;
- PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC compressedTextureSubImage2D = nullptr;
- PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC compressedTextureSubImage3D = nullptr;
- PFNGLCOPYNAMEDBUFFERSUBDATAPROC copyNamedBufferSubData = nullptr;
- PFNGLCOPYTEXTURESUBIMAGE1DPROC copyTextureSubImage1D = nullptr;
- PFNGLCOPYTEXTURESUBIMAGE2DPROC copyTextureSubImage2D = nullptr;
- PFNGLCOPYTEXTURESUBIMAGE3DPROC copyTextureSubImage3D = nullptr;
- PFNGLCREATEBUFFERSPROC createBuffers = nullptr;
- PFNGLCREATEFRAMEBUFFERSPROC createFramebuffers = nullptr;
- PFNGLCREATEPROGRAMPIPELINESPROC createProgramPipelines = nullptr;
- PFNGLCREATEQUERIESPROC createQueries = nullptr;
- PFNGLCREATERENDERBUFFERSPROC createRenderbuffers = nullptr;
- PFNGLCREATESAMPLERSPROC createSamplers = nullptr;
- PFNGLCREATETEXTURESPROC createTextures = nullptr;
- PFNGLCREATETRANSFORMFEEDBACKSPROC createTransformFeedbacks = nullptr;
- PFNGLCREATEVERTEXARRAYSPROC createVertexArrays = nullptr;
- PFNGLDISABLEVERTEXARRAYATTRIBPROC disableVertexArrayAttrib = nullptr;
- PFNGLENABLEVERTEXARRAYATTRIBPROC enableVertexArrayAttrib = nullptr;
- PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC flushMappedNamedBufferRange = nullptr;
- PFNGLGENERATETEXTUREMIPMAPPROC generateTextureMipmap = nullptr;
- PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC getCompressedTextureImage = nullptr;
+ PFNGLBINDTEXTUREUNITPROC bindTextureUnit = nullptr;
+ PFNGLBLITNAMEDFRAMEBUFFERPROC blitNamedFramebuffer = nullptr;
+ PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC checkNamedFramebufferStatus = nullptr;
+ PFNGLCLEARNAMEDBUFFERDATAPROC clearNamedBufferData = nullptr;
+ PFNGLCLEARNAMEDBUFFERSUBDATAPROC clearNamedBufferSubData = nullptr;
+ PFNGLCLEARNAMEDFRAMEBUFFERFIPROC clearNamedFramebufferfi = nullptr;
+ PFNGLCLEARNAMEDFRAMEBUFFERFVPROC clearNamedFramebufferfv = nullptr;
+ PFNGLCLEARNAMEDFRAMEBUFFERIVPROC clearNamedFramebufferiv = nullptr;
+ PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC clearNamedFramebufferuiv = nullptr;
+ PFNGLCLIPCONTROLPROC clipControl = nullptr;
+ PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC compressedTextureSubImage1D = nullptr;
+ PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC compressedTextureSubImage2D = nullptr;
+ PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC compressedTextureSubImage3D = nullptr;
+ PFNGLCOPYNAMEDBUFFERSUBDATAPROC copyNamedBufferSubData = nullptr;
+ PFNGLCOPYTEXTURESUBIMAGE1DPROC copyTextureSubImage1D = nullptr;
+ PFNGLCOPYTEXTURESUBIMAGE2DPROC copyTextureSubImage2D = nullptr;
+ PFNGLCOPYTEXTURESUBIMAGE3DPROC copyTextureSubImage3D = nullptr;
+ PFNGLCREATEBUFFERSPROC createBuffers = nullptr;
+ PFNGLCREATEFRAMEBUFFERSPROC createFramebuffers = nullptr;
+ PFNGLCREATEPROGRAMPIPELINESPROC createProgramPipelines = nullptr;
+ PFNGLCREATEQUERIESPROC createQueries = nullptr;
+ PFNGLCREATERENDERBUFFERSPROC createRenderbuffers = nullptr;
+ PFNGLCREATESAMPLERSPROC createSamplers = nullptr;
+ PFNGLCREATETEXTURESPROC createTextures = nullptr;
+ PFNGLCREATETRANSFORMFEEDBACKSPROC createTransformFeedbacks = nullptr;
+ PFNGLCREATEVERTEXARRAYSPROC createVertexArrays = nullptr;
+ PFNGLDISABLEVERTEXARRAYATTRIBPROC disableVertexArrayAttrib = nullptr;
+ PFNGLENABLEVERTEXARRAYATTRIBPROC enableVertexArrayAttrib = nullptr;
+ PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC flushMappedNamedBufferRange = nullptr;
+ PFNGLGENERATETEXTUREMIPMAPPROC generateTextureMipmap = nullptr;
+ PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC getCompressedTextureImage = nullptr;
PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC getCompressedTextureSubImage = nullptr;
- PFNGLGETGRAPHICSRESETSTATUSPROC getGraphicsResetStatus = nullptr;
- PFNGLGETNAMEDBUFFERPARAMETERI64VPROC getNamedBufferParameteri64v = nullptr;
- PFNGLGETNAMEDBUFFERPARAMETERIVPROC getNamedBufferParameteriv = nullptr;
- PFNGLGETNAMEDBUFFERPOINTERVPROC getNamedBufferPointerv = nullptr;
- PFNGLGETNAMEDBUFFERSUBDATAPROC getNamedBufferSubData = nullptr;
- PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC getNamedFramebufferAttachmentParameteriv =
- nullptr;
- PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC getNamedFramebufferParameteriv = nullptr;
- PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC getNamedRenderbufferParameteriv = nullptr;
- PFNGLGETQUERYBUFFEROBJECTI64VPROC getQueryBufferObjecti64v = nullptr;
- PFNGLGETQUERYBUFFEROBJECTIVPROC getQueryBufferObjectiv = nullptr;
- PFNGLGETQUERYBUFFEROBJECTUI64VPROC getQueryBufferObjectui64v = nullptr;
- PFNGLGETQUERYBUFFEROBJECTUIVPROC getQueryBufferObjectuiv = nullptr;
- PFNGLGETTEXTUREIMAGEPROC getTextureImage = nullptr;
- PFNGLGETTEXTURELEVELPARAMETERFVPROC getTextureLevelParameterfv = nullptr;
- PFNGLGETTEXTURELEVELPARAMETERIVPROC getTextureLevelParameteriv = nullptr;
- PFNGLGETTEXTUREPARAMETERIIVPROC getTextureParameterIiv = nullptr;
- PFNGLGETTEXTUREPARAMETERIUIVPROC getTextureParameterIuiv = nullptr;
- PFNGLGETTEXTUREPARAMETERFVPROC getTextureParameterfv = nullptr;
- PFNGLGETTEXTUREPARAMETERIVPROC getTextureParameteriv = nullptr;
- PFNGLGETTEXTURESUBIMAGEPROC getTextureSubImage = nullptr;
- PFNGLGETTRANSFORMFEEDBACKI64_VPROC getTransformFeedbacki64_v = nullptr;
- PFNGLGETTRANSFORMFEEDBACKI_VPROC getTransformFeedbacki_v = nullptr;
- PFNGLGETTRANSFORMFEEDBACKIVPROC getTransformFeedbackiv = nullptr;
- PFNGLGETVERTEXARRAYINDEXED64IVPROC getVertexArrayIndexed64iv = nullptr;
- PFNGLGETVERTEXARRAYINDEXEDIVPROC getVertexArrayIndexediv = nullptr;
- PFNGLGETVERTEXARRAYIVPROC getVertexArrayiv = nullptr;
- PFNGLGETNCOMPRESSEDTEXIMAGEPROC getnCompressedTexImage = nullptr;
- PFNGLGETNTEXIMAGEPROC getnTexImage = nullptr;
- PFNGLGETNUNIFORMDVPROC getnUniformdv = nullptr;
- PFNGLGETNUNIFORMFVPROC getnUniformfv = nullptr;
- PFNGLGETNUNIFORMIVPROC getnUniformiv = nullptr;
- PFNGLGETNUNIFORMUIVPROC getnUniformuiv = nullptr;
- PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC invalidateNamedFramebufferData = nullptr;
- PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC invalidateNamedFramebufferSubData = nullptr;
- PFNGLMAPNAMEDBUFFERPROC mapNamedBuffer = nullptr;
- PFNGLMAPNAMEDBUFFERRANGEPROC mapNamedBufferRange = nullptr;
- PFNGLMEMORYBARRIERBYREGIONPROC memoryBarrierByRegion = nullptr;
- PFNGLNAMEDBUFFERDATAPROC namedBufferData = nullptr;
- PFNGLNAMEDBUFFERSTORAGEPROC namedBufferStorage = nullptr;
- PFNGLNAMEDBUFFERSUBDATAPROC namedBufferSubData = nullptr;
- PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC namedFramebufferDrawBuffer = nullptr;
- PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC namedFramebufferDrawBuffers = nullptr;
- PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC namedFramebufferParameteri = nullptr;
- PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC namedFramebufferReadBuffer = nullptr;
- PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC namedFramebufferRenderbuffer = nullptr;
- PFNGLNAMEDFRAMEBUFFERTEXTUREPROC namedFramebufferTexture = nullptr;
- PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC namedFramebufferTextureLayer = nullptr;
- PFNGLNAMEDRENDERBUFFERSTORAGEPROC namedRenderbufferStorage = nullptr;
+ PFNGLGETGRAPHICSRESETSTATUSPROC getGraphicsResetStatus = nullptr;
+ PFNGLGETNAMEDBUFFERPARAMETERI64VPROC getNamedBufferParameteri64v = nullptr;
+ PFNGLGETNAMEDBUFFERPARAMETERIVPROC getNamedBufferParameteriv = nullptr;
+ PFNGLGETNAMEDBUFFERPOINTERVPROC getNamedBufferPointerv = nullptr;
+ PFNGLGETNAMEDBUFFERSUBDATAPROC getNamedBufferSubData = nullptr;
+ PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC getNamedFramebufferAttachmentParameteriv = nullptr;
+ PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC getNamedFramebufferParameteriv = nullptr;
+ PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC getNamedRenderbufferParameteriv = nullptr;
+ PFNGLGETQUERYBUFFEROBJECTI64VPROC getQueryBufferObjecti64v = nullptr;
+ PFNGLGETQUERYBUFFEROBJECTIVPROC getQueryBufferObjectiv = nullptr;
+ PFNGLGETQUERYBUFFEROBJECTUI64VPROC getQueryBufferObjectui64v = nullptr;
+ PFNGLGETQUERYBUFFEROBJECTUIVPROC getQueryBufferObjectuiv = nullptr;
+ PFNGLGETTEXTUREIMAGEPROC getTextureImage = nullptr;
+ PFNGLGETTEXTURELEVELPARAMETERFVPROC getTextureLevelParameterfv = nullptr;
+ PFNGLGETTEXTURELEVELPARAMETERIVPROC getTextureLevelParameteriv = nullptr;
+ PFNGLGETTEXTUREPARAMETERIIVPROC getTextureParameterIiv = nullptr;
+ PFNGLGETTEXTUREPARAMETERIUIVPROC getTextureParameterIuiv = nullptr;
+ PFNGLGETTEXTUREPARAMETERFVPROC getTextureParameterfv = nullptr;
+ PFNGLGETTEXTUREPARAMETERIVPROC getTextureParameteriv = nullptr;
+ PFNGLGETTEXTURESUBIMAGEPROC getTextureSubImage = nullptr;
+ PFNGLGETTRANSFORMFEEDBACKI64_VPROC getTransformFeedbacki64_v = nullptr;
+ PFNGLGETTRANSFORMFEEDBACKI_VPROC getTransformFeedbacki_v = nullptr;
+ PFNGLGETTRANSFORMFEEDBACKIVPROC getTransformFeedbackiv = nullptr;
+ PFNGLGETVERTEXARRAYINDEXED64IVPROC getVertexArrayIndexed64iv = nullptr;
+ PFNGLGETVERTEXARRAYINDEXEDIVPROC getVertexArrayIndexediv = nullptr;
+ PFNGLGETVERTEXARRAYIVPROC getVertexArrayiv = nullptr;
+ PFNGLGETNCOMPRESSEDTEXIMAGEPROC getnCompressedTexImage = nullptr;
+ PFNGLGETNTEXIMAGEPROC getnTexImage = nullptr;
+ PFNGLGETNUNIFORMDVPROC getnUniformdv = nullptr;
+ PFNGLGETNUNIFORMFVPROC getnUniformfv = nullptr;
+ PFNGLGETNUNIFORMIVPROC getnUniformiv = nullptr;
+ PFNGLGETNUNIFORMUIVPROC getnUniformuiv = nullptr;
+ PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC invalidateNamedFramebufferData = nullptr;
+ PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC invalidateNamedFramebufferSubData = nullptr;
+ PFNGLMAPNAMEDBUFFERPROC mapNamedBuffer = nullptr;
+ PFNGLMAPNAMEDBUFFERRANGEPROC mapNamedBufferRange = nullptr;
+ PFNGLMEMORYBARRIERBYREGIONPROC memoryBarrierByRegion = nullptr;
+ PFNGLNAMEDBUFFERDATAPROC namedBufferData = nullptr;
+ PFNGLNAMEDBUFFERSTORAGEPROC namedBufferStorage = nullptr;
+ PFNGLNAMEDBUFFERSUBDATAPROC namedBufferSubData = nullptr;
+ PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC namedFramebufferDrawBuffer = nullptr;
+ PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC namedFramebufferDrawBuffers = nullptr;
+ PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC namedFramebufferParameteri = nullptr;
+ PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC namedFramebufferReadBuffer = nullptr;
+ PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC namedFramebufferRenderbuffer = nullptr;
+ PFNGLNAMEDFRAMEBUFFERTEXTUREPROC namedFramebufferTexture = nullptr;
+ PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC namedFramebufferTextureLayer = nullptr;
+ PFNGLNAMEDRENDERBUFFERSTORAGEPROC namedRenderbufferStorage = nullptr;
PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC namedRenderbufferStorageMultisample = nullptr;
- PFNGLREADNPIXELSPROC readnPixels = nullptr;
- PFNGLTEXTUREBARRIERPROC textureBarrier = nullptr;
- PFNGLTEXTUREBUFFERPROC textureBuffer = nullptr;
- PFNGLTEXTUREBUFFERRANGEPROC textureBufferRange = nullptr;
- PFNGLTEXTUREPARAMETERIIVPROC textureParameterIiv = nullptr;
- PFNGLTEXTUREPARAMETERIUIVPROC textureParameterIuiv = nullptr;
- PFNGLTEXTUREPARAMETERFPROC textureParameterf = nullptr;
- PFNGLTEXTUREPARAMETERFVPROC textureParameterfv = nullptr;
- PFNGLTEXTUREPARAMETERIPROC textureParameteri = nullptr;
- PFNGLTEXTUREPARAMETERIVPROC textureParameteriv = nullptr;
- PFNGLTEXTURESTORAGE1DPROC textureStorage1D = nullptr;
- PFNGLTEXTURESTORAGE2DPROC textureStorage2D = nullptr;
- PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC textureStorage2DMultisample = nullptr;
- PFNGLTEXTURESTORAGE3DPROC textureStorage3D = nullptr;
- PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC textureStorage3DMultisample = nullptr;
- PFNGLTEXTURESUBIMAGE1DPROC textureSubImage1D = nullptr;
- PFNGLTEXTURESUBIMAGE2DPROC textureSubImage2D = nullptr;
- PFNGLTEXTURESUBIMAGE3DPROC textureSubImage3D = nullptr;
- PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC transformFeedbackBufferBase = nullptr;
- PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC transformFeedbackBufferRange = nullptr;
- PFNGLUNMAPNAMEDBUFFERPROC unmapNamedBuffer = nullptr;
- PFNGLVERTEXARRAYATTRIBBINDINGPROC vertexArrayAttribBinding = nullptr;
- PFNGLVERTEXARRAYATTRIBFORMATPROC vertexArrayAttribFormat = nullptr;
- PFNGLVERTEXARRAYATTRIBIFORMATPROC vertexArrayAttribIFormat = nullptr;
- PFNGLVERTEXARRAYATTRIBLFORMATPROC vertexArrayAttribLFormat = nullptr;
- PFNGLVERTEXARRAYBINDINGDIVISORPROC vertexArrayBindingDivisor = nullptr;
- PFNGLVERTEXARRAYELEMENTBUFFERPROC vertexArrayElementBuffer = nullptr;
- PFNGLVERTEXARRAYVERTEXBUFFERPROC vertexArrayVertexBuffer = nullptr;
- PFNGLVERTEXARRAYVERTEXBUFFERSPROC vertexArrayVertexBuffers = nullptr;
+ PFNGLREADNPIXELSPROC readnPixels = nullptr;
+ PFNGLTEXTUREBARRIERPROC textureBarrier = nullptr;
+ PFNGLTEXTUREBUFFERPROC textureBuffer = nullptr;
+ PFNGLTEXTUREBUFFERRANGEPROC textureBufferRange = nullptr;
+ PFNGLTEXTUREPARAMETERIIVPROC textureParameterIiv = nullptr;
+ PFNGLTEXTUREPARAMETERIUIVPROC textureParameterIuiv = nullptr;
+ PFNGLTEXTUREPARAMETERFPROC textureParameterf = nullptr;
+ PFNGLTEXTUREPARAMETERFVPROC textureParameterfv = nullptr;
+ PFNGLTEXTUREPARAMETERIPROC textureParameteri = nullptr;
+ PFNGLTEXTUREPARAMETERIVPROC textureParameteriv = nullptr;
+ PFNGLTEXTURESTORAGE1DPROC textureStorage1D = nullptr;
+ PFNGLTEXTURESTORAGE2DPROC textureStorage2D = nullptr;
+ PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC textureStorage2DMultisample = nullptr;
+ PFNGLTEXTURESTORAGE3DPROC textureStorage3D = nullptr;
+ PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC textureStorage3DMultisample = nullptr;
+ PFNGLTEXTURESUBIMAGE1DPROC textureSubImage1D = nullptr;
+ PFNGLTEXTURESUBIMAGE2DPROC textureSubImage2D = nullptr;
+ PFNGLTEXTURESUBIMAGE3DPROC textureSubImage3D = nullptr;
+ PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC transformFeedbackBufferBase = nullptr;
+ PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC transformFeedbackBufferRange = nullptr;
+ PFNGLUNMAPNAMEDBUFFERPROC unmapNamedBuffer = nullptr;
+ PFNGLVERTEXARRAYATTRIBBINDINGPROC vertexArrayAttribBinding = nullptr;
+ PFNGLVERTEXARRAYATTRIBFORMATPROC vertexArrayAttribFormat = nullptr;
+ PFNGLVERTEXARRAYATTRIBIFORMATPROC vertexArrayAttribIFormat = nullptr;
+ PFNGLVERTEXARRAYATTRIBLFORMATPROC vertexArrayAttribLFormat = nullptr;
+ PFNGLVERTEXARRAYBINDINGDIVISORPROC vertexArrayBindingDivisor = nullptr;
+ PFNGLVERTEXARRAYELEMENTBUFFERPROC vertexArrayElementBuffer = nullptr;
+ PFNGLVERTEXARRAYVERTEXBUFFERPROC vertexArrayVertexBuffer = nullptr;
+ PFNGLVERTEXARRAYVERTEXBUFFERSPROC vertexArrayVertexBuffers = nullptr;
// ES 3.2
- PFNGLBLENDBARRIERPROC blendBarrier = nullptr;
+ PFNGLBLENDBARRIERPROC blendBarrier = nullptr;
PFNGLPRIMITIVEBOUNDINGBOXPROC primitiveBoundingBox = nullptr;
+ // GL_ARB_parallel_shader_compile
+ PFNGLMAXSHADERCOMPILERTHREADSARBPROC maxShaderCompilerThreadsARB = nullptr;
+
// GL_EXT_debug_marker
PFNGLINSERTEVENTMARKEREXTPROC insertEventMarkerEXT = nullptr;
- PFNGLPOPGROUPMARKEREXTPROC popGroupMarkerEXT = nullptr;
- PFNGLPUSHGROUPMARKEREXTPROC pushGroupMarkerEXT = nullptr;
+ PFNGLPOPGROUPMARKEREXTPROC popGroupMarkerEXT = nullptr;
+ PFNGLPUSHGROUPMARKEREXTPROC pushGroupMarkerEXT = nullptr;
// GL_EXT_discard_framebuffer
PFNGLDISCARDFRAMEBUFFEREXTPROC discardFramebufferEXT = nullptr;
+ // GL_KHR_parallel_shader_compile
+ PFNGLMAXSHADERCOMPILERTHREADSKHRPROC maxShaderCompilerThreadsKHR = nullptr;
+
// GL_NV_internalformat_sample_query
PFNGLGETINTERNALFORMATSAMPLEIVNVPROC getInternalformatSampleivNV = nullptr;
// GL_OES_EGL_image
PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC eGLImageTargetRenderbufferStorageOES = nullptr;
- PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eGLImageTargetTexture2DOES = nullptr;
+ PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eGLImageTargetTexture2DOES = nullptr;
+
+ // GL_OVR_multiview2
+ PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC framebufferTextureMultiviewOVR = nullptr;
// NV_path_rendering (originally written against 3.2 compatibility profile)
- PFNGLCOVERFILLPATHINSTANCEDNVPROC coverFillPathInstancedNV = nullptr;
- PFNGLCOVERFILLPATHNVPROC coverFillPathNV = nullptr;
- PFNGLCOVERSTROKEPATHINSTANCEDNVPROC coverStrokePathInstancedNV = nullptr;
- PFNGLCOVERSTROKEPATHNVPROC coverStrokePathNV = nullptr;
- PFNGLDELETEPATHSNVPROC deletePathsNV = nullptr;
- PFNGLGENPATHSNVPROC genPathsNV = nullptr;
- PFNGLGETPATHPARAMETERFVNVPROC getPathParameterfvNV = nullptr;
- PFNGLGETPATHPARAMETERIVNVPROC getPathParameterivNV = nullptr;
- PFNGLISPATHNVPROC isPathNV = nullptr;
- PFNGLMATRIXLOADFEXTPROC matrixLoadfEXT = nullptr;
- PFNGLPATHCOMMANDSNVPROC pathCommandsNV = nullptr;
- PFNGLPATHPARAMETERFNVPROC pathParameterfNV = nullptr;
- PFNGLPATHPARAMETERINVPROC pathParameteriNV = nullptr;
- PFNGLPATHSTENCILFUNCNVPROC pathStencilFuncNV = nullptr;
- PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC programPathFragmentInputGenNV = nullptr;
- PFNGLSTENCILFILLPATHINSTANCEDNVPROC stencilFillPathInstancedNV = nullptr;
- PFNGLSTENCILFILLPATHNVPROC stencilFillPathNV = nullptr;
- PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC stencilStrokePathInstancedNV = nullptr;
- PFNGLSTENCILSTROKEPATHNVPROC stencilStrokePathNV = nullptr;
- PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC stencilThenCoverFillPathInstancedNV = nullptr;
- PFNGLSTENCILTHENCOVERFILLPATHNVPROC stencilThenCoverFillPathNV = nullptr;
+ PFNGLCOVERFILLPATHINSTANCEDNVPROC coverFillPathInstancedNV = nullptr;
+ PFNGLCOVERFILLPATHNVPROC coverFillPathNV = nullptr;
+ PFNGLCOVERSTROKEPATHINSTANCEDNVPROC coverStrokePathInstancedNV = nullptr;
+ PFNGLCOVERSTROKEPATHNVPROC coverStrokePathNV = nullptr;
+ PFNGLDELETEPATHSNVPROC deletePathsNV = nullptr;
+ PFNGLGENPATHSNVPROC genPathsNV = nullptr;
+ PFNGLGETPATHPARAMETERFVNVPROC getPathParameterfvNV = nullptr;
+ PFNGLGETPATHPARAMETERIVNVPROC getPathParameterivNV = nullptr;
+ PFNGLISPATHNVPROC isPathNV = nullptr;
+ PFNGLMATRIXLOADFEXTPROC matrixLoadfEXT = nullptr;
+ PFNGLPATHCOMMANDSNVPROC pathCommandsNV = nullptr;
+ PFNGLPATHPARAMETERFNVPROC pathParameterfNV = nullptr;
+ PFNGLPATHPARAMETERINVPROC pathParameteriNV = nullptr;
+ PFNGLPATHSTENCILFUNCNVPROC pathStencilFuncNV = nullptr;
+ PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC programPathFragmentInputGenNV = nullptr;
+ PFNGLSTENCILFILLPATHINSTANCEDNVPROC stencilFillPathInstancedNV = nullptr;
+ PFNGLSTENCILFILLPATHNVPROC stencilFillPathNV = nullptr;
+ PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC stencilStrokePathInstancedNV = nullptr;
+ PFNGLSTENCILSTROKEPATHNVPROC stencilStrokePathNV = nullptr;
+ PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC stencilThenCoverFillPathInstancedNV = nullptr;
+ PFNGLSTENCILTHENCOVERFILLPATHNVPROC stencilThenCoverFillPathNV = nullptr;
PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC stencilThenCoverStrokePathInstancedNV = nullptr;
- PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC stencilThenCoverStrokePathNV = nullptr;
+ PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC stencilThenCoverStrokePathNV = nullptr;
+ // clang-format on
DispatchTableGL();
virtual ~DispatchTableGL() = default;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp
index 4a6af59cc68..a89e136543a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/DisplayGL.cpp
@@ -76,7 +76,7 @@ egl::Error DisplayGL::makeCurrent(egl::Surface *drawSurface,
if (drawSurface != nullptr)
{
SurfaceGL *glDrawSurface = GetImplAs<SurfaceGL>(drawSurface);
- ANGLE_TRY(glDrawSurface->makeCurrent());
+ ANGLE_TRY(glDrawSurface->makeCurrent(context));
mCurrentDrawSurface = drawSurface;
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp
index b4799e788a7..e1db56a857e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/FramebufferGL.cpp
@@ -75,7 +75,7 @@ void BindFramebufferAttachment(const FunctionsGL *functions,
texture->getType() == TextureType::_3D ||
texture->getType() == TextureType::_2DMultisampleArray)
{
- if (attachment->getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE)
+ if (attachment->isMultiview())
{
ASSERT(functions->framebufferTexture);
functions->framebufferTexture(GL_FRAMEBUFFER, attachmentPoint,
@@ -136,7 +136,7 @@ bool RequiresMultiviewClear(const FramebufferState &state, bool scissorTestEnabl
{
if (colorAttachment.isAttached())
{
- if (colorAttachment.getMultiviewLayout() == GL_NONE)
+ if (!colorAttachment.isMultiview())
{
return false;
}
@@ -149,7 +149,7 @@ bool RequiresMultiviewClear(const FramebufferState &state, bool scissorTestEnabl
const FramebufferAttachment *depthAttachment = state.getDepthAttachment();
if (depthAttachment)
{
- if (depthAttachment->getMultiviewLayout() == GL_NONE)
+ if (!depthAttachment->isMultiview())
{
return false;
}
@@ -160,7 +160,7 @@ bool RequiresMultiviewClear(const FramebufferState &state, bool scissorTestEnabl
const FramebufferAttachment *stencilAttachment = state.getStencilAttachment();
if (stencilAttachment)
{
- if (stencilAttachment->getMultiviewLayout() == GL_NONE)
+ if (!stencilAttachment->isMultiview())
{
return false;
}
@@ -173,16 +173,11 @@ bool RequiresMultiviewClear(const FramebufferState &state, bool scissorTestEnabl
{
return false;
}
- switch (attachment->getMultiviewLayout())
+ if (attachment->isMultiview())
{
- case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
- // If all layers of each texture array are active, then there is no need to issue a
- // special multiview clear.
- return !allTextureArraysAreFullyAttached;
- case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
- return (scissorTestEnabled == true);
- default:
- UNREACHABLE();
+ // If all layers of each texture array are active, then there is no need to issue a
+ // special multiview clear.
+ return !allTextureArraysAreFullyAttached;
}
return false;
}
@@ -714,9 +709,6 @@ angle::Result FramebufferGL::syncState(const gl::Context *context,
if (attachment && mState.id() == context->getState().getDrawFramebuffer()->id())
{
- const bool isSideBySide =
- (attachment->getMultiviewLayout() == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE);
- stateManager->setSideBySide(isSideBySide);
stateManager->updateMultiviewBaseViewLayerIndexUniform(context->getState().getProgram(),
getState());
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
index 2585d1fa1ee..e819ba8df91 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -148,16 +148,51 @@ class ProgramGL::LinkTask final : public angle::Closure
};
using PostLinkImplFunctor = std::function<angle::Result(bool, const std::string &)>;
+
+// The event for a parallelized linking using the native driver extension.
+class ProgramGL::LinkEventNativeParallel final : public LinkEvent
+{
+ public:
+ LinkEventNativeParallel(PostLinkImplFunctor &&functor,
+ const FunctionsGL *functions,
+ GLuint programID)
+ : mPostLinkImplFunctor(functor), mFunctions(functions), mProgramID(programID)
+ {}
+
+ angle::Result wait(const gl::Context *context) override
+ {
+ GLint linkStatus = GL_FALSE;
+ mFunctions->getProgramiv(mProgramID, GL_LINK_STATUS, &linkStatus);
+ if (linkStatus == GL_TRUE)
+ {
+ return mPostLinkImplFunctor(false, std::string());
+ }
+ return angle::Result::Incomplete;
+ }
+
+ bool isLinking() override
+ {
+ GLint completionStatus = GL_FALSE;
+ mFunctions->getProgramiv(mProgramID, GL_COMPLETION_STATUS, &completionStatus);
+ return completionStatus == GL_FALSE;
+ }
+
+ private:
+ PostLinkImplFunctor mPostLinkImplFunctor;
+ const FunctionsGL *mFunctions;
+ GLuint mProgramID;
+};
+
+// The event for a parallelized linking using the worker thread pool.
class ProgramGL::LinkEventGL final : public LinkEvent
{
public:
LinkEventGL(std::shared_ptr<angle::WorkerThreadPool> workerPool,
std::shared_ptr<ProgramGL::LinkTask> linkTask,
PostLinkImplFunctor &&functor)
- : mWorkerPool(workerPool),
- mLinkTask(linkTask),
- mWaitableEvent(
- std::shared_ptr<angle::WaitableEvent>(workerPool->postWorkerTask(mLinkTask))),
+ : mLinkTask(linkTask),
+ mWaitableEvent(std::shared_ptr<angle::WaitableEvent>(
+ angle::WorkerThreadPool::PostWorkerTask(workerPool, mLinkTask))),
mPostLinkImplFunctor(functor)
{}
@@ -170,7 +205,6 @@ class ProgramGL::LinkEventGL final : public LinkEvent
bool isLinking() override { return !mWaitableEvent->isReady(); }
private:
- std::shared_ptr<angle::WorkerThreadPool> mWorkerPool;
std::shared_ptr<ProgramGL::LinkTask> mLinkTask;
std::shared_ptr<angle::WaitableEvent> mWaitableEvent;
PostLinkImplFunctor mPostLinkImplFunctor;
@@ -430,7 +464,13 @@ std::unique_ptr<LinkEvent> ProgramGL::link(const gl::Context *context,
return angle::Result::Continue;
};
- if (workerPool->isAsync() && (!mWorkarounds.dontRelinkProgramsInParallel || !mLinkedInParallel))
+ if (mRenderer->hasNativeParallelCompile())
+ {
+ mFunctions->linkProgram(mProgramID);
+ return std::make_unique<LinkEventNativeParallel>(postLinkImplTask, mFunctions, mProgramID);
+ }
+ else if (workerPool->isAsync() &&
+ (!mWorkarounds.dontRelinkProgramsInParallel || !mLinkedInParallel))
{
mLinkedInParallel = true;
return std::make_unique<LinkEventGL>(workerPool, linkTask, postLinkImplTask);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
index c92398f401f..a7b29203267 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ProgramGL.h
@@ -117,6 +117,7 @@ class ProgramGL : public ProgramImpl
private:
class LinkTask;
+ class LinkEventNativeParallel;
class LinkEventGL;
void preLink();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
index 042ead517d3..10b15594ab0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.cpp
@@ -55,6 +55,19 @@ std::vector<GLuint> GatherPaths(const std::vector<gl::Path *> &paths)
return ret;
}
+void SetMaxShaderCompilerThreads(const rx::FunctionsGL *functions, GLuint count)
+{
+ if (functions->maxShaderCompilerThreadsKHR != nullptr)
+ {
+ functions->maxShaderCompilerThreadsKHR(count);
+ }
+ else
+ {
+ ASSERT(functions->maxShaderCompilerThreadsARB != nullptr);
+ functions->maxShaderCompilerThreadsARB(count);
+ }
+}
+
} // namespace
static void INTERNAL_GL_APIENTRY LogGLDebugMessage(GLenum source,
@@ -175,7 +188,8 @@ RendererGL::RendererGL(std::unique_ptr<FunctionsGL> functions, const egl::Attrib
mMultiviewClearer(nullptr),
mUseDebugOutput(false),
mCapsInitialized(false),
- mMultiviewImplementationType(MultiviewImplementationTypeGL::UNSPECIFIED)
+ mMultiviewImplementationType(MultiviewImplementationTypeGL::UNSPECIFIED),
+ mNativeParallelCompileEnabled(false)
{
ASSERT(mFunctions);
nativegl_gl::GenerateWorkarounds(mFunctions.get(), &mWorkarounds);
@@ -215,6 +229,12 @@ RendererGL::RendererGL(std::unique_ptr<FunctionsGL> functions, const egl::Attrib
mFunctions->vertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 1.0f);
}
}
+
+ if (hasNativeParallelCompile() && !mNativeParallelCompileEnabled)
+ {
+ SetMaxShaderCompilerThreads(mFunctions.get(), 0xffffffff);
+ mNativeParallelCompileEnabled = true;
+ }
}
RendererGL::~RendererGL()
@@ -411,9 +431,9 @@ void RendererGL::stencilThenCoverStrokePathInstanced(const gl::State &state,
ASSERT(mFunctions->getError() == GL_NO_ERROR);
}
-GLenum RendererGL::getResetStatus()
+gl::GraphicsResetStatus RendererGL::getResetStatus()
{
- return mFunctions->getGraphicsResetStatus();
+ return gl::FromGLenum<gl::GraphicsResetStatus>(mFunctions->getGraphicsResetStatus());
}
void RendererGL::insertEventMarker(GLsizei length, const char *marker) {}
@@ -617,6 +637,20 @@ unsigned int RendererGL::getMaxWorkerContexts()
return std::min(16u, std::thread::hardware_concurrency());
}
+bool RendererGL::hasNativeParallelCompile()
+{
+ return mFunctions->maxShaderCompilerThreadsKHR != nullptr ||
+ mFunctions->maxShaderCompilerThreadsARB != nullptr;
+}
+
+void RendererGL::setMaxShaderCompilerThreads(GLuint count)
+{
+ if (hasNativeParallelCompile())
+ {
+ SetMaxShaderCompilerThreads(mFunctions.get(), count);
+ }
+}
+
ScopedWorkerContextGL::ScopedWorkerContextGL(RendererGL *renderer, std::string *infoLog)
: mRenderer(renderer)
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
index f8f6c6b632b..4a9be3d7218 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/RendererGL.h
@@ -138,7 +138,7 @@ class RendererGL : angle::NonCopyable
GLenum transformType,
const GLfloat *transformValues);
- GLenum getResetStatus();
+ gl::GraphicsResetStatus getResetStatus();
// EXT_debug_marker
void insertEventMarker(GLsizei length, const char *marker);
@@ -180,6 +180,10 @@ class RendererGL : angle::NonCopyable
bool bindWorkerContext(std::string *infoLog);
void unbindWorkerContext();
+ // Checks if the driver has the KHR_parallel_shader_compile or ARB_parallel_shader_compile
+ // extension.
+ bool hasNativeParallelCompile();
+ void setMaxShaderCompilerThreads(GLuint count);
static unsigned int getMaxWorkerContexts();
@@ -218,6 +222,8 @@ class RendererGL : angle::NonCopyable
std::list<std::unique_ptr<WorkerContext>> mWorkerContextPool;
// Protect the concurrent accesses to worker contexts.
std::mutex mWorkerMutex;
+
+ bool mNativeParallelCompileEnabled;
};
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
index 4067d6ad29a..19d40cc020d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.cpp
@@ -20,6 +20,131 @@
namespace rx
{
+using CompileAndCheckShaderInWorkerFunctor = std::function<bool(const char *source)>;
+class TranslateTaskGL : public angle::Closure
+{
+ public:
+ TranslateTaskGL(ShHandle handle,
+ ShCompileOptions options,
+ const std::string &source,
+ CompileAndCheckShaderInWorkerFunctor &&compileAndCheckShaderInWorkerFunctor)
+ : mHandle(handle),
+ mOptions(options),
+ mSource(source),
+ mCompileAndCheckShaderInWorkerFunctor(std::move(compileAndCheckShaderInWorkerFunctor)),
+ mResult(false),
+ mWorkerAvailable(true)
+ {}
+
+ void operator()() override
+ {
+ const char *source = mSource.c_str();
+ mResult = sh::Compile(mHandle, &source, 1, mOptions);
+ if (mResult)
+ {
+ mWorkerAvailable =
+ mCompileAndCheckShaderInWorkerFunctor(sh::GetObjectCode(mHandle).c_str());
+ }
+ }
+
+ bool getResult() { return mResult; }
+
+ bool workerAvailable() { return mWorkerAvailable; }
+
+ ShHandle getHandle() { return mHandle; }
+
+ private:
+ ShHandle mHandle;
+ ShCompileOptions mOptions;
+ std::string mSource;
+ CompileAndCheckShaderInWorkerFunctor mCompileAndCheckShaderInWorkerFunctor;
+ bool mResult;
+ bool mWorkerAvailable;
+};
+
+using PostTranslateFunctor = std::function<bool(std::string *infoLog)>;
+using CompileAndCheckShaderFunctor = std::function<void(const char *source)>;
+class WaitableCompileEventWorkerContext final : public WaitableCompileEvent
+{
+ public:
+ WaitableCompileEventWorkerContext(std::shared_ptr<angle::WaitableEvent> waitableEvent,
+ CompileAndCheckShaderFunctor &&compileAndCheckShaderFunctor,
+ PostTranslateFunctor &&postTranslateFunctor,
+ std::shared_ptr<TranslateTaskGL> translateTask)
+ : WaitableCompileEvent(waitableEvent),
+ mCompileAndCheckShaderFunctor(std::move(compileAndCheckShaderFunctor)),
+ mPostTranslateFunctor(std::move(postTranslateFunctor)),
+ mTranslateTask(translateTask)
+ {}
+
+ bool getResult() override { return mTranslateTask->getResult(); }
+
+ bool postTranslate(std::string *infoLog) override
+ {
+ if (!mTranslateTask->workerAvailable())
+ {
+ ShHandle handle = mTranslateTask->getHandle();
+ mCompileAndCheckShaderFunctor(sh::GetObjectCode(handle).c_str());
+ }
+ return mPostTranslateFunctor(infoLog);
+ }
+
+ private:
+ CompileAndCheckShaderFunctor mCompileAndCheckShaderFunctor;
+ PostTranslateFunctor mPostTranslateFunctor;
+ std::shared_ptr<TranslateTaskGL> mTranslateTask;
+};
+
+using PeekCompletionFunctor = std::function<bool()>;
+using CheckShaderFunctor = std::function<void()>;
+
+class WaitableCompileEventNativeParallel final : public WaitableCompileEvent
+{
+ public:
+ WaitableCompileEventNativeParallel(PostTranslateFunctor &&postTranslateFunctor,
+ bool result,
+ CheckShaderFunctor &&checkShaderFunctor,
+ PeekCompletionFunctor &&peekCompletionFunctor)
+ : WaitableCompileEvent(std::shared_ptr<angle::WaitableEventDone>()),
+ mPostTranslateFunctor(std::move(postTranslateFunctor)),
+ mResult(result),
+ mCheckShaderFunctor(std::move(checkShaderFunctor)),
+ mPeekCompletionFunctor(std::move(peekCompletionFunctor))
+ {}
+
+ void wait() override { mCheckShaderFunctor(); }
+
+ bool isReady() override { return mPeekCompletionFunctor(); }
+
+ bool getResult() override { return mResult; }
+
+ bool postTranslate(std::string *infoLog) override { return mPostTranslateFunctor(infoLog); }
+
+ private:
+ PostTranslateFunctor mPostTranslateFunctor;
+ bool mResult;
+ CheckShaderFunctor mCheckShaderFunctor;
+ PeekCompletionFunctor mPeekCompletionFunctor;
+};
+
+class WaitableCompileEventDone final : public WaitableCompileEvent
+{
+ public:
+ WaitableCompileEventDone(PostTranslateFunctor &&postTranslateFunctor, bool result)
+ : WaitableCompileEvent(std::make_shared<angle::WaitableEventDone>()),
+ mPostTranslateFunctor(std::move(postTranslateFunctor)),
+ mResult(result)
+ {}
+
+ bool getResult() override { return mResult; }
+
+ bool postTranslate(std::string *infoLog) override { return mPostTranslateFunctor(infoLog); }
+
+ private:
+ PostTranslateFunctor mPostTranslateFunctor;
+ bool mResult;
+};
+
ShaderGL::ShaderGL(const gl::ShaderState &data,
GLuint shaderID,
MultiviewImplementationTypeGL multiviewImplementationType,
@@ -28,7 +153,6 @@ ShaderGL::ShaderGL(const gl::ShaderState &data,
mShaderID(shaderID),
mMultiviewImplementationType(multiviewImplementationType),
mRenderer(renderer),
- mFallbackToMainThread(true),
mCompileStatus(GL_FALSE)
{}
@@ -43,171 +167,235 @@ void ShaderGL::destroy()
mShaderID = 0;
}
-ShCompileOptions ShaderGL::prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string * /*sourcePath*/)
+void ShaderGL::compileAndCheckShader(const char *source)
+{
+ compileShader(source);
+ checkShader();
+}
+
+void ShaderGL::compileShader(const char *source)
{
- *sourceStream << mData.getSource();
+ const FunctionsGL *functions = mRenderer->getFunctions();
+ functions->shaderSource(mShaderID, 1, &source, nullptr);
+ functions->compileShader(mShaderID);
+}
- ShCompileOptions options = SH_INIT_GL_POSITION;
+void ShaderGL::checkShader()
+{
+ const FunctionsGL *functions = mRenderer->getFunctions();
+
+ // Check for compile errors from the native driver
+ mCompileStatus = GL_FALSE;
+ functions->getShaderiv(mShaderID, GL_COMPILE_STATUS, &mCompileStatus);
+ if (mCompileStatus == GL_FALSE)
+ {
+ // Compilation failed, put the error into the info log
+ GLint infoLogLength = 0;
+ functions->getShaderiv(mShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
+
+ // Info log length includes the null terminator, so 1 means that the info log is an empty
+ // string.
+ if (infoLogLength > 1)
+ {
+ std::vector<char> buf(infoLogLength);
+ functions->getShaderInfoLog(mShaderID, infoLogLength, nullptr, &buf[0]);
+
+ mInfoLog += &buf[0];
+ WARN() << std::endl << mInfoLog;
+ }
+ else
+ {
+ WARN() << std::endl << "Shader compilation failed with no info log.";
+ }
+ }
+}
+
+bool ShaderGL::peekCompletion()
+{
+ const FunctionsGL *functions = mRenderer->getFunctions();
+ GLint status = GL_FALSE;
+ functions->getShaderiv(mShaderID, GL_COMPLETION_STATUS, &status);
+ return status == GL_TRUE;
+}
+
+bool ShaderGL::compileAndCheckShaderInWorker(const char *source)
+{
+ std::string workerInfoLog;
+ ScopedWorkerContextGL worker(mRenderer.get(), &workerInfoLog);
+ if (worker())
+ {
+ compileAndCheckShader(source);
+ return true;
+ }
+ else
+ {
+#if !defined(NDEBUG)
+ mInfoLog += "bindWorkerContext failed.\n" + workerInfoLog;
+#endif
+ return false;
+ }
+}
+
+std::shared_ptr<WaitableCompileEvent> ShaderGL::compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options)
+{
+ mInfoLog.clear();
+
+ ShCompileOptions additionalOptions = SH_INIT_GL_POSITION;
bool isWebGL = context->getExtensions().webglCompatibility;
if (isWebGL && (mData.getShaderType() != gl::ShaderType::Compute))
{
- options |= SH_INIT_OUTPUT_VARIABLES;
+ additionalOptions |= SH_INIT_OUTPUT_VARIABLES;
}
const WorkaroundsGL &workarounds = GetWorkaroundsGL(context);
if (workarounds.doWhileGLSLCausesGPUHang)
{
- options |= SH_REWRITE_DO_WHILE_LOOPS;
+ additionalOptions |= SH_REWRITE_DO_WHILE_LOOPS;
}
if (workarounds.emulateAbsIntFunction)
{
- options |= SH_EMULATE_ABS_INT_FUNCTION;
+ additionalOptions |= SH_EMULATE_ABS_INT_FUNCTION;
}
if (workarounds.addAndTrueToLoopCondition)
{
- options |= SH_ADD_AND_TRUE_TO_LOOP_CONDITION;
+ additionalOptions |= SH_ADD_AND_TRUE_TO_LOOP_CONDITION;
}
if (workarounds.emulateIsnanFloat)
{
- options |= SH_EMULATE_ISNAN_FLOAT_FUNCTION;
+ additionalOptions |= SH_EMULATE_ISNAN_FLOAT_FUNCTION;
}
if (workarounds.emulateAtan2Float)
{
- options |= SH_EMULATE_ATAN2_FLOAT_FUNCTION;
+ additionalOptions |= SH_EMULATE_ATAN2_FLOAT_FUNCTION;
}
if (workarounds.useUnusedBlocksWithStandardOrSharedLayout)
{
- options |= SH_USE_UNUSED_STANDARD_SHARED_BLOCKS;
+ additionalOptions |= SH_USE_UNUSED_STANDARD_SHARED_BLOCKS;
}
if (workarounds.dontRemoveInvariantForFragmentInput)
{
- options |= SH_DONT_REMOVE_INVARIANT_FOR_FRAGMENT_INPUT;
+ additionalOptions |= SH_DONT_REMOVE_INVARIANT_FOR_FRAGMENT_INPUT;
}
if (workarounds.removeInvariantAndCentroidForESSL3)
{
- options |= SH_REMOVE_INVARIANT_AND_CENTROID_FOR_ESSL3;
+ additionalOptions |= SH_REMOVE_INVARIANT_AND_CENTROID_FOR_ESSL3;
}
if (workarounds.rewriteFloatUnaryMinusOperator)
{
- options |= SH_REWRITE_FLOAT_UNARY_MINUS_OPERATOR;
+ additionalOptions |= SH_REWRITE_FLOAT_UNARY_MINUS_OPERATOR;
}
if (!workarounds.dontInitializeUninitializedLocals)
{
- options |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
+ additionalOptions |= SH_INITIALIZE_UNINITIALIZED_LOCALS;
}
if (workarounds.clampPointSize)
{
- options |= SH_CLAMP_POINT_SIZE;
+ additionalOptions |= SH_CLAMP_POINT_SIZE;
}
if (workarounds.rewriteVectorScalarArithmetic)
{
- options |= SH_REWRITE_VECTOR_SCALAR_ARITHMETIC;
+ additionalOptions |= SH_REWRITE_VECTOR_SCALAR_ARITHMETIC;
}
if (workarounds.dontUseLoopsToInitializeVariables)
{
- options |= SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES;
+ additionalOptions |= SH_DONT_USE_LOOPS_TO_INITIALIZE_VARIABLES;
}
if (workarounds.clampFragDepth)
{
- options |= SH_CLAMP_FRAG_DEPTH;
+ additionalOptions |= SH_CLAMP_FRAG_DEPTH;
}
if (workarounds.rewriteRepeatedAssignToSwizzled)
{
- options |= SH_REWRITE_REPEATED_ASSIGN_TO_SWIZZLED;
+ additionalOptions |= SH_REWRITE_REPEATED_ASSIGN_TO_SWIZZLED;
}
if (mMultiviewImplementationType == MultiviewImplementationTypeGL::NV_VIEWPORT_ARRAY2)
{
- options |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW;
- options |= SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER;
+ additionalOptions |= SH_INITIALIZE_BUILTINS_FOR_INSTANCED_MULTIVIEW;
+ additionalOptions |= SH_SELECT_VIEW_IN_NV_GLSL_VERTEX_SHADER;
}
- mFallbackToMainThread = true;
-
- return options;
-}
+ options |= additionalOptions;
-void ShaderGL::compileAndCheckShader(const char *source)
-{
- const FunctionsGL *functions = mRenderer->getFunctions();
- functions->shaderSource(mShaderID, 1, &source, nullptr);
- functions->compileShader(mShaderID);
+ auto workerThreadPool = context->getWorkerThreadPool();
- // Check for compile errors from the native driver
- mCompileStatus = GL_FALSE;
- functions->getShaderiv(mShaderID, GL_COMPILE_STATUS, &mCompileStatus);
- if (mCompileStatus == GL_FALSE)
- {
- // Compilation failed, put the error into the info log
- GLint infoLogLength = 0;
- functions->getShaderiv(mShaderID, GL_INFO_LOG_LENGTH, &infoLogLength);
+ const std::string &source = mData.getSource();
- // Info log length includes the null terminator, so 1 means that the info log is an empty
- // string.
- if (infoLogLength > 1)
+ auto postTranslateFunctor = [this](std::string *infoLog) {
+ if (mCompileStatus == GL_FALSE)
{
- std::vector<char> buf(infoLogLength);
- functions->getShaderInfoLog(mShaderID, infoLogLength, nullptr, &buf[0]);
+ *infoLog = mInfoLog;
+ return false;
+ }
+ return true;
+ };
- mInfoLog = &buf[0];
- WARN() << std::endl << mInfoLog;
+ if (mRenderer->hasNativeParallelCompile())
+ {
+ ShHandle handle = compilerInstance->getHandle();
+ const char *str = source.c_str();
+ bool result = sh::Compile(handle, &str, 1, options);
+ if (result)
+ {
+ compileShader(sh::GetObjectCode(handle).c_str());
+ auto checkShaderFunctor = [this]() { checkShader(); };
+ auto peekCompletionFunctor = [this]() { return peekCompletion(); };
+ return std::make_shared<WaitableCompileEventNativeParallel>(
+ std::move(postTranslateFunctor), result, std::move(checkShaderFunctor),
+ std::move(peekCompletionFunctor));
}
else
{
- WARN() << std::endl << "Shader compilation failed with no info log.";
+ return std::make_shared<WaitableCompileEventDone>([](std::string *) { return true; },
+ result);
}
}
-}
-
-void ShaderGL::compileAsync(const std::string &source, std::string &infoLog)
-{
- std::string workerInfoLog;
- ScopedWorkerContextGL worker(mRenderer.get(), &workerInfoLog);
- if (worker())
+ else if (workerThreadPool->isAsync())
{
- compileAndCheckShader(source.c_str());
- mFallbackToMainThread = false;
+ auto compileAndCheckShaderInWorkerFunctor = [this](const char *source) {
+ return compileAndCheckShaderInWorker(source);
+ };
+ auto translateTask =
+ std::make_shared<TranslateTaskGL>(compilerInstance->getHandle(), options, source,
+ std::move(compileAndCheckShaderInWorkerFunctor));
+
+ auto compileAndCheckShaderFunctor = [this](const char *source) {
+ compileAndCheckShader(source);
+ };
+ return std::make_shared<WaitableCompileEventWorkerContext>(
+ angle::WorkerThreadPool::PostWorkerTask(workerThreadPool, translateTask),
+ std::move(compileAndCheckShaderFunctor), std::move(postTranslateFunctor),
+ translateTask);
}
else
{
-#if !defined(NDEBUG)
- infoLog += "bindWorkerContext failed.\n" + workerInfoLog;
-#endif
- }
-}
-
-bool ShaderGL::postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog)
-{
- if (mFallbackToMainThread)
- {
- const char *translatedSourceCString = mData.getTranslatedSource().c_str();
- compileAndCheckShader(translatedSourceCString);
- }
- if (mCompileStatus == GL_FALSE)
- {
- *infoLog = mInfoLog;
- return false;
+ ShHandle handle = compilerInstance->getHandle();
+ const char *str = source.c_str();
+ bool result = sh::Compile(handle, &str, 1, options);
+ if (result)
+ {
+ compileAndCheckShader(sh::GetObjectCode(handle).c_str());
+ }
+ return std::make_shared<WaitableCompileEventDone>(std::move(postTranslateFunctor), result);
}
-
- return true;
}
std::string ShaderGL::getDebugInfo() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
index 43d2ba5e335..b767103abd5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/ShaderGL.h
@@ -28,23 +28,24 @@ class ShaderGL : public ShaderImpl
void destroy() override;
- // ShaderImpl implementation
- ShCompileOptions prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string *sourcePath) override;
- void compileAsync(const std::string &source, std::string &infoLog) override;
- bool postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog) override;
+ std::shared_ptr<WaitableCompileEvent> compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options) override;
+
std::string getDebugInfo() const override;
GLuint getShaderID() const;
private:
void compileAndCheckShader(const char *source);
+ void compileShader(const char *source);
+ void checkShader();
+ bool peekCompletion();
+ bool compileAndCheckShaderInWorker(const char *source);
GLuint mShaderID;
MultiviewImplementationTypeGL mMultiviewImplementationType;
std::shared_ptr<RendererGL> mRenderer;
- bool mFallbackToMainThread;
GLint mCompileStatus;
std::string mInfoLog;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
index 3ddbcb379d5..c5b7487f1e6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.cpp
@@ -36,36 +36,6 @@ namespace rx
StateManagerGL::IndexedBufferBinding::IndexedBufferBinding() : offset(0), size(0), buffer(0) {}
-namespace
-{
-bool AllRectanglesMatch(const gl::Rectangle &matchingRectangle,
- const std::vector<gl::Rectangle> &rectangles)
-{
- for (const auto &rect : rectangles)
- {
- if (matchingRectangle != rect)
- {
- return false;
- }
- }
- return true;
-}
-
-std::vector<gl::Rectangle> ApplyOffsets(const gl::Rectangle &modifiableRectangle,
- const std::vector<gl::Offset> &offsets)
-{
- std::vector<gl::Rectangle> result;
- result.reserve(offsets.size());
- for (size_t i = 0u; i < offsets.size(); ++i)
- {
- result.emplace_back(gl::Rectangle(modifiableRectangle.x + offsets[i].x,
- modifiableRectangle.y + offsets[i].y,
- modifiableRectangle.width, modifiableRectangle.height));
- }
- return result;
-}
-} // namespace
-
StateManagerGL::StateManagerGL(const FunctionsGL *functions,
const gl::Caps &rendererCaps,
const gl::Extensions &extensions)
@@ -96,9 +66,8 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions,
mFramebuffers(angle::FramebufferBindingSingletonMax, 0),
mRenderbuffer(0),
mScissorTestEnabled(false),
- mScissors(extensions.maxViews),
- mViewports(extensions.maxViews),
- mViewportOffsets(extensions.maxViews),
+ mScissor(0, 0, 0, 0),
+ mViewport(0, 0, 0, 0),
mNear(0.0f),
mFar(1.0f),
mBlendEnabled(false),
@@ -157,8 +126,7 @@ StateManagerGL::StateManagerGL(const FunctionsGL *functions,
mPathStencilFunc(GL_ALWAYS),
mPathStencilRef(0),
mPathStencilMask(std::numeric_limits<GLuint>::max()),
- mIsSideBySideDrawFramebuffer(false),
- mIsMultiviewEnabled(extensions.multiview),
+ mIsMultiviewEnabled(extensions.multiview2),
mProvokingVertex(GL_LAST_VERTEX_CONVENTION),
mLocalDirtyBits()
{
@@ -1016,81 +984,26 @@ void StateManagerGL::setScissorTestEnabled(bool enabled)
void StateManagerGL::setScissor(const gl::Rectangle &scissor)
{
- if (!AllRectanglesMatch(scissor, mScissors))
- {
- mScissors.assign(mScissors.size(), scissor);
- mFunctions->scissor(scissor.x, scissor.y, scissor.width, scissor.height);
-
- mLocalDirtyBits.set(gl::State::DIRTY_BIT_SCISSOR);
- }
-}
-
-void StateManagerGL::setScissorArrayv(GLuint first, const std::vector<gl::Rectangle> &scissors)
-{
- ASSERT(mFunctions->scissorArrayv != nullptr);
- size_t offset = static_cast<size_t>(first);
- ASSERT(offset + scissors.size() <= mScissors.size());
- if (!std::equal(scissors.cbegin(), scissors.cend(), mScissors.cbegin() + offset))
+ if (scissor != mScissor)
{
- std::copy(scissors.begin(), scissors.end(), mScissors.begin() + offset);
- mFunctions->scissorArrayv(first, static_cast<GLsizei>(scissors.size()), &scissors[0].x);
- mLocalDirtyBits.set(gl::State::DIRTY_BIT_SCISSOR);
- }
-}
+ mScissor = scissor;
+ mFunctions->scissor(mScissor.x, mScissor.y, mScissor.width, mScissor.height);
-void StateManagerGL::setScissorIndexed(GLuint index, const gl::Rectangle &scissor)
-{
- ASSERT(mFunctions->scissorIndexed != nullptr);
- ASSERT(static_cast<size_t>(index) < mScissors.size());
- if (mScissors[index] != scissor)
- {
- mScissors[index] = scissor;
- mFunctions->scissorIndexed(index, scissor.x, scissor.y, scissor.width, scissor.height);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_SCISSOR);
}
}
void StateManagerGL::setViewport(const gl::Rectangle &viewport)
{
- if (!AllRectanglesMatch(viewport, mViewports))
+ if (viewport != mViewport)
{
- mViewports.assign(mViewports.size(), viewport);
- mFunctions->viewport(viewport.x, viewport.y, viewport.width, viewport.height);
+ mViewport = viewport;
+ mFunctions->viewport(mViewport.x, mViewport.y, mViewport.width, mViewport.height);
mLocalDirtyBits.set(gl::State::DIRTY_BIT_VIEWPORT);
}
}
-void StateManagerGL::setViewportArrayv(GLuint first, const std::vector<gl::Rectangle> &viewports)
-{
- ASSERT(mFunctions->viewportArrayv != nullptr);
- size_t offset = static_cast<size_t>(first);
- ASSERT(offset + viewports.size() <= mViewports.size());
- if (!std::equal(viewports.cbegin(), viewports.cend(), mViewports.cbegin() + offset))
- {
- std::copy(viewports.begin(), viewports.end(), mViewports.begin() + offset);
- std::vector<float> viewportsAsFloats(4u * viewports.size());
- for (size_t i = 0u; i < viewports.size(); ++i)
- {
- viewportsAsFloats[i * 4u] = static_cast<float>(viewports[i].x);
- viewportsAsFloats[i * 4u + 1u] = static_cast<float>(viewports[i].y);
- viewportsAsFloats[i * 4u + 2u] = static_cast<float>(viewports[i].width);
- viewportsAsFloats[i * 4u + 3u] = static_cast<float>(viewports[i].height);
- }
- mFunctions->viewportArrayv(first, static_cast<GLsizei>(viewports.size()),
- viewportsAsFloats.data());
- mLocalDirtyBits.set(gl::State::DIRTY_BIT_VIEWPORT);
- }
-}
-
-void StateManagerGL::setSideBySide(bool isSideBySide)
-{
- if (mIsSideBySideDrawFramebuffer != isSideBySide)
- {
- mIsSideBySideDrawFramebuffer = isSideBySide;
- }
-}
-
void StateManagerGL::setDepthRange(float near, float far)
{
if (mNear != near || mFar != far)
@@ -1586,24 +1499,6 @@ void StateManagerGL::syncState(const gl::Context *context,
{
mLocalDirtyBits.set(gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB);
}
-
- if (mIsMultiviewEnabled)
- {
- // When a new draw framebuffer is bound, we have to mark the layout, viewport offsets,
- // scissor test, scissor and viewport rectangle bits as dirty because it could be a
- // transition from or to a side-by-side draw framebuffer.
- mLocalDirtyBits.set(gl::State::DIRTY_BIT_SCISSOR_TEST_ENABLED);
- mLocalDirtyBits.set(gl::State::DIRTY_BIT_SCISSOR);
- mLocalDirtyBits.set(gl::State::DIRTY_BIT_VIEWPORT);
-
- const gl::FramebufferAttachment *attachment =
- state.getDrawFramebuffer()->getFirstNonNullAttachment();
- if (attachment)
- {
- setSideBySide(attachment->getMultiviewLayout() ==
- GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE);
- }
- }
}
const gl::State::DirtyBits glAndLocalDirtyBits = (glDirtyBits | mLocalDirtyBits) & bitMask;
@@ -1624,31 +1519,13 @@ void StateManagerGL::syncState(const gl::Context *context,
case gl::State::DIRTY_BIT_SCISSOR:
{
const gl::Rectangle &scissor = state.getScissor();
- if (!mIsSideBySideDrawFramebuffer)
- {
- setScissor(scissor);
- }
- else
- {
- const gl::Framebuffer *drawFramebuffer = state.getDrawFramebuffer();
- ASSERT(drawFramebuffer != nullptr);
- applyViewportOffsetsAndSetScissors(scissor, *drawFramebuffer);
- }
+ setScissor(scissor);
}
break;
case gl::State::DIRTY_BIT_VIEWPORT:
{
const gl::Rectangle &viewport = state.getViewport();
- if (!mIsSideBySideDrawFramebuffer)
- {
- setViewport(viewport);
- }
- else
- {
- const gl::Framebuffer *drawFramebuffer = state.getDrawFramebuffer();
- ASSERT(drawFramebuffer != nullptr);
- applyViewportOffsetsAndSetViewports(viewport, *drawFramebuffer);
- }
+ setViewport(viewport);
}
break;
case gl::State::DIRTY_BIT_DEPTH_RANGE:
@@ -2143,35 +2020,6 @@ void StateManagerGL::setTextureCubemapSeamlessEnabled(bool enabled)
}
}
-// According to the ANGLE_multiview spec, the behavior of glScissor and glViewport is different
-// if the active draw framebuffer has a side-by-side layout. In such situations glScissor and
-// glViewport specify the static offset and dimensions for each view to which the viewport
-// offsets have to be applied to compute the view's final scissor and viewport rectangles.
-void StateManagerGL::applyViewportOffsetsAndSetScissors(const gl::Rectangle &scissor,
- const gl::Framebuffer &drawFramebuffer)
-{
-
- const std::vector<gl::Offset> *attachmentViewportOffsets = drawFramebuffer.getViewportOffsets();
- const std::vector<gl::Offset> &viewportOffsets =
- attachmentViewportOffsets != nullptr
- ? *attachmentViewportOffsets
- : gl::FramebufferAttachment::GetDefaultViewportOffsetVector();
- const std::vector<gl::Rectangle> &scissorArray = ApplyOffsets(scissor, viewportOffsets);
- setScissorArrayv(0u, scissorArray);
-}
-
-void StateManagerGL::applyViewportOffsetsAndSetViewports(const gl::Rectangle &viewport,
- const gl::Framebuffer &drawFramebuffer)
-{
- const std::vector<gl::Offset> *attachmentViewportOffsets = drawFramebuffer.getViewportOffsets();
- const std::vector<gl::Offset> &viewportOffsets =
- attachmentViewportOffsets != nullptr
- ? *attachmentViewportOffsets
- : gl::FramebufferAttachment::GetDefaultViewportOffsetVector();
- const std::vector<gl::Rectangle> &viewportArray = ApplyOffsets(viewport, viewportOffsets);
- setViewportArrayv(0u, viewportArray);
-}
-
void StateManagerGL::propagateProgramToVAO(const gl::Program *program, VertexArrayGL *vao)
{
if (vao == nullptr)
@@ -2203,16 +2051,9 @@ void StateManagerGL::updateMultiviewBaseViewLayerIndexUniformImpl(
{
ASSERT(mIsMultiviewEnabled && program && program->usesMultiview());
const ProgramGL *programGL = GetImplAs<ProgramGL>(program);
- switch (drawFramebufferState.getMultiviewLayout())
+ if (drawFramebufferState.isMultiview())
{
- case GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE:
- programGL->enableSideBySideRenderingPath();
- break;
- case GL_FRAMEBUFFER_MULTIVIEW_LAYERED_ANGLE:
- programGL->enableLayeredRenderingPath(drawFramebufferState.getBaseViewIndex());
- break;
- default:
- break;
+ programGL->enableLayeredRenderingPath(drawFramebufferState.getBaseViewIndex());
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
index 41c903e0895..67193b3d773 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/StateManagerGL.h
@@ -81,15 +81,10 @@ class StateManagerGL final : angle::NonCopyable
void setScissorTestEnabled(bool enabled);
void setScissor(const gl::Rectangle &scissor);
- void setScissorIndexed(GLuint index, const gl::Rectangle &scissor);
- void setScissorArrayv(GLuint first, const std::vector<gl::Rectangle> &viewports);
void setViewport(const gl::Rectangle &viewport);
- void setViewportArrayv(GLuint first, const std::vector<gl::Rectangle> &viewports);
void setDepthRange(float near, float far);
- void setSideBySide(bool isSideBySide);
-
void setBlendEnabled(bool enabled);
void setBlendColor(const gl::ColorF &blendColor);
void setBlendFuncs(GLenum sourceBlendRGB,
@@ -183,10 +178,6 @@ class StateManagerGL final : angle::NonCopyable
private:
void setTextureCubemapSeamlessEnabled(bool enabled);
- void applyViewportOffsetsAndSetScissors(const gl::Rectangle &scissor,
- const gl::Framebuffer &drawFramebuffer);
- void applyViewportOffsetsAndSetViewports(const gl::Rectangle &viewport,
- const gl::Framebuffer &drawFramebuffer);
void propagateProgramToVAO(const gl::Program *program, VertexArrayGL *vao);
void updateProgramTextureBindings(const gl::Context *context);
@@ -272,9 +263,8 @@ class StateManagerGL final : angle::NonCopyable
GLuint mRenderbuffer;
bool mScissorTestEnabled;
- std::vector<gl::Rectangle> mScissors;
- std::vector<gl::Rectangle> mViewports;
- std::vector<gl::Offset> mViewportOffsets;
+ gl::Rectangle mScissor;
+ gl::Rectangle mViewport;
float mNear;
float mFar;
@@ -346,7 +336,6 @@ class StateManagerGL final : angle::NonCopyable
GLint mPathStencilRef;
GLuint mPathStencilMask;
- bool mIsSideBySideDrawFramebuffer;
const bool mIsMultiviewEnabled;
GLenum mProvokingVertex;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.h
index 29e7ec37f37..d0e05ff1ae4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/SurfaceGL.h
@@ -27,7 +27,7 @@ class SurfaceGL : public SurfaceImpl
angle::Result initializeContents(const gl::Context *context,
const gl::ImageIndex &imageIndex) override;
- virtual egl::Error makeCurrent() = 0;
+ virtual egl::Error makeCurrent(const gl::Context *context) = 0;
virtual egl::Error unMakeCurrent();
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp
index c1c22de6e2a..da3890160b3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.cpp
@@ -1048,6 +1048,18 @@ angle::Result TextureGL::setStorageMultisample(const gl::Context *context,
return angle::Result::Continue;
}
+angle::Result TextureGL::setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset)
+{
+ ANGLE_GL_UNREACHABLE(GetImplAs<ContextGL>(context));
+ return angle::Result::Stop;
+}
+
angle::Result TextureGL::setImageExternal(const gl::Context *context,
gl::TextureType type,
egl::Stream *stream,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h
index 377c981a865..d5e7caaaeb3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/TextureGL.h
@@ -147,6 +147,14 @@ class TextureGL : public TextureImpl
const gl::Extents &size,
bool fixedSampleLocations) override;
+ angle::Result setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset) override;
+
angle::Result setImageExternal(const gl::Context *context,
gl::TextureType type,
egl::Stream *stream,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.h
index 0697fef2441..ed26a59498f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.h
@@ -38,7 +38,8 @@ class IOSurfaceSurfaceCGL : public SurfaceGL
~IOSurfaceSurfaceCGL() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
+ egl::Error unMakeCurrent() override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
@@ -60,10 +61,13 @@ class IOSurfaceSurfaceCGL : public SurfaceGL
EGLint getSwapBehavior() const override;
static bool validateAttributes(EGLClientBuffer buffer, const egl::AttributeMap &attribs);
+ FramebufferImpl *createDefaultFramebuffer(const gl::Context *context,
+ const gl::FramebufferState &state) override;
private:
CGLContextObj mCGLContext;
IOSurfaceRef mIOSurface;
+ const gl::Context *mCurrentContext;
int mWidth;
int mHeight;
int mPlane;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.mm b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.mm
index 46ad00bf37d..261c1db7568 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.mm
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/IOSurfaceSurfaceCGL.mm
@@ -71,6 +71,7 @@ IOSurfaceSurfaceCGL::IOSurfaceSurfaceCGL(const egl::SurfaceState &state,
: SurfaceGL(state),
mCGLContext(cglContext),
mIOSurface(nullptr),
+ mCurrentContext(nullptr),
mWidth(0),
mHeight(0),
mPlane(0),
@@ -105,15 +106,23 @@ egl::Error IOSurfaceSurfaceCGL::initialize(const egl::Display *display)
return egl::NoError();
}
-egl::Error IOSurfaceSurfaceCGL::makeCurrent()
+egl::Error IOSurfaceSurfaceCGL::makeCurrent(const gl::Context *context)
{
- // Make current is not supported on IOSurface pbuffers.
- return egl::EglBadSurface();
+ ASSERT(!mCurrentContext);
+ mCurrentContext = context;
+ return egl::NoError();
+}
+
+egl::Error IOSurfaceSurfaceCGL::unMakeCurrent()
+{
+ ASSERT(mCurrentContext);
+ GetFunctionsGL(mCurrentContext)->flush();
+ mCurrentContext = nullptr;
+ return egl::NoError();
}
egl::Error IOSurfaceSurfaceCGL::swap(const gl::Context *context)
{
- UNREACHABLE();
return egl::NoError();
}
@@ -235,4 +244,50 @@ bool IOSurfaceSurfaceCGL::validateAttributes(EGLClientBuffer buffer,
return true;
}
+// Wraps a FramebufferGL to hook the destroy function to delete the texture associated with the
+// framebuffer.
+class IOSurfaceFramebuffer : public FramebufferGL
+{
+ public:
+ IOSurfaceFramebuffer(const gl::FramebufferState &data,
+ GLuint id,
+ GLuint textureId,
+ bool isDefault)
+ : FramebufferGL(data, id, isDefault), mTextureId(textureId)
+ {}
+ void destroy(const gl::Context *context) override
+ {
+ GetFunctionsGL(context)->deleteTextures(1, &mTextureId);
+ FramebufferGL::destroy(context);
+ }
+
+ private:
+ GLuint mTextureId;
+};
+
+FramebufferImpl *IOSurfaceSurfaceCGL::createDefaultFramebuffer(const gl::Context *context,
+ const gl::FramebufferState &state)
+{
+ const FunctionsGL *functions = GetFunctionsGL(context);
+ StateManagerGL *stateManager = GetStateManagerGL(context);
+
+ GLuint texture = 0;
+ functions->genTextures(1, &texture);
+ const auto &format = kIOSurfaceFormats[mFormatIndex];
+ stateManager->bindTexture(gl::TextureType::Rectangle, texture);
+ CGLError error = CGLTexImageIOSurface2D(mCGLContext, GL_TEXTURE_RECTANGLE, format.nativeFormat,
+ mWidth, mHeight, format.nativeInternalFormat,
+ format.nativeType, mIOSurface, mPlane);
+ ASSERT(error == kCGLNoError);
+
+ GLuint framebuffer = 0;
+ functions->genFramebuffers(1, &framebuffer);
+ stateManager->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+ stateManager->bindTexture(gl::TextureType::Rectangle, texture);
+ functions->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE,
+ texture, 0);
+
+ return new IOSurfaceFramebuffer(state, framebuffer, texture, true);
+}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
index b0c9fe0ae6f..24e47d2e072 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
@@ -30,7 +30,7 @@ class PbufferSurfaceCGL : public SurfaceGL
~PbufferSurfaceCGL() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
index 14e0790f74f..00e793a462f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
@@ -59,7 +59,7 @@ egl::Error PbufferSurfaceCGL::initialize(const egl::Display *display)
return egl::NoError();
}
-egl::Error PbufferSurfaceCGL::makeCurrent()
+egl::Error PbufferSurfaceCGL::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
index 2abf2b6b494..abaa1149061 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
@@ -62,7 +62,7 @@ class WindowSurfaceCGL : public SurfaceGL
~WindowSurfaceCGL() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
index 2ad4476f8ae..ac5e3998096 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
@@ -217,7 +217,7 @@ egl::Error WindowSurfaceCGL::initialize(const egl::Display *display)
return egl::Error(EGL_SUCCESS);
}
-egl::Error WindowSurfaceCGL::makeCurrent()
+egl::Error WindowSurfaceCGL::makeCurrent(const gl::Context *context)
{
return egl::Error(EGL_SUCCESS);
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
index 575f654d995..954b6836339 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
@@ -30,7 +30,7 @@ SurfaceEGL::~SurfaceEGL()
}
}
-egl::Error SurfaceEGL::makeCurrent()
+egl::Error SurfaceEGL::makeCurrent(const gl::Context *context)
{
// Handling of makeCurrent is done in DisplayEGL
return egl::NoError();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
index bfbecd85a2b..94a252138aa 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
@@ -23,7 +23,7 @@ class SurfaceEGL : public SurfaceGL
SurfaceEGL(const egl::SurfaceState &state, const FunctionsEGL *egl, EGLConfig config);
~SurfaceEGL() override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error swapWithDamage(const gl::Context *context, EGLint *rects, EGLint n_rects) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.cpp
index 7a874bb5d4e..ed8dbbfaeac 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.cpp
@@ -31,7 +31,9 @@ void SyncEGL::onDestroy(const egl::Display *display)
mSync = EGL_NO_SYNC_KHR;
}
-egl::Error SyncEGL::initialize(const egl::Display *display, EGLenum type)
+egl::Error SyncEGL::initialize(const egl::Display *display,
+ const gl::Context *context,
+ EGLenum type)
{
ASSERT(type == EGL_SYNC_FENCE_KHR);
mSync = mEGL->createSyncKHR(type, nullptr);
@@ -43,6 +45,7 @@ egl::Error SyncEGL::initialize(const egl::Display *display, EGLenum type)
}
egl::Error SyncEGL::clientWait(const egl::Display *display,
+ const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult)
@@ -59,7 +62,9 @@ egl::Error SyncEGL::clientWait(const egl::Display *display,
return egl::NoError();
}
-egl::Error SyncEGL::serverWait(const egl::Display *display, EGLint flags)
+egl::Error SyncEGL::serverWait(const egl::Display *display,
+ const gl::Context *context,
+ EGLint flags)
{
ASSERT(mSync != EGL_NO_SYNC_KHR);
EGLint result = mEGL->waitSyncKHR(mSync, flags);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.h
index 2401834163c..824c5b572b2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/SyncEGL.h
@@ -29,12 +29,17 @@ class SyncEGL final : public EGLSyncImpl
void onDestroy(const egl::Display *display) override;
- egl::Error initialize(const egl::Display *display, EGLenum type) override;
+ egl::Error initialize(const egl::Display *display,
+ const gl::Context *context,
+ EGLenum type) override;
egl::Error clientWait(const egl::Display *display,
+ const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult) override;
- egl::Error serverWait(const egl::Display *display, EGLint flags) override;
+ egl::Error serverWait(const egl::Display *display,
+ const gl::Context *context,
+ EGLint flags) override;
egl::Error getStatus(const egl::Display *display, EGLint *outStatus) override;
private:
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
index 4b1dd866413..2cd10a289fc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
@@ -34,7 +34,7 @@ FramebufferImpl *SurfaceOzone::createDefaultFramebuffer(const gl::Context *conte
return mBuffer->framebufferGL(context, state);
}
-egl::Error SurfaceOzone::makeCurrent()
+egl::Error SurfaceOzone::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
index b2b28f89ecb..d23f09a37f1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
@@ -25,7 +25,7 @@ class SurfaceOzone : public SurfaceGL
const gl::FramebufferState &state) override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_enums.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_enums.h
index b1ddbd8b724..6bab4bb3ad4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_enums.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_enums.h
@@ -1371,5 +1371,6 @@
#define GL_TEXTURE_TARGET 0x1006
#define GL_UNKNOWN_CONTEXT_RESET 0x8255
#define GL_ZERO_TO_ONE 0x935F
+#define GL_COMPLETION_STATUS 0x91B1
#endif // LIBANGLE_RENDERER_GL_FUNCTIONSGLENUMS_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_typedefs.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_typedefs.h
index b4787307674..b609468fdc6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_typedefs.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/functionsgl_typedefs.h
@@ -1851,12 +1851,26 @@ typedef void(INTERNAL_GL_APIENTRY *PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)(GLenum
GLsizei bufSize,
GLint *params);
+// GL_OVR_multiview2
+typedef void(INTERNAL_GL_APIENTRY *PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews);
// EXT_debug_marker
typedef void(INTERNAL_GL_APIENTRY *PFNGLINSERTEVENTMARKEREXTPROC)(GLsizei length,
const GLchar *marker);
typedef void(INTERNAL_GL_APIENTRY *PFNGLPUSHGROUPMARKEREXTPROC)(GLsizei length,
const GLchar *marker);
typedef void(INTERNAL_GL_APIENTRY *PFNGLPOPGROUPMARKEREXTPROC)(void);
+
+// KHR_parallel_shader_compile
+typedef void(INTERNAL_GL_APIENTRY *PFNGLMAXSHADERCOMPILERTHREADSKHRPROC)(GLuint count);
+
+// ARB_parallel_shader_compile
+typedef void(INTERNAL_GL_APIENTRY *PFNGLMAXSHADERCOMPILERTHREADSARBPROC)(GLuint count);
+
} // namespace rx
#endif // LIBANGLE_RENDERER_GL_FUNCTIONSGLTYPEDEFS_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py b/chromium/third_party/angle/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py
index 3ebf324d6dc..0d61882da46 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/generate_gl_dispatch_table.py
@@ -5,6 +5,7 @@
#
# generate_gl_dispatch_table.py:
# Generation script for OpenGL bindings with ANGLE.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
import sys
import os
@@ -23,130 +24,6 @@ def safe_append(the_dict, key, element):
the_dict[key] = []
the_dict[key].append(element)
-gl_xml_path = os.path.join('..', '..', '..', '..', 'scripts', 'gl.xml')
-dispatch_header_path = 'DispatchTableGL_autogen.h'
-dispatch_source_path = 'DispatchTableGL_autogen.cpp'
-null_functions_header_path = 'null_functions.h'
-null_functions_source_path = 'null_functions.cpp'
-
-# Load the JSON and XML data.
-data_source_name = 'gl_bindings_data.json'
-json_data = angle_format.load_json(data_source_name)
-xml_root = etree.parse(gl_xml_path).getroot()
-
-api_feature_info = {}
-
-core_removed_eps = []
-for core_removed_ep in xml_root.findall('feature/remove'):
- assert(core_removed_ep.attrib['profile'] == 'core')
- for command in core_removed_ep.findall('./command'):
- core_removed_eps.append(command.attrib['name'])
-
-for feature in xml_root.findall('feature'):
- api = feature.attrib['api']
- name = feature.attrib['name']
- number = feature.attrib['number']
-
- # OpenGL ES 3.x versions are listed as api 'gles2'
- if api != 'gl' and api != 'gles2':
- continue
-
- for command in feature.findall('./require/command'):
- command_name = command.attrib['name']
- safe_append(api_feature_info, command_name, (api, name, number))
-
-gl_extension_commands = {}
-gles2_extension_commands = {}
-both_extension_commands = {}
-
-for extension in xml_root.findall('extensions/extension'):
- extension_name = extension.attrib['name']
- support = extension.attrib['supported'].split('|')
- for command in extension.findall('./require/command'):
- command_name = command.attrib['name']
- if 'gl' in support and 'gles2' in support:
- # Special case for KHR extensions, since in GLES they are suffixed.
- if '_KHR_' in extension_name:
- safe_append(gl_extension_commands, command_name, extension_name)
- safe_append(gles2_extension_commands, command_name, extension_name)
- else:
- safe_append(both_extension_commands, command_name, extension_name)
- elif 'gl' in support:
- safe_append(gl_extension_commands, command_name, extension_name)
- elif 'gles2' in support:
- safe_append(gles2_extension_commands, command_name, extension_name)
-
-gl_requirements = {}
-gles2_requirements = {}
-gl_extension_requirements = {}
-gles2_extension_requirements = {}
-both_extension_requirements = {}
-
-# Used later in the NULL bindings.
-all_entry_points = []
-
-for comment, entry_points in json_data.iteritems():
- for entry_point_no_prefix in entry_points:
- entry_point = "gl" + entry_point_no_prefix
-
- all_entry_points.append(entry_point)
-
- gl_required = None
- gles2_required = None
-
- if entry_point in api_feature_info:
- for api, name, number in api_feature_info[entry_point]:
- major, minor = number.split(".")
- reqs = (major, minor)
- if api == 'gl':
- if not gl_required:
- gl_required = reqs
- elif entry_point in core_removed_eps:
- print('Upgrade ' + entry_point + ' to ' + str(reqs) + ' instead of ' + str(gl_required))
- gl_required = reqs
- else:
- print('Keep ' + entry_point + ' at ' + str(gl_required) + ' instead of ' + str(reqs))
- elif api == 'gles2':
- if not gles2_required:
- gles2_required = reqs
- else:
- print("Duplicate for " + entry_point + ": " + str(reqs) + " and " + str(gles2_required))
- else:
- raise Exception('Bad api type: ' + api)
-
- if gl_required:
- safe_append(gl_requirements, gl_required, entry_point)
-
- if gles2_required:
- safe_append(gles2_requirements, gles2_required, entry_point)
-
- # Special case for finding extensions that overlap with core functions.
-
- extension = False
-
- for ep in [entry_point, entry_point + "EXT", entry_point + "ARB", entry_point + "OES"]:
- if ep in both_extension_commands:
- extension = True
- for extension in both_extension_commands[ep]:
- safe_append(both_extension_requirements, extension, (entry_point, ep))
-
- else:
- if ep in gl_extension_commands:
- extension = True
- for extension in gl_extension_commands[ep]:
- safe_append(gl_extension_requirements, extension, (entry_point, ep))
-
- if ep in gles2_extension_commands:
- extension = True
- for extension in gles2_extension_commands[ep]:
- full_ep = ep
- if '_KHR_' in extension:
- full_ep += 'KHR'
- safe_append(gles2_extension_requirements, extension, (entry_point, full_ep))
-
- if not (gl_required or gles2_required or extension):
- raise Exception('Entry point ' + entry_point + ' not found in the xml.')
-
# Template for the header declaration of the dispatch table.
dispatch_table_header_template = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name} and gl.xml.
@@ -176,7 +53,9 @@ namespace rx
class DispatchTableGL : angle::NonCopyable
{{
public:
+ // clang-format off
{table_data}
+ // clang-format on
DispatchTableGL();
virtual ~DispatchTableGL() = default;
@@ -206,23 +85,6 @@ def first_lower(str):
def format_ep_decl(entry_point):
return " PFNGL" + entry_point.upper() + "PROC " + first_lower(entry_point) + " = nullptr;"
-table_data = []
-for comment, entry_points in sorted(json_data.iteritems()):
- formatted = [" // " + comment]
- formatted += [format_ep_decl(entry_point) for entry_point in sorted(entry_points)]
-
- table_data.append("\n".join(formatted))
-
-dispatch_table_header = dispatch_table_header_template.format(
- script_name = os.path.basename(sys.argv[0]),
- data_source_name = data_source_name,
- year = date.today().year,
- file_name = dispatch_header_path,
- table_data = "\n\n".join(table_data))
-
-with open(dispatch_header_path, "w") as out:
- out.write(dispatch_table_header)
-
# Template for the initialization file of the dispatch table.
dispatch_table_source_template = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name} and gl.xml.
@@ -309,26 +171,6 @@ def format_extension_requirements_lines(extension, entry_points, api):
lines += [' }']
return '\n'.join(lines)
-gl_data = []
-for gl_required, entry_points in sorted(gl_requirements.iteritems()):
- gl_data.append(format_requirements_lines(gl_required, entry_points))
-
-gl_extensions_data = []
-for extension, entry_points in sorted(gl_extension_requirements.iteritems()):
- gl_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gl"))
-
-gles2_data = []
-for gles2_required, entry_points in sorted(gles2_requirements.iteritems()):
- gles2_data.append(format_requirements_lines(gles2_required, entry_points))
-
-gles2_extensions_data = []
-for extension, entry_points in sorted(gles2_extension_requirements.iteritems()):
- gles2_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gles2"))
-
-both_extensions_data = []
-for extension, entry_points in sorted(both_extension_requirements.iteritems()):
- both_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gles2|gl"))
-
def assign_null_line(line):
m = re.match(r' ASSIGN\("gl.*", (.+)\);', line)
if m:
@@ -343,56 +185,9 @@ def assign_null(entry):
def nullify(data):
return [assign_null(entry) for entry in data]
-dispatch_table_source = dispatch_table_source_template.format(
- script_name = os.path.basename(sys.argv[0]),
- data_source_name = data_source_name,
- year = date.today().year,
- file_name = dispatch_source_path,
- gl_data = "\n\n".join(gl_data),
- gl_extensions_data = "\n\n".join(gl_extensions_data),
- gles2_data = "\n\n".join(gles2_data),
- gles2_extensions_data = "\n\n".join(gles2_extensions_data),
- both_extensions_data = "\n\n".join(both_extensions_data),
- gl_null_data = "\n\n".join(nullify(gl_data)),
- gl_null_extensions_data = "\n\n".join(nullify(gl_extensions_data)),
- gles2_null_data = "\n\n".join(nullify(gles2_data)),
- gles2_null_extensions_data = "\n\n".join(nullify(gles2_extensions_data)),
- both_null_extensions_data = "\n\n".join(nullify(both_extensions_data)))
-
-with open(dispatch_source_path, "w") as out:
- out.write(dispatch_table_source)
-
-# Generate the NULL/stub entry points.
-# Process the whole set of commands
-
def format_param(param):
return "".join(param.itertext())
-command_defs = {}
-command_decls = {}
-
-for command in xml_root.findall('commands/command'):
- proto = command.find('proto')
- command_name = proto.find('name').text
- entry = ''.join(proto.itertext())
- return_type = entry[:-len(command_name)]
- entry = return_type + ' INTERNAL_GL_APIENTRY ' + entry[len(return_type):] + 'NULL('
-
- param_text = [format_param(param) for param in command.findall('param')]
- entry += ', '.join(param_text) + ')'
-
- command_decls[command_name] = entry + ';'
-
- entry += '\n{\n'
- if return_type != 'void ':
- entry += ' return static_cast<' + return_type + '>(0);\n'
- entry += '}'
-
- command_defs[command_name] = entry
-
-null_decls = [command_decls[entry_point] for entry_point in sorted(all_entry_points)]
-null_stubs = [command_defs[entry_point] for entry_point in sorted(all_entry_points)]
-
null_functions_header_template = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name} and gl.xml.
//
@@ -416,16 +211,6 @@ namespace rx
#endif // LIBGLESV2_RENDERER_GL_NULL_GL_FUNCTIONS_AUTOGEN_H_
"""
-null_functions_header = null_functions_header_template.format(
- script_name = os.path.basename(sys.argv[0]),
- data_source_name = data_source_name,
- year = date.today().year,
- file_name = null_functions_header_path,
- table_data = "\n".join(null_decls))
-
-with open(null_functions_header_path, "w") as out:
- out.write(null_functions_header)
-
null_functions_source_template = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name} and gl.xml.
//
@@ -444,12 +229,260 @@ namespace rx
}} // namespace rx
"""
-null_functions_source = null_functions_source_template.format(
- script_name = os.path.basename(sys.argv[0]),
- data_source_name = data_source_name,
- year = date.today().year,
- file_name = null_functions_source_path,
- table_data = "\n\n".join(null_stubs))
+def main():
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [
+ '../../../../scripts/gl.xml',
+ '../angle_format.py',
+ 'gl_bindings_data.json',
+ ]
+ outputs = [
+ 'DispatchTableGL_autogen.cpp',
+ 'DispatchTableGL_autogen.h',
+ 'null_functions.cpp',
+ 'null_functions.h',
+ ]
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ gl_xml_path = os.path.join('..', '..', '..', '..', 'scripts', 'gl.xml')
+ dispatch_header_path = 'DispatchTableGL_autogen.h'
+ dispatch_source_path = 'DispatchTableGL_autogen.cpp'
+ null_functions_header_path = 'null_functions.h'
+ null_functions_source_path = 'null_functions.cpp'
+
+ # Load the JSON and XML data.
+ data_source_name = 'gl_bindings_data.json'
+ json_data = angle_format.load_json(data_source_name)
+ xml_root = etree.parse(gl_xml_path).getroot()
+
+ api_feature_info = {}
+
+ core_removed_eps = []
+ for core_removed_ep in xml_root.findall('feature/remove'):
+ assert(core_removed_ep.attrib['profile'] == 'core')
+ for command in core_removed_ep.findall('./command'):
+ core_removed_eps.append(command.attrib['name'])
+
+ for feature in xml_root.findall('feature'):
+ api = feature.attrib['api']
+ name = feature.attrib['name']
+ number = feature.attrib['number']
+
+ # OpenGL ES 3.x versions are listed as api 'gles2'
+ if api != 'gl' and api != 'gles2':
+ continue
+
+ for command in feature.findall('./require/command'):
+ command_name = command.attrib['name']
+ safe_append(api_feature_info, command_name, (api, name, number))
+
+ gl_extension_commands = {}
+ gles2_extension_commands = {}
+ both_extension_commands = {}
+
+ for extension in xml_root.findall('extensions/extension'):
+ extension_name = extension.attrib['name']
+ support = extension.attrib['supported'].split('|')
+ for command in extension.findall('./require/command'):
+ command_name = command.attrib['name']
+ if 'gl' in support and 'gles2' in support:
+ # Special case for KHR extensions, since in GLES they are suffixed.
+ if '_KHR_' in extension_name and not command_name.endswith('KHR'):
+ safe_append(gl_extension_commands, command_name, extension_name)
+ safe_append(gles2_extension_commands, command_name, extension_name)
+ else:
+ safe_append(both_extension_commands, command_name, extension_name)
+ elif 'gl' in support:
+ safe_append(gl_extension_commands, command_name, extension_name)
+ elif 'gles2' in support:
+ safe_append(gles2_extension_commands, command_name, extension_name)
+
+ gl_requirements = {}
+ gles2_requirements = {}
+ gl_extension_requirements = {}
+ gles2_extension_requirements = {}
+ both_extension_requirements = {}
+
+ # Used later in the NULL bindings.
+ all_entry_points = []
+
+ for comment, entry_points in json_data.iteritems():
+ for entry_point_no_prefix in entry_points:
+ entry_point = "gl" + entry_point_no_prefix
+
+ all_entry_points.append(entry_point)
+
+ gl_required = None
+ gles2_required = None
+
+ if entry_point in api_feature_info:
+ for api, name, number in api_feature_info[entry_point]:
+ major, minor = number.split(".")
+ reqs = (major, minor)
+ if api == 'gl':
+ if not gl_required:
+ gl_required = reqs
+ elif entry_point in core_removed_eps:
+ print('Upgrade ' + entry_point + ' to ' + str(reqs) + ' instead of ' + str(gl_required))
+ gl_required = reqs
+ else:
+ print('Keep ' + entry_point + ' at ' + str(gl_required) + ' instead of ' + str(reqs))
+ elif api == 'gles2':
+ if not gles2_required:
+ gles2_required = reqs
+ else:
+ print("Duplicate for " + entry_point + ": " + str(reqs) + " and " + str(gles2_required))
+ else:
+ raise Exception('Bad api type: ' + api)
+
+ if gl_required:
+ safe_append(gl_requirements, gl_required, entry_point)
+
+ if gles2_required:
+ safe_append(gles2_requirements, gles2_required, entry_point)
-with open(null_functions_source_path, "w") as out:
- out.write(null_functions_source)
+ # Special case for finding extensions that overlap with core functions.
+
+ extension = False
+
+ for ep in [entry_point, entry_point + "EXT", entry_point + "ARB", entry_point + "OES"]:
+ if ep in both_extension_commands:
+ extension = True
+ for extension in both_extension_commands[ep]:
+ safe_append(both_extension_requirements, extension, (entry_point, ep))
+
+ else:
+ if ep in gl_extension_commands:
+ extension = True
+ for extension in gl_extension_commands[ep]:
+ safe_append(gl_extension_requirements, extension, (entry_point, ep))
+
+ if ep in gles2_extension_commands:
+ extension = True
+ for extension in gles2_extension_commands[ep]:
+ full_ep = ep
+ if '_KHR_' in extension:
+ full_ep += 'KHR'
+ safe_append(gles2_extension_requirements, extension, (entry_point, full_ep))
+
+ if not (gl_required or gles2_required or extension):
+ raise Exception('Entry point ' + entry_point + ' not found in the xml.')
+
+ table_data = []
+ for comment, entry_points in sorted(json_data.iteritems()):
+ formatted = [" // " + comment]
+ formatted += [format_ep_decl(entry_point) for entry_point in sorted(entry_points)]
+
+ table_data.append("\n".join(formatted))
+
+ dispatch_table_header = dispatch_table_header_template.format(
+ script_name = os.path.basename(sys.argv[0]),
+ data_source_name = data_source_name,
+ year = date.today().year,
+ file_name = dispatch_header_path,
+ table_data = "\n\n".join(table_data))
+
+ with open(dispatch_header_path, "w") as out:
+ out.write(dispatch_table_header)
+
+ gl_data = []
+ for gl_required, entry_points in sorted(gl_requirements.iteritems()):
+ gl_data.append(format_requirements_lines(gl_required, entry_points))
+
+ gl_extensions_data = []
+ for extension, entry_points in sorted(gl_extension_requirements.iteritems()):
+ gl_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gl"))
+
+ gles2_data = []
+ for gles2_required, entry_points in sorted(gles2_requirements.iteritems()):
+ gles2_data.append(format_requirements_lines(gles2_required, entry_points))
+
+ gles2_extensions_data = []
+ for extension, entry_points in sorted(gles2_extension_requirements.iteritems()):
+ gles2_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gles2"))
+
+ both_extensions_data = []
+ for extension, entry_points in sorted(both_extension_requirements.iteritems()):
+ both_extensions_data.append(format_extension_requirements_lines(extension, entry_points, "gles2|gl"))
+
+ dispatch_table_source = dispatch_table_source_template.format(
+ script_name = os.path.basename(sys.argv[0]),
+ data_source_name = data_source_name,
+ year = date.today().year,
+ file_name = dispatch_source_path,
+ gl_data = "\n\n".join(gl_data),
+ gl_extensions_data = "\n\n".join(gl_extensions_data),
+ gles2_data = "\n\n".join(gles2_data),
+ gles2_extensions_data = "\n\n".join(gles2_extensions_data),
+ both_extensions_data = "\n\n".join(both_extensions_data),
+ gl_null_data = "\n\n".join(nullify(gl_data)),
+ gl_null_extensions_data = "\n\n".join(nullify(gl_extensions_data)),
+ gles2_null_data = "\n\n".join(nullify(gles2_data)),
+ gles2_null_extensions_data = "\n\n".join(nullify(gles2_extensions_data)),
+ both_null_extensions_data = "\n\n".join(nullify(both_extensions_data)))
+
+ with open(dispatch_source_path, "w") as out:
+ out.write(dispatch_table_source)
+
+ # Generate the NULL/stub entry points.
+ # Process the whole set of commands
+
+ command_defs = {}
+ command_decls = {}
+
+ for command in xml_root.findall('commands/command'):
+ proto = command.find('proto')
+ command_name = proto.find('name').text
+ entry = ''.join(proto.itertext())
+ return_type = entry[:-len(command_name)]
+ entry = return_type + ' INTERNAL_GL_APIENTRY ' + entry[len(return_type):] + 'NULL('
+
+ param_text = [format_param(param) for param in command.findall('param')]
+ entry += ', '.join(param_text) + ')'
+
+ command_decls[command_name] = entry + ';'
+
+ entry += '\n{\n'
+ if return_type != 'void ':
+ entry += ' return static_cast<' + return_type + '>(0);\n'
+ entry += '}'
+
+ command_defs[command_name] = entry
+
+ null_decls = [command_decls[entry_point] for entry_point in sorted(all_entry_points)]
+ null_stubs = [command_defs[entry_point] for entry_point in sorted(all_entry_points)]
+
+ null_functions_header = null_functions_header_template.format(
+ script_name = os.path.basename(sys.argv[0]),
+ data_source_name = data_source_name,
+ year = date.today().year,
+ file_name = null_functions_header_path,
+ table_data = "\n".join(null_decls))
+
+ with open(null_functions_header_path, "w") as out:
+ out.write(null_functions_header)
+
+ null_functions_source = null_functions_source_template.format(
+ script_name = os.path.basename(sys.argv[0]),
+ data_source_name = data_source_name,
+ year = date.today().year,
+ file_name = null_functions_source_path,
+ table_data = "\n\n".join(null_stubs))
+
+ with open(null_functions_source_path, "w") as out:
+ out.write(null_functions_source)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/gl_bindings_data.json b/chromium/third_party/angle/src/libANGLE/renderer/gl/gl_bindings_data.json
index 10aab37ad96..a2a81d40b79 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/gl_bindings_data.json
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/gl_bindings_data.json
@@ -790,5 +790,20 @@
"InsertEventMarkerEXT",
"PushGroupMarkerEXT",
"PopGroupMarkerEXT"
- ]
+ ],
+
+ "GL_ARB_parallel_shader_compile":
+ [
+ "MaxShaderCompilerThreadsARB"
+ ],
+
+ "GL_KHR_parallel_shader_compile":
+ [
+ "MaxShaderCompilerThreadsKHR"
+ ],
+
+ "GL_OVR_multiview2":
+ [
+ "FramebufferTextureMultiviewOVR"
+ ]
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
index 65cd649fccc..23b4a5c5771 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
@@ -24,6 +24,17 @@
#include "libANGLE/renderer/gl/glx/WindowSurfaceGLX.h"
#include "libANGLE/renderer/gl/renderergl_utils.h"
+namespace
+{
+
+bool HasParallelShaderCompileExtension(const rx::FunctionsGL *functions)
+{
+ return functions->maxShaderCompilerThreadsKHR != nullptr ||
+ functions->maxShaderCompilerThreadsARB != nullptr;
+}
+
+} // anonymous namespace
+
namespace rx
{
@@ -289,14 +300,23 @@ egl::Error DisplayGLX::initialize(egl::Display *display)
if (mSharedContext)
{
- for (unsigned int i = 0; i < RendererGL::getMaxWorkerContexts(); ++i)
+ if (HasParallelShaderCompileExtension(functionsGL.get()))
+ {
+ mGLX.destroyContext(mSharedContext);
+ mSharedContext = nullptr;
+ }
+ else
{
- glx::Pbuffer workerPbuffer = mGLX.createPbuffer(mContextConfig, dummyPbufferAttribs);
- if (!workerPbuffer)
+ for (unsigned int i = 0; i < RendererGL::getMaxWorkerContexts(); ++i)
{
- return egl::EglNotInitialized() << "Could not create the worker pbuffers.";
+ glx::Pbuffer workerPbuffer =
+ mGLX.createPbuffer(mContextConfig, dummyPbufferAttribs);
+ if (!workerPbuffer)
+ {
+ return egl::EglNotInitialized() << "Could not create the worker pbuffers.";
+ }
+ mWorkerPbufferPool.push_back(workerPbuffer);
}
- mWorkerPbufferPool.push_back(workerPbuffer);
}
}
@@ -677,7 +697,7 @@ bool DisplayGLX::testDeviceLost()
{
if (mHasARBCreateContextRobustness)
{
- return mRenderer->getResetStatus() != GL_NO_ERROR;
+ return mRenderer->getResetStatus() != gl::GraphicsResetStatus::NoError;
}
return false;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
index c49597e575a..ace7104b285 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
@@ -64,7 +64,7 @@ egl::Error PbufferSurfaceGLX::initialize(const egl::Display *display)
return egl::NoError();
}
-egl::Error PbufferSurfaceGLX::makeCurrent()
+egl::Error PbufferSurfaceGLX::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
index ff08a941c27..bf4bd1ad0e6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
@@ -29,7 +29,7 @@ class PbufferSurfaceGLX : public SurfaceGLX
~PbufferSurfaceGLX() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
index b0466771620..7ac2054b2bd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
@@ -127,7 +127,7 @@ egl::Error WindowSurfaceGLX::initialize(const egl::Display *display)
return egl::NoError();
}
-egl::Error WindowSurfaceGLX::makeCurrent()
+egl::Error WindowSurfaceGLX::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
index 464b9b83b05..7935a27b8e7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
@@ -31,7 +31,7 @@ class WindowSurfaceGLX : public SurfaceGLX
~WindowSurfaceGLX() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.cpp
index 2d76b639e19..f629fe823e0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.cpp
@@ -841,6 +841,14 @@ void INTERNAL_GL_APIENTRY glFramebufferTextureLayerNULL(GLenum target,
GLint layer)
{}
+void INTERNAL_GL_APIENTRY glFramebufferTextureMultiviewOVRNULL(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews)
+{}
+
void INTERNAL_GL_APIENTRY glFrontFaceNULL(GLenum mode) {}
void INTERNAL_GL_APIENTRY glGenBuffersNULL(GLsizei n, GLuint *buffers) {}
@@ -1672,6 +1680,10 @@ void *INTERNAL_GL_APIENTRY glMapNamedBufferRangeNULL(GLuint buffer,
void INTERNAL_GL_APIENTRY glMatrixLoadfEXTNULL(GLenum mode, const GLfloat *m) {}
+void INTERNAL_GL_APIENTRY glMaxShaderCompilerThreadsARBNULL(GLuint count) {}
+
+void INTERNAL_GL_APIENTRY glMaxShaderCompilerThreadsKHRNULL(GLuint count) {}
+
void INTERNAL_GL_APIENTRY glMemoryBarrierNULL(GLbitfield barriers) {}
void INTERNAL_GL_APIENTRY glMemoryBarrierByRegionNULL(GLbitfield barriers) {}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.h
index e7a545edd27..cc4e0b3b914 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/null_functions.h
@@ -569,6 +569,12 @@ void INTERNAL_GL_APIENTRY glFramebufferTextureLayerNULL(GLenum target,
GLuint texture,
GLint level,
GLint layer);
+void INTERNAL_GL_APIENTRY glFramebufferTextureMultiviewOVRNULL(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews);
void INTERNAL_GL_APIENTRY glFrontFaceNULL(GLenum mode);
void INTERNAL_GL_APIENTRY glGenBuffersNULL(GLsizei n, GLuint *buffers);
void INTERNAL_GL_APIENTRY glGenFencesNVNULL(GLsizei n, GLuint *fences);
@@ -1036,6 +1042,8 @@ void *INTERNAL_GL_APIENTRY glMapNamedBufferRangeNULL(GLuint buffer,
GLsizeiptr length,
GLbitfield access);
void INTERNAL_GL_APIENTRY glMatrixLoadfEXTNULL(GLenum mode, const GLfloat *m);
+void INTERNAL_GL_APIENTRY glMaxShaderCompilerThreadsARBNULL(GLuint count);
+void INTERNAL_GL_APIENTRY glMaxShaderCompilerThreadsKHRNULL(GLuint count);
void INTERNAL_GL_APIENTRY glMemoryBarrierNULL(GLbitfield barriers);
void INTERNAL_GL_APIENTRY glMemoryBarrierByRegionNULL(GLbitfield barriers);
void INTERNAL_GL_APIENTRY glMinSampleShadingNULL(GLfloat value);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
index c0d3bfa0761..b2e19d6801d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/renderergl_utils.cpp
@@ -1104,7 +1104,7 @@ void GenerateCaps(const FunctionsGL *functions,
if (functions->hasGLExtension("GL_NV_viewport_array2"))
{
- extensions->multiview = true;
+ extensions->multiview2 = true;
// GL_MAX_ARRAY_TEXTURE_LAYERS is guaranteed to be at least 256.
const int maxLayers = QuerySingleGLInt(functions, GL_MAX_ARRAY_TEXTURE_LAYERS);
// GL_MAX_VIEWPORTS is guaranteed to be at least 16.
@@ -1130,7 +1130,7 @@ void GenerateCaps(const FunctionsGL *functions,
functions->isAtLeastGLES(gl::Version(3, 0)) ||
functions->hasGLESExtension("GL_EXT_instanced_arrays");
extensions->instancedArraysEXT = extensions->instancedArraysANGLE;
- extensions->unpackSubimage = functions->standard == STANDARD_GL_DESKTOP ||
+ extensions->unpackSubimage = functions->standard == STANDARD_GL_DESKTOP ||
functions->isAtLeastGLES(gl::Version(3, 0)) ||
functions->hasGLESExtension("GL_EXT_unpack_subimage");
extensions->packSubimage = functions->standard == STANDARD_GL_DESKTOP ||
@@ -1201,7 +1201,7 @@ void GenerateCaps(const FunctionsGL *functions,
functions->isAtLeastGL(gl::Version(4, 2)) || functions->isAtLeastGLES(gl::Version(3, 2));
extensions->multiviewMultisample =
- extensions->textureStorageMultisample2DArray && extensions->multiview;
+ extensions->textureStorageMultisample2DArray && extensions->multiview2;
extensions->textureMultisample = functions->isAtLeastGL(gl::Version(3, 2)) ||
functions->hasGLExtension("GL_ARB_texture_multisample");
@@ -1454,7 +1454,11 @@ void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workaround
workarounds->dontRelinkProgramsInParallel = IsAndroid() || (IsWindows() && IsIntel(vendor));
- workarounds->disableWorkerContexts = !IsApple();
+ // TODO(jie.a.chen@intel.com): Clean up the bugs.
+ // anglebug.com/3031
+ // crbug.com/922936
+ workarounds->disableWorkerContexts =
+ (IsWindows() && (IsIntel(vendor) || IsAMD(vendor))) || (IsLinux() && IsNvidia(vendor));
}
void ApplyWorkarounds(const FunctionsGL *functions, gl::Workarounds *workarounds)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
index 6076fcb6ea4..627bd8b6789 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
@@ -348,7 +348,7 @@ egl::Error D3DTextureSurfaceWGL::initialize(const egl::Display *display)
return egl::NoError();
}
-egl::Error D3DTextureSurfaceWGL::makeCurrent()
+egl::Error D3DTextureSurfaceWGL::makeCurrent(const gl::Context *context)
{
if (!mFunctionsWGL->dxLockObjectsNV(mDeviceHandle, 1, &mBoundObjectRenderbufferHandle))
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
index b72dc4f790b..88fe3561fb4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
@@ -41,7 +41,7 @@ class D3DTextureSurfaceWGL : public SurfaceWGL
ID3D11Device *d3d11Device);
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error unMakeCurrent() override;
egl::Error swap(const gl::Context *context) override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
index e7cfbbd181d..5b686321a6d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
@@ -112,7 +112,7 @@ egl::Error DXGISwapChainWindowSurfaceWGL::initialize(const egl::Display *display
return createSwapChain();
}
-egl::Error DXGISwapChainWindowSurfaceWGL::makeCurrent()
+egl::Error DXGISwapChainWindowSurfaceWGL::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
index c4c99dae8c2..ff7f152d0fb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
@@ -38,7 +38,7 @@ class DXGISwapChainWindowSurfaceWGL : public SurfaceWGL
~DXGISwapChainWindowSurfaceWGL() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index 2a413878a5f..12679ba7876 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -106,7 +106,6 @@ DisplayWGL::DisplayWGL(const egl::DisplayState &state)
mD3d11Module(nullptr),
mD3D11DeviceHandle(nullptr),
mD3D11Device(nullptr),
- mHasWorkerContexts(true),
mUseARBShare(true)
{}
@@ -293,13 +292,6 @@ egl::Error DisplayWGL::initializeImpl(egl::Display *display)
return egl::EglNotInitialized() << "Intel OpenGL ES drivers are not supported.";
}
- // Using worker contexts is not currently supported due to bugs in the driver.
- // http://anglebug.com/3031
- if (IsAMD(vendor))
- {
- mHasWorkerContexts = false;
- }
-
// Create DXGI swap chains for windows that come from other processes. Windows is unable to
// SetPixelFormat on windows from other processes when a sandbox is enabled.
HDC nativeDisplay = display->getNativeDisplayId();
@@ -567,7 +559,7 @@ bool DisplayWGL::testDeviceLost()
{
if (mHasRobustness)
{
- return mRenderer->getResetStatus() != GL_NO_ERROR;
+ return mRenderer->getResetStatus() != gl::GraphicsResetStatus::NoError;
}
return false;
@@ -641,13 +633,7 @@ egl::Error DisplayWGL::initializeD3DDevice()
return egl::EglNotInitialized() << "Could not create D3D11 device, " << gl::FmtHR(result);
}
- egl::Error error = registerD3DDevice(mD3D11Device, &mD3D11DeviceHandle);
- if (error.isError())
- {
- return error;
- }
-
- return egl::NoError();
+ return registerD3DDevice(mD3D11Device, &mD3D11DeviceHandle);
}
void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
@@ -709,6 +695,10 @@ egl::Error DisplayWGL::makeCurrent(egl::Surface *drawSurface,
SurfaceWGL *drawSurfaceWGL = GetImplAs<SurfaceWGL>(drawSurface);
newDC = drawSurfaceWGL->getDC();
}
+ else
+ {
+ newDC = mDeviceContext;
+ }
HGLRC newContext = currentContext.glrc;
if (context)
@@ -716,9 +706,15 @@ egl::Error DisplayWGL::makeCurrent(egl::Surface *drawSurface,
ContextWGL *contextWGL = GetImplAs<ContextWGL>(context);
newContext = contextWGL->getContext();
}
+ else
+ {
+ newContext = 0;
+ }
if (newDC != currentContext.dc || newContext != currentContext.glrc)
{
+ ASSERT(newDC != 0);
+
if (!mFunctionsWGL->makeCurrent(newDC, newContext))
{
// TODO(geofflang): What error type here?
@@ -991,11 +987,6 @@ WorkerContext *DisplayWGL::createWorkerContext(std::string *infoLog,
HGLRC sharedContext,
const std::vector<int> &workerContextAttribs)
{
- if (!mHasWorkerContexts)
- {
- *infoLog += "Has no WorkerContext support.";
- return nullptr;
- }
if (!sharedContext)
{
*infoLog += "Unable to create the shared context.";
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
index 2decba10254..81925c3d1fd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/DisplayWGL.h
@@ -145,7 +145,6 @@ class DisplayWGL : public DisplayGL
};
std::map<IUnknown *, D3DObjectHandle> mRegisteredD3DDevices;
- bool mHasWorkerContexts;
bool mUseARBShare;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
index e91cdf32d2f..2b9ecdf1881 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
@@ -122,7 +122,7 @@ egl::Error PbufferSurfaceWGL::initialize(const egl::Display *display)
return egl::NoError();
}
-egl::Error PbufferSurfaceWGL::makeCurrent()
+egl::Error PbufferSurfaceWGL::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
index 1eebd9ea7a5..06b0251c764 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
@@ -33,7 +33,7 @@ class PbufferSurfaceWGL : public SurfaceWGL
~PbufferSurfaceWGL() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
index 9d65170bb9a..4f3108bad1c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
@@ -92,7 +92,7 @@ egl::Error WindowSurfaceWGL::initialize(const egl::Display *display)
return egl::NoError();
}
-egl::Error WindowSurfaceWGL::makeCurrent()
+egl::Error WindowSurfaceWGL::makeCurrent(const gl::Context *context)
{
return egl::NoError();
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
index 2fd470c0433..26b003ce06e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
@@ -29,7 +29,7 @@ class WindowSurfaceWGL : public SurfaceWGL
~WindowSurfaceWGL() override;
egl::Error initialize(const egl::Display *display) override;
- egl::Error makeCurrent() override;
+ egl::Error makeCurrent(const gl::Context *context) override;
egl::Error swap(const gl::Context *context) override;
egl::Error postSubBuffer(const gl::Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/load_functions_data.json b/chromium/third_party/angle/src/libANGLE/renderer/load_functions_data.json
index a0b3b2175ab..94dba5dcb70 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/load_functions_data.json
+++ b/chromium/third_party/angle/src/libANGLE/renderer/load_functions_data.json
@@ -32,16 +32,25 @@
"GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC": {
"R8G8B8A8_UNORM_SRGB": {
"GL_UNSIGNED_BYTE": "LoadETC2SRGBA8ToSRGBA8"
+ },
+ "ETC2_R8G8B8A8_SRGB_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
}
},
"GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2": {
"R8G8B8A8_UNORM": {
"GL_UNSIGNED_BYTE": "LoadETC2RGB8A1ToRGBA8"
+ },
+ "ETC2_R8G8B8A1_UNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
}
},
"GL_RGB32UI": {
"R32G32B32A32_UINT": {
"GL_UNSIGNED_INT": "LoadToNative3To4<GLuint, 0x00000001>"
+ },
+ "R32G32B32_UINT": {
+ "GL_UNSIGNED_INT": "LoadToNative<GLuint, 3>"
}
},
"GL_ALPHA32F_EXT": {
@@ -65,6 +74,9 @@
"GL_COMPRESSED_R11_EAC": {
"R16_UNORM": {
"GL_UNSIGNED_BYTE": "LoadEACR11ToR16"
+ },
+ "EAC_R11_UNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
}
},
"GL_RGBA32UI": {
@@ -85,6 +97,9 @@
"GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2": {
"R8G8B8A8_UNORM_SRGB": {
"GL_UNSIGNED_BYTE": "LoadETC2SRGB8A1ToRGBA8"
+ },
+ "ETC2_R8G8B8A1_SRGB_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
}
},
"GL_R16F": {
@@ -99,12 +114,6 @@
"GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
}
},
- "GL_BGRA4_ANGLEX": {
- "NONE": {
- "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT": "LoadRGBA4ToRGBA8",
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
- }
- },
"GL_RGBA16F": {
"R16G16B16A16_FLOAT": {
"GL_HALF_FLOAT": "LoadToNative<GLhalf, 4>",
@@ -149,6 +158,9 @@
"GL_RGB16UI": {
"R16G16B16A16_UINT": {
"GL_UNSIGNED_SHORT": "LoadToNative3To4<GLushort, 0x0001>"
+ },
+ "R16G16B16_UINT": {
+ "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 3>"
}
},
"GL_BGRA_EXT": {
@@ -159,6 +171,9 @@
"GL_COMPRESSED_RGB8_ETC2": {
"R8G8B8A8_UNORM": {
"GL_UNSIGNED_BYTE": "LoadETC2RGB8ToRGBA8"
+ },
+ "ETC2_R8G8B8_UNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
}
},
"GL_RGBA32F": {
@@ -192,6 +207,9 @@
"GL_COMPRESSED_SIGNED_RG11_EAC": {
"R16G16_SNORM": {
"GL_UNSIGNED_BYTE": "LoadEACRG11SToRG16"
+ },
+ "EAC_R11G11_SNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
}
},
"GL_DEPTH_COMPONENT16": {
@@ -203,6 +221,9 @@
"GL_RGB32I": {
"R32G32B32A32_SINT": {
"GL_INT": "LoadToNative3To4<GLint, 0x00000001>"
+ },
+ "R32G32B32_SINT": {
+ "GL_INT": "LoadToNative<GLint, 3>"
}
},
"GL_R8": {
@@ -213,6 +234,9 @@
"GL_RGB32F": {
"R32G32B32A32_FLOAT": {
"GL_FLOAT": "LoadToNative3To4<GLfloat, gl::Float32One>"
+ },
+ "R32G32B32_FLOAT": {
+ "GL_FLOAT": "LoadToNative<GLfloat, 3>"
}
},
"GL_R11F_G11F_B10F": {
@@ -253,6 +277,9 @@
"GL_RGB8_SNORM": {
"R8G8B8A8_SNORM": {
"GL_BYTE": "LoadToNative3To4<GLbyte, 0x7F>"
+ },
+ "R8G8B8_SNORM": {
+ "GL_BYTE": "LoadToNative<GLbyte, 3>"
}
},
"GL_RG32F": {
@@ -294,21 +321,33 @@
"GL_COMPRESSED_RGBA8_ETC2_EAC": {
"R8G8B8A8_UNORM": {
"GL_UNSIGNED_BYTE": "LoadETC2RGBA8ToRGBA8"
+ },
+ "ETC2_R8G8B8A8_UNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
}
},
"GL_RGB8I": {
"R8G8B8A8_SINT": {
"GL_BYTE": "LoadToNative3To4<GLbyte, 0x01>"
+ },
+ "R8G8B8_SINT": {
+ "GL_BYTE": "LoadToNative<GLbyte, 3>"
}
},
"GL_COMPRESSED_SRGB8_ETC2": {
"R8G8B8A8_UNORM_SRGB": {
"GL_UNSIGNED_BYTE": "LoadETC2SRGB8ToRGBA8"
+ },
+ "ETC2_R8G8B8_SRGB_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
}
},
"GL_DEPTH32F_STENCIL8": {
"D32_FLOAT_S8X24_UINT": {
"GL_FLOAT_32_UNSIGNED_INT_24_8_REV": "LoadD32FS8X24ToD32FS8X24"
+ },
+ "D24_UNORM_S8_UINT": {
+ "GL_FLOAT_32_UNSIGNED_INT_24_8_REV": "LoadD32FS8X24ToD24S8"
}
},
"GL_RG8I": {
@@ -321,21 +360,151 @@
"GL_UNSIGNED_INT": "LoadToNative<GLuint, 1>"
}
},
- "GL_BGR5_A1_ANGLEX": {
- "NONE": {
- "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>",
- "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT": "LoadRGB5A1ToRGBA8"
+ "GL_BGRX8_ANGLEX" : {
+ "B8G8R8X8_UNORM": {
+ "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
+ },
+ "B8G8R8A8_UNORM": {
+ "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
}
},
"GL_BGR565_ANGLEX": {
"B5G6R5_UNORM": {
"GL_UNSIGNED_SHORT_5_6_5": "LoadRGB565ToBGR565",
- "GL_UNSIGNED_BYTE": "LoadToNative<GLushort, 1>"
+ "GL_UNSIGNED_BYTE": "LoadRGB8ToBGR565"
+ }
+ },
+ "GL_BGRA4_ANGLEX": {
+ "NONE": {
+ "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT": "LoadRGBA4ToRGBA8",
+ "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
+ }
+ },
+ "GL_BGR5_A1_ANGLEX": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadRGB5A1ToRGBA8",
+ "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT": "LoadToNative<GLushort, 1>"
+ }
+ },
+ "GL_BGRA8_SRGB_ANGLEX" : {
+ "B8G8R8A8_UNORM_SRGB": {
+ "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 4>"
+ }
+ },
+ "GL_A1RGB5_ANGLEX" : {
+ "A1R5G5B5_UNORM": {
+ "GL_UNSIGNED_BYTE": "LoadRGB5A1ToRGBA8",
+ "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT": "LoadToNative<GLushort, 1>"
+ }
+ },
+ "GL_R8_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RG8_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGB8_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGBA8_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_R8_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RG8_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGB8_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGBA8_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_R16_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RG16_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGB16_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGBA16_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_R16_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RG16_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGB16_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGBA16_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGB10_A2_SINT_ANGLEX" : {
+ "R10G10B10A2_SINT": {
+ "GL_UNSIGNED_BYTE": "LoadRGB10A2ToRGBA8",
+ "GL_UNSIGNED_INT_2_10_10_10_REV": "LoadToNative<GLuint, 1>"
+ }
+ },
+ "GL_RGB10_A2_SNORM_ANGLEX" : {
+ "R10G10B10A2_SNORM": {
+ "GL_UNSIGNED_BYTE": "LoadRGB10A2ToRGBA8",
+ "GL_UNSIGNED_INT_2_10_10_10_REV": "LoadToNative<GLuint, 1>"
+ }
+ },
+ "GL_RGB10_A2_SSCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
+ }
+ },
+ "GL_RGB10_A2_USCALED_ANGLEX" : {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "UnreachableLoadFunction"
}
},
"GL_COMPRESSED_RG11_EAC": {
"R16G16_UNORM": {
"GL_UNSIGNED_BYTE": "LoadEACRG11ToRG16"
+ },
+ "EAC_R11G11_UNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
}
},
"GL_SRGB8_ALPHA8": {
@@ -359,11 +528,17 @@
"GL_DEPTH24_STENCIL8": {
"D24_UNORM_S8_UINT": {
"GL_UNSIGNED_INT_24_8": "LoadR32ToR24G8"
+ },
+ "D32_FLOAT_S8X24_UINT": {
+ "GL_UNSIGNED_INT_24_8": "LoadD24S8ToD32FS8X24"
}
},
"GL_RGB16I": {
"R16G16B16A16_SINT": {
"GL_SHORT": "LoadToNative3To4<GLshort, 0x0001>"
+ },
+ "R16G16B16_SINT": {
+ "GL_SHORT": "LoadToNative<GLshort, 3>"
}
},
"GL_R8UI": {
@@ -388,11 +563,19 @@
"GL_HALF_FLOAT": "LoadToNative3To4<GLhalf, gl::Float16One>",
"GL_FLOAT": "LoadRGB32FToRGBA16F",
"GL_HALF_FLOAT_OES": "LoadToNative3To4<GLhalf, gl::Float16One>"
+ },
+ "R16G16B16_FLOAT": {
+ "GL_HALF_FLOAT": "LoadToNative<GLhalf, 3>",
+ "GL_FLOAT": "LoadRGB32FToRGB16F",
+ "GL_HALF_FLOAT_OES": "LoadToNative<GLhalf, 3>"
}
},
"GL_COMPRESSED_SIGNED_R11_EAC": {
"R16_SNORM": {
"GL_UNSIGNED_BYTE": "LoadEACR11SToR16"
+ },
+ "EAC_R11_SNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
}
},
"GL_COMPRESSED_RGB_S3TC_DXT1_EXT": {
@@ -418,11 +601,17 @@
"GL_RGB8UI": {
"R8G8B8A8_UINT": {
"GL_UNSIGNED_BYTE": "LoadToNative3To4<GLubyte, 0x01>"
+ },
+ "R8G8B8_UINT": {
+ "GL_UNSIGNED_BYTE": "LoadToNative<GLubyte, 3>"
}
},
"GL_DEPTH_COMPONENT24": {
"D24_UNORM_S8_UINT": {
"GL_UNSIGNED_INT": "LoadR32ToR24G8"
+ },
+ "D32_FLOAT_S8X24_UINT": {
+ "GL_UNSIGNED_INT_24_8": "LoadD24S8ToD32FS8X24"
}
},
"GL_R32I": {
@@ -449,6 +638,7 @@
},
"GL_RGB565": {
"R5G6B5_UNORM" : {
+ "GL_UNSIGNED_BYTE": "LoadRGB8ToBGR565",
"GL_UNSIGNED_SHORT_5_6_5": "LoadToNative<GLushort, 1>"
},
"R8G8B8A8_UNORM": {
@@ -527,6 +717,12 @@
"GL_ETC1_RGB8_OES": {
"R8G8B8A8_UNORM": {
"GL_UNSIGNED_BYTE": "LoadETC1RGB8ToRGBA8"
+ },
+ "ETC1_R8G8B8_UNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
+ },
+ "ETC2_R8G8B8_UNORM_BLOCK": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 8>"
}
},
"GL_ETC1_RGB8_LOSSY_DECODE_ANGLE": {
@@ -567,6 +763,9 @@
"GL_RGB16_EXT": {
"R16G16B16A16_UNORM": {
"GL_UNSIGNED_SHORT": "LoadToNative3To4<GLushort, 0xFFFF>"
+ },
+ "R16G16B16_UNORM": {
+ "GL_UNSIGNED_SHORT": "LoadToNative<GLushort, 3>"
}
},
"GL_RGBA16_EXT": {
@@ -587,6 +786,9 @@
"GL_RGB16_SNORM_EXT": {
"R16G16B16A16_SNORM": {
"GL_SHORT": "LoadToNative3To4<GLushort, 0x7FFF>"
+ },
+ "R16G16B16_SNORM": {
+ "GL_SHORT": "LoadToNative<GLushort, 3>"
}
},
"GL_RGBA16_SNORM_EXT": {
@@ -633,5 +835,145 @@
"NONE": {
"GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
}
+ },
+ "GL_COMPRESSED_RGBA_ASTC_4x4_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_5x4_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<5, 4, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_5x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<5, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_6x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<6, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_6x6_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<6, 6, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_8x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<8, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_8x6_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<8, 6, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_8x8_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<8, 8, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_10x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_10x6_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 6, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_10x8_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 8, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_10x10_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 10, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_12x10_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<12, 10, 16>"
+ }
+ },
+ "GL_COMPRESSED_RGBA_ASTC_12x12_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<12, 12, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<4, 4, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<5, 4, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<5, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<6, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<6, 6, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<8, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<8, 6, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<8, 8, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 5, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 6, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 8, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<10, 10, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<12, 10, 16>"
+ }
+ },
+ "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR": {
+ "NONE": {
+ "GL_UNSIGNED_BYTE": "LoadCompressedToNative<12, 12, 16>"
+ }
}
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp b/chromium/third_party/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp
index 256dd218a3b..30d30cedb31 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/load_functions_table_autogen.cpp
@@ -1,7 +1,7 @@
// GENERATED FILE - DO NOT EDIT.
// Generated by gen_load_functions_table.py using data from load_functions_data.json
//
-// Copyright 2018 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.
//
@@ -56,6 +56,20 @@ void UnreachableLoadFunction(size_t width,
UNREACHABLE();
}
+LoadImageFunctionInfo A1RGB5_ANGLEX_to_A1R5G5B5_UNORM(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
+ case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
+ return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo ALPHA_to_R16G16B16A16_FLOAT(GLenum type)
{
switch (type)
@@ -165,7 +179,7 @@ LoadImageFunctionInfo BGR565_ANGLEX_to_B5G6R5_UNORM(GLenum type)
switch (type)
{
case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
+ return LoadImageFunctionInfo(LoadRGB8ToBGR565, true);
case GL_UNSIGNED_SHORT_5_6_5:
return LoadImageFunctionInfo(LoadRGB565ToBGR565, true);
default:
@@ -179,9 +193,9 @@ LoadImageFunctionInfo BGR5_A1_ANGLEX_to_default(GLenum type)
switch (type)
{
case GL_UNSIGNED_BYTE:
- return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
- case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
return LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
+ case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
+ return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
default:
UNREACHABLE();
return LoadImageFunctionInfo(UnreachableLoadFunction, true);
@@ -214,6 +228,18 @@ LoadImageFunctionInfo BGRA8_EXT_to_default(GLenum type)
}
}
+LoadImageFunctionInfo BGRA8_SRGB_ANGLEX_to_B8G8R8A8_UNORM_SRGB(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo BGRA_EXT_to_default(GLenum type)
{
switch (type)
@@ -226,6 +252,42 @@ LoadImageFunctionInfo BGRA_EXT_to_default(GLenum type)
}
}
+LoadImageFunctionInfo BGRX8_ANGLEX_to_B8G8R8A8_UNORM(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo BGRX8_ANGLEX_to_B8G8R8X8_UNORM(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_R11_EAC_to_EAC_R11_UNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_R11_EAC_to_R16_UNORM(GLenum type)
{
switch (type)
@@ -238,6 +300,18 @@ LoadImageFunctionInfo COMPRESSED_R11_EAC_to_R16_UNORM(GLenum type)
}
}
+LoadImageFunctionInfo COMPRESSED_RG11_EAC_to_EAC_R11G11_UNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_RG11_EAC_to_R16G16_UNORM(GLenum type)
{
switch (type)
@@ -250,6 +324,18 @@ LoadImageFunctionInfo COMPRESSED_RG11_EAC_to_R16G16_UNORM(GLenum type)
}
}
+LoadImageFunctionInfo COMPRESSED_RGB8_ETC2_to_ETC2_R8G8B8_UNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_RGB8_ETC2_to_R8G8B8A8_UNORM(GLenum type)
{
switch (type)
@@ -274,6 +360,19 @@ LoadImageFunctionInfo COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_B
}
}
+LoadImageFunctionInfo COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_UNORM_BLOCK(
+ GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM(GLenum type)
{
switch (type)
@@ -299,6 +398,18 @@ COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_BL
}
}
+LoadImageFunctionInfo COMPRESSED_RGBA8_ETC2_EAC_to_ETC2_R8G8B8A8_UNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_RGBA8_ETC2_EAC_to_R8G8B8A8_UNORM(GLenum type)
{
switch (type)
@@ -311,6 +422,174 @@ LoadImageFunctionInfo COMPRESSED_RGBA8_ETC2_EAC_to_R8G8B8A8_UNORM(GLenum type)
}
}
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x10_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 10, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x6_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 6, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x8_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 8, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_12x10_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<12, 10, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_12x12_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<12, 12, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_4x4_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_5x4_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<5, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_5x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_6x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<6, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_6x6_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_8x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<8, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_8x6_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<8, 6, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_8x8_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<8, 8, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_RGBA_BPTC_UNORM_EXT_to_default(GLenum type)
{
switch (type)
@@ -395,6 +674,18 @@ LoadImageFunctionInfo COMPRESSED_RGB_S3TC_DXT1_EXT_to_default(GLenum type)
}
}
+LoadImageFunctionInfo COMPRESSED_SIGNED_R11_EAC_to_EAC_R11_SNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_SIGNED_R11_EAC_to_R16_SNORM(GLenum type)
{
switch (type)
@@ -407,6 +698,18 @@ LoadImageFunctionInfo COMPRESSED_SIGNED_R11_EAC_to_R16_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo COMPRESSED_SIGNED_RG11_EAC_to_EAC_R11G11_SNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_SIGNED_RG11_EAC_to_R16G16_SNORM(GLenum type)
{
switch (type)
@@ -419,6 +722,186 @@ LoadImageFunctionInfo COMPRESSED_SIGNED_RG11_EAC_to_R16G16_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 10, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 6, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<10, 8, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<12, 10, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<12, 12, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<5, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<6, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<8, 5, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<8, 6, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<8, 8, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_ETC2_R8G8B8A8_SRGB_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 16>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
switch (type)
@@ -431,6 +914,18 @@ LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_R8G8B8A8_UNORM_SRGB(GL
}
}
+LoadImageFunctionInfo COMPRESSED_SRGB8_ETC2_to_ETC2_R8G8B8_SRGB_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_SRGB8_ETC2_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
switch (type)
@@ -456,6 +951,19 @@ LoadImageFunctionInfo COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_
}
}
+LoadImageFunctionInfo COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_SRGB_BLOCK(
+ GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
switch (type)
@@ -554,6 +1062,30 @@ LoadImageFunctionInfo DEPTH24_STENCIL8_to_D24_UNORM_S8_UINT(GLenum type)
}
}
+LoadImageFunctionInfo DEPTH24_STENCIL8_to_D32_FLOAT_S8X24_UINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_INT_24_8:
+ return LoadImageFunctionInfo(LoadD24S8ToD32FS8X24, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo DEPTH32F_STENCIL8_to_D24_UNORM_S8_UINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
+ return LoadImageFunctionInfo(LoadD32FS8X24ToD24S8, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo DEPTH32F_STENCIL8_to_D32_FLOAT_S8X24_UINT(GLenum type)
{
switch (type)
@@ -592,6 +1124,18 @@ LoadImageFunctionInfo DEPTH_COMPONENT24_to_D24_UNORM_S8_UINT(GLenum type)
}
}
+LoadImageFunctionInfo DEPTH_COMPONENT24_to_D32_FLOAT_S8X24_UINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_INT_24_8:
+ return LoadImageFunctionInfo(LoadD24S8ToD32FS8X24, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo DEPTH_COMPONENT32F_to_D32_FLOAT(GLenum type)
{
switch (type)
@@ -628,6 +1172,30 @@ LoadImageFunctionInfo ETC1_RGB8_LOSSY_DECODE_ANGLE_to_BC1_RGB_UNORM_BLOCK(GLenum
}
}
+LoadImageFunctionInfo ETC1_RGB8_OES_to_ETC1_R8G8B8_UNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo ETC1_RGB8_OES_to_ETC2_R8G8B8_UNORM_BLOCK(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 8>, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo ETC1_RGB8_OES_to_R8G8B8A8_UNORM(GLenum type)
{
switch (type)
@@ -906,6 +1474,30 @@ LoadImageFunctionInfo R16_SNORM_EXT_to_R16_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo R16_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo R16_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo R32F_to_R32_FLOAT(GLenum type)
{
switch (type)
@@ -990,6 +1582,30 @@ LoadImageFunctionInfo R8_SNORM_to_R8_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo R8_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo R8_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RG16F_to_R16G16_FLOAT(GLenum type)
{
switch (type)
@@ -1054,6 +1670,30 @@ LoadImageFunctionInfo RG16_SNORM_EXT_to_R16G16_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo RG16_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RG16_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RG32F_to_R32G32_FLOAT(GLenum type)
{
switch (type)
@@ -1138,6 +1778,30 @@ LoadImageFunctionInfo RG8_SNORM_to_R8G8_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo RG8_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RG8_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB_to_default(GLenum type)
{
switch (type)
@@ -1176,6 +1840,58 @@ LoadImageFunctionInfo RGB10_A2UI_to_R10G10B10A2_UINT(GLenum type)
}
}
+LoadImageFunctionInfo RGB10_A2_SINT_ANGLEX_to_R10G10B10A2_SINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadRGB10A2ToRGBA8, true);
+ case GL_UNSIGNED_INT_2_10_10_10_REV:
+ return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGB10_A2_SNORM_ANGLEX_to_R10G10B10A2_SNORM(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadRGB10A2ToRGBA8, true);
+ case GL_UNSIGNED_INT_2_10_10_10_REV:
+ return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGB10_A2_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGB10_A2_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB16F_to_R16G16B16A16_FLOAT(GLenum type)
{
switch (type)
@@ -1192,6 +1908,22 @@ LoadImageFunctionInfo RGB16F_to_R16G16B16A16_FLOAT(GLenum type)
}
}
+LoadImageFunctionInfo RGB16F_to_R16G16B16_FLOAT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_FLOAT:
+ return LoadImageFunctionInfo(LoadRGB32FToRGB16F, true);
+ case GL_HALF_FLOAT:
+ return LoadImageFunctionInfo(LoadToNative<GLhalf, 3>, false);
+ case GL_HALF_FLOAT_OES:
+ return LoadImageFunctionInfo(LoadToNative<GLhalf, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB16I_to_R16G16B16A16_SINT(GLenum type)
{
switch (type)
@@ -1204,6 +1936,18 @@ LoadImageFunctionInfo RGB16I_to_R16G16B16A16_SINT(GLenum type)
}
}
+LoadImageFunctionInfo RGB16I_to_R16G16B16_SINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_SHORT:
+ return LoadImageFunctionInfo(LoadToNative<GLshort, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB16UI_to_R16G16B16A16_UINT(GLenum type)
{
switch (type)
@@ -1216,6 +1960,18 @@ LoadImageFunctionInfo RGB16UI_to_R16G16B16A16_UINT(GLenum type)
}
}
+LoadImageFunctionInfo RGB16UI_to_R16G16B16_UINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_SHORT:
+ return LoadImageFunctionInfo(LoadToNative<GLushort, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB16_EXT_to_R16G16B16A16_UNORM(GLenum type)
{
switch (type)
@@ -1228,6 +1984,18 @@ LoadImageFunctionInfo RGB16_EXT_to_R16G16B16A16_UNORM(GLenum type)
}
}
+LoadImageFunctionInfo RGB16_EXT_to_R16G16B16_UNORM(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_SHORT:
+ return LoadImageFunctionInfo(LoadToNative<GLushort, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB16_SNORM_EXT_to_R16G16B16A16_SNORM(GLenum type)
{
switch (type)
@@ -1240,6 +2008,42 @@ LoadImageFunctionInfo RGB16_SNORM_EXT_to_R16G16B16A16_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo RGB16_SNORM_EXT_to_R16G16B16_SNORM(GLenum type)
+{
+ switch (type)
+ {
+ case GL_SHORT:
+ return LoadImageFunctionInfo(LoadToNative<GLushort, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGB16_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGB16_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB32F_to_R32G32B32A32_FLOAT(GLenum type)
{
switch (type)
@@ -1252,6 +2056,18 @@ LoadImageFunctionInfo RGB32F_to_R32G32B32A32_FLOAT(GLenum type)
}
}
+LoadImageFunctionInfo RGB32F_to_R32G32B32_FLOAT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_FLOAT:
+ return LoadImageFunctionInfo(LoadToNative<GLfloat, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB32I_to_R32G32B32A32_SINT(GLenum type)
{
switch (type)
@@ -1264,6 +2080,18 @@ LoadImageFunctionInfo RGB32I_to_R32G32B32A32_SINT(GLenum type)
}
}
+LoadImageFunctionInfo RGB32I_to_R32G32B32_SINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_INT:
+ return LoadImageFunctionInfo(LoadToNative<GLint, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB32UI_to_R32G32B32A32_UINT(GLenum type)
{
switch (type)
@@ -1276,6 +2104,18 @@ LoadImageFunctionInfo RGB32UI_to_R32G32B32A32_UINT(GLenum type)
}
}
+LoadImageFunctionInfo RGB32UI_to_R32G32B32_UINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_INT:
+ return LoadImageFunctionInfo(LoadToNative<GLuint, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB565_to_B5G6R5_UNORM(GLenum type)
{
switch (type)
@@ -1294,6 +2134,8 @@ LoadImageFunctionInfo RGB565_to_R5G6B5_UNORM(GLenum type)
{
switch (type)
{
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadRGB8ToBGR565, true);
case GL_UNSIGNED_SHORT_5_6_5:
return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
default:
@@ -1384,6 +2226,18 @@ LoadImageFunctionInfo RGB8I_to_R8G8B8A8_SINT(GLenum type)
}
}
+LoadImageFunctionInfo RGB8I_to_R8G8B8_SINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_BYTE:
+ return LoadImageFunctionInfo(LoadToNative<GLbyte, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB8UI_to_R8G8B8A8_UINT(GLenum type)
{
switch (type)
@@ -1396,6 +2250,18 @@ LoadImageFunctionInfo RGB8UI_to_R8G8B8A8_UINT(GLenum type)
}
}
+LoadImageFunctionInfo RGB8UI_to_R8G8B8_UINT(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(LoadToNative<GLubyte, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB8_SNORM_to_R8G8B8A8_SNORM(GLenum type)
{
switch (type)
@@ -1408,6 +2274,42 @@ LoadImageFunctionInfo RGB8_SNORM_to_R8G8B8A8_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo RGB8_SNORM_to_R8G8B8_SNORM(GLenum type)
+{
+ switch (type)
+ {
+ case GL_BYTE:
+ return LoadImageFunctionInfo(LoadToNative<GLbyte, 3>, false);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGB8_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGB8_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGB9_E5_to_R9G9B9E5_SHAREDEXP(GLenum type)
{
switch (type)
@@ -1506,6 +2408,30 @@ LoadImageFunctionInfo RGBA16_SNORM_EXT_to_R16G16B16A16_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo RGBA16_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGBA16_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo RGBA32F_to_R32G32B32A32_FLOAT(GLenum type)
{
switch (type)
@@ -1618,6 +2544,30 @@ LoadImageFunctionInfo RGBA8_SNORM_to_R8G8B8A8_SNORM(GLenum type)
}
}
+LoadImageFunctionInfo RGBA8_SSCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
+LoadImageFunctionInfo RGBA8_USCALED_ANGLEX_to_default(GLenum type)
+{
+ switch (type)
+ {
+ case GL_UNSIGNED_BYTE:
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ default:
+ UNREACHABLE();
+ return LoadImageFunctionInfo(UnreachableLoadFunction, true);
+ }
+}
+
LoadImageFunctionInfo SRGB8_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
switch (type)
@@ -1661,6 +2611,17 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
// clang-format off
switch (internalFormat)
{
+ case GL_A1RGB5_ANGLEX:
+ {
+ switch (angleFormat)
+ {
+ case FormatID::A1R5G5B5_UNORM:
+ return A1RGB5_ANGLEX_to_A1R5G5B5_UNORM;
+ default:
+ break;
+ }
+ break;
+ }
case GL_ALPHA:
{
switch (angleFormat)
@@ -1709,12 +2670,38 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
return BGRA4_ANGLEX_to_default;
case GL_BGRA8_EXT:
return BGRA8_EXT_to_default;
+ case GL_BGRA8_SRGB_ANGLEX:
+ {
+ switch (angleFormat)
+ {
+ case FormatID::B8G8R8A8_UNORM_SRGB:
+ return BGRA8_SRGB_ANGLEX_to_B8G8R8A8_UNORM_SRGB;
+ default:
+ break;
+ }
+ break;
+ }
case GL_BGRA_EXT:
return BGRA_EXT_to_default;
+ case GL_BGRX8_ANGLEX:
+ {
+ switch (angleFormat)
+ {
+ case FormatID::B8G8R8A8_UNORM:
+ return BGRX8_ANGLEX_to_B8G8R8A8_UNORM;
+ case FormatID::B8G8R8X8_UNORM:
+ return BGRX8_ANGLEX_to_B8G8R8X8_UNORM;
+ default:
+ break;
+ }
+ break;
+ }
case GL_COMPRESSED_R11_EAC:
{
switch (angleFormat)
{
+ case FormatID::EAC_R11_UNORM_BLOCK:
+ return COMPRESSED_R11_EAC_to_EAC_R11_UNORM_BLOCK;
case FormatID::R16_UNORM:
return COMPRESSED_R11_EAC_to_R16_UNORM;
default:
@@ -1726,6 +2713,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::EAC_R11G11_UNORM_BLOCK:
+ return COMPRESSED_RG11_EAC_to_EAC_R11G11_UNORM_BLOCK;
case FormatID::R16G16_UNORM:
return COMPRESSED_RG11_EAC_to_R16G16_UNORM;
default:
@@ -1737,6 +2726,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::ETC2_R8G8B8_UNORM_BLOCK:
+ return COMPRESSED_RGB8_ETC2_to_ETC2_R8G8B8_UNORM_BLOCK;
case FormatID::R8G8B8A8_UNORM:
return COMPRESSED_RGB8_ETC2_to_R8G8B8A8_UNORM;
default:
@@ -1759,6 +2750,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::ETC2_R8G8B8A1_UNORM_BLOCK:
+ return COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_UNORM_BLOCK;
case FormatID::R8G8B8A8_UNORM:
return COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM;
default:
@@ -1781,6 +2774,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::ETC2_R8G8B8A8_UNORM_BLOCK:
+ return COMPRESSED_RGBA8_ETC2_EAC_to_ETC2_R8G8B8A8_UNORM_BLOCK;
case FormatID::R8G8B8A8_UNORM:
return COMPRESSED_RGBA8_ETC2_EAC_to_R8G8B8A8_UNORM;
default:
@@ -1788,6 +2783,34 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
+ return COMPRESSED_RGBA_ASTC_10x10_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
+ return COMPRESSED_RGBA_ASTC_10x5_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
+ return COMPRESSED_RGBA_ASTC_10x6_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
+ return COMPRESSED_RGBA_ASTC_10x8_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
+ return COMPRESSED_RGBA_ASTC_12x10_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
+ return COMPRESSED_RGBA_ASTC_12x12_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
+ return COMPRESSED_RGBA_ASTC_4x4_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
+ return COMPRESSED_RGBA_ASTC_5x4_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
+ return COMPRESSED_RGBA_ASTC_5x5_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
+ return COMPRESSED_RGBA_ASTC_6x5_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
+ return COMPRESSED_RGBA_ASTC_6x6_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
+ return COMPRESSED_RGBA_ASTC_8x5_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
+ return COMPRESSED_RGBA_ASTC_8x6_KHR_to_default;
+ case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
+ return COMPRESSED_RGBA_ASTC_8x8_KHR_to_default;
case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
return COMPRESSED_RGBA_BPTC_UNORM_EXT_to_default;
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
@@ -1806,6 +2829,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::EAC_R11_SNORM_BLOCK:
+ return COMPRESSED_SIGNED_R11_EAC_to_EAC_R11_SNORM_BLOCK;
case FormatID::R16_SNORM:
return COMPRESSED_SIGNED_R11_EAC_to_R16_SNORM;
default:
@@ -1817,6 +2842,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::EAC_R11G11_SNORM_BLOCK:
+ return COMPRESSED_SIGNED_RG11_EAC_to_EAC_R11G11_SNORM_BLOCK;
case FormatID::R16G16_SNORM:
return COMPRESSED_SIGNED_RG11_EAC_to_R16G16_SNORM;
default:
@@ -1824,10 +2851,40 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR_to_default;
+ case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+ return COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR_to_default;
case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
{
switch (angleFormat)
{
+ case FormatID::ETC2_R8G8B8A8_SRGB_BLOCK:
+ return COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_ETC2_R8G8B8A8_SRGB_BLOCK;
case FormatID::R8G8B8A8_UNORM_SRGB:
return COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_R8G8B8A8_UNORM_SRGB;
default:
@@ -1839,6 +2896,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::ETC2_R8G8B8_SRGB_BLOCK:
+ return COMPRESSED_SRGB8_ETC2_to_ETC2_R8G8B8_SRGB_BLOCK;
case FormatID::R8G8B8A8_UNORM_SRGB:
return COMPRESSED_SRGB8_ETC2_to_R8G8B8A8_UNORM_SRGB;
default:
@@ -1861,6 +2920,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::ETC2_R8G8B8A1_SRGB_BLOCK:
+ return COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_SRGB_BLOCK;
case FormatID::R8G8B8A8_UNORM_SRGB:
return COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM_SRGB;
default:
@@ -1895,6 +2956,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::D24_UNORM_S8_UINT:
return DEPTH24_STENCIL8_to_D24_UNORM_S8_UINT;
+ case FormatID::D32_FLOAT_S8X24_UINT:
+ return DEPTH24_STENCIL8_to_D32_FLOAT_S8X24_UINT;
default:
break;
}
@@ -1904,6 +2967,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::D24_UNORM_S8_UINT:
+ return DEPTH32F_STENCIL8_to_D24_UNORM_S8_UINT;
case FormatID::D32_FLOAT_S8X24_UINT:
return DEPTH32F_STENCIL8_to_D32_FLOAT_S8X24_UINT;
default:
@@ -1928,6 +2993,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::D24_UNORM_S8_UINT:
return DEPTH_COMPONENT24_to_D24_UNORM_S8_UINT;
+ case FormatID::D32_FLOAT_S8X24_UINT:
+ return DEPTH_COMPONENT24_to_D32_FLOAT_S8X24_UINT;
default:
break;
}
@@ -1961,6 +3028,10 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
switch (angleFormat)
{
+ case FormatID::ETC1_R8G8B8_UNORM_BLOCK:
+ return ETC1_RGB8_OES_to_ETC1_R8G8B8_UNORM_BLOCK;
+ case FormatID::ETC2_R8G8B8_UNORM_BLOCK:
+ return ETC1_RGB8_OES_to_ETC2_R8G8B8_UNORM_BLOCK;
case FormatID::R8G8B8A8_UNORM:
return ETC1_RGB8_OES_to_R8G8B8A8_UNORM;
default:
@@ -2092,6 +3163,10 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_R16_SSCALED_ANGLEX:
+ return R16_SSCALED_ANGLEX_to_default;
+ case GL_R16_USCALED_ANGLEX:
+ return R16_USCALED_ANGLEX_to_default;
case GL_R32F:
{
switch (angleFormat)
@@ -2169,6 +3244,10 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_R8_SSCALED_ANGLEX:
+ return R8_SSCALED_ANGLEX_to_default;
+ case GL_R8_USCALED_ANGLEX:
+ return R8_USCALED_ANGLEX_to_default;
case GL_RG16F:
{
switch (angleFormat)
@@ -2224,6 +3303,10 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_RG16_SSCALED_ANGLEX:
+ return RG16_SSCALED_ANGLEX_to_default;
+ case GL_RG16_USCALED_ANGLEX:
+ return RG16_USCALED_ANGLEX_to_default;
case GL_RG32F:
{
switch (angleFormat)
@@ -2301,6 +3384,10 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_RG8_SSCALED_ANGLEX:
+ return RG8_SSCALED_ANGLEX_to_default;
+ case GL_RG8_USCALED_ANGLEX:
+ return RG8_USCALED_ANGLEX_to_default;
case GL_RGB:
return RGB_to_default;
case GL_RGB10_A2:
@@ -2325,12 +3412,40 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_RGB10_A2_SINT_ANGLEX:
+ {
+ switch (angleFormat)
+ {
+ case FormatID::R10G10B10A2_SINT:
+ return RGB10_A2_SINT_ANGLEX_to_R10G10B10A2_SINT;
+ default:
+ break;
+ }
+ break;
+ }
+ case GL_RGB10_A2_SNORM_ANGLEX:
+ {
+ switch (angleFormat)
+ {
+ case FormatID::R10G10B10A2_SNORM:
+ return RGB10_A2_SNORM_ANGLEX_to_R10G10B10A2_SNORM;
+ default:
+ break;
+ }
+ break;
+ }
+ case GL_RGB10_A2_SSCALED_ANGLEX:
+ return RGB10_A2_SSCALED_ANGLEX_to_default;
+ case GL_RGB10_A2_USCALED_ANGLEX:
+ return RGB10_A2_USCALED_ANGLEX_to_default;
case GL_RGB16F:
{
switch (angleFormat)
{
case FormatID::R16G16B16A16_FLOAT:
return RGB16F_to_R16G16B16A16_FLOAT;
+ case FormatID::R16G16B16_FLOAT:
+ return RGB16F_to_R16G16B16_FLOAT;
default:
break;
}
@@ -2342,6 +3457,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R16G16B16A16_SINT:
return RGB16I_to_R16G16B16A16_SINT;
+ case FormatID::R16G16B16_SINT:
+ return RGB16I_to_R16G16B16_SINT;
default:
break;
}
@@ -2353,6 +3470,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R16G16B16A16_UINT:
return RGB16UI_to_R16G16B16A16_UINT;
+ case FormatID::R16G16B16_UINT:
+ return RGB16UI_to_R16G16B16_UINT;
default:
break;
}
@@ -2364,6 +3483,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R16G16B16A16_UNORM:
return RGB16_EXT_to_R16G16B16A16_UNORM;
+ case FormatID::R16G16B16_UNORM:
+ return RGB16_EXT_to_R16G16B16_UNORM;
default:
break;
}
@@ -2375,17 +3496,25 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R16G16B16A16_SNORM:
return RGB16_SNORM_EXT_to_R16G16B16A16_SNORM;
+ case FormatID::R16G16B16_SNORM:
+ return RGB16_SNORM_EXT_to_R16G16B16_SNORM;
default:
break;
}
break;
}
+ case GL_RGB16_SSCALED_ANGLEX:
+ return RGB16_SSCALED_ANGLEX_to_default;
+ case GL_RGB16_USCALED_ANGLEX:
+ return RGB16_USCALED_ANGLEX_to_default;
case GL_RGB32F:
{
switch (angleFormat)
{
case FormatID::R32G32B32A32_FLOAT:
return RGB32F_to_R32G32B32A32_FLOAT;
+ case FormatID::R32G32B32_FLOAT:
+ return RGB32F_to_R32G32B32_FLOAT;
default:
break;
}
@@ -2397,6 +3526,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R32G32B32A32_SINT:
return RGB32I_to_R32G32B32A32_SINT;
+ case FormatID::R32G32B32_SINT:
+ return RGB32I_to_R32G32B32_SINT;
default:
break;
}
@@ -2408,6 +3539,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R32G32B32A32_UINT:
return RGB32UI_to_R32G32B32A32_UINT;
+ case FormatID::R32G32B32_UINT:
+ return RGB32UI_to_R32G32B32_UINT;
default:
break;
}
@@ -2460,6 +3593,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R8G8B8A8_SINT:
return RGB8I_to_R8G8B8A8_SINT;
+ case FormatID::R8G8B8_SINT:
+ return RGB8I_to_R8G8B8_SINT;
default:
break;
}
@@ -2471,6 +3606,8 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R8G8B8A8_UINT:
return RGB8UI_to_R8G8B8A8_UINT;
+ case FormatID::R8G8B8_UINT:
+ return RGB8UI_to_R8G8B8_UINT;
default:
break;
}
@@ -2482,11 +3619,17 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
case FormatID::R8G8B8A8_SNORM:
return RGB8_SNORM_to_R8G8B8A8_SNORM;
+ case FormatID::R8G8B8_SNORM:
+ return RGB8_SNORM_to_R8G8B8_SNORM;
default:
break;
}
break;
}
+ case GL_RGB8_SSCALED_ANGLEX:
+ return RGB8_SSCALED_ANGLEX_to_default;
+ case GL_RGB8_USCALED_ANGLEX:
+ return RGB8_USCALED_ANGLEX_to_default;
case GL_RGB9_E5:
{
switch (angleFormat)
@@ -2555,6 +3698,10 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_RGBA16_SSCALED_ANGLEX:
+ return RGBA16_SSCALED_ANGLEX_to_default;
+ case GL_RGBA16_USCALED_ANGLEX:
+ return RGBA16_USCALED_ANGLEX_to_default;
case GL_RGBA32F:
{
switch (angleFormat)
@@ -2645,6 +3792,10 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
}
break;
}
+ case GL_RGBA8_SSCALED_ANGLEX:
+ return RGBA8_SSCALED_ANGLEX_to_default;
+ case GL_RGBA8_USCALED_ANGLEX:
+ return RGBA8_USCALED_ANGLEX_to_default;
case GL_SRGB8:
{
switch (angleFormat)
@@ -2674,6 +3825,7 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
break;
}
// clang-format on
+ ASSERT(internalFormat == GL_NONE || angleFormat == angle::FormatID::NONE);
static LoadFunctionMap emptyLoadFunctionsMap;
return emptyLoadFunctionsMap;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp
index 86fd9c5391b..2c1ad1ab88e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.cpp
@@ -245,9 +245,9 @@ void ContextNULL::stencilThenCoverStrokePathInstanced(const std::vector<gl::Path
const GLfloat *transformValues)
{}
-GLenum ContextNULL::getResetStatus()
+gl::GraphicsResetStatus ContextNULL::getResetStatus()
{
- return GL_NO_ERROR;
+ return gl::GraphicsResetStatus::NoError;
}
std::string ContextNULL::getVendorString() const
@@ -392,6 +392,12 @@ std::vector<PathImpl *> ContextNULL::createPaths(GLsizei range)
return result;
}
+MemoryObjectImpl *ContextNULL::createMemoryObject()
+{
+ UNREACHABLE();
+ return nullptr;
+}
+
angle::Result ContextNULL::dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h
index 0d963ea5ab4..80dcae78e03 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ContextNULL.h
@@ -128,7 +128,7 @@ class ContextNULL : public ContextImpl
const GLfloat *transformValues) override;
// Device loss
- GLenum getResetStatus() override;
+ gl::GraphicsResetStatus getResetStatus() override;
// Vendor and description strings.
std::string getVendorString() const override;
@@ -198,6 +198,9 @@ class ContextNULL : public ContextImpl
std::vector<PathImpl *> createPaths(GLsizei range) override;
+ // Memory object creation.
+ MemoryObjectImpl *createMemoryObject() override;
+
angle::Result dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.cpp
index 05ae5e58d47..eec466fe869 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.cpp
@@ -10,6 +10,7 @@
#include "libANGLE/renderer/null/ShaderNULL.h"
#include "common/debug.h"
+#include "libANGLE/Context.h"
namespace rx
{
@@ -18,17 +19,11 @@ ShaderNULL::ShaderNULL(const gl::ShaderState &data) : ShaderImpl(data) {}
ShaderNULL::~ShaderNULL() {}
-ShCompileOptions ShaderNULL::prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string *sourcePath)
+std::shared_ptr<WaitableCompileEvent> ShaderNULL::compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options)
{
- *sourceStream << mData.getSource();
- return 0;
-}
-
-bool ShaderNULL::postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog)
-{
- return true;
+ return compileImpl(context, compilerInstance, mData.getSource(), options);
}
std::string ShaderNULL::getDebugInfo() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.h
index 0892fa18901..8efab1a1630 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/ShaderNULL.h
@@ -21,12 +21,9 @@ class ShaderNULL : public ShaderImpl
ShaderNULL(const gl::ShaderState &data);
~ShaderNULL() override;
- // Returns additional sh::Compile options.
- ShCompileOptions prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string *sourcePath) override;
- // Returns success for compiling on the driver. Returns success.
- bool postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog) override;
+ std::shared_ptr<WaitableCompileEvent> compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options) override;
std::string getDebugInfo() const override;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp
index 1adc52deacc..a7b6f047c6b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.cpp
@@ -84,6 +84,38 @@ angle::Result TextureNULL::copySubImage(const gl::Context *context,
return angle::Result::Continue;
}
+angle::Result TextureNULL::copyTexture(const gl::Context *context,
+ const gl::ImageIndex &index,
+ GLenum internalFormat,
+ GLenum type,
+ size_t sourceLevel,
+ bool unpackFlipY,
+ bool unpackPremultiplyAlpha,
+ bool unpackUnmultiplyAlpha,
+ const gl::Texture *source)
+{
+ return angle::Result::Continue;
+}
+
+angle::Result TextureNULL::copySubTexture(const gl::Context *context,
+ const gl::ImageIndex &index,
+ const gl::Offset &destOffset,
+ size_t sourceLevel,
+ const gl::Box &sourceBox,
+ bool unpackFlipY,
+ bool unpackPremultiplyAlpha,
+ bool unpackUnmultiplyAlpha,
+ const gl::Texture *source)
+{
+ return angle::Result::Continue;
+}
+
+angle::Result TextureNULL::copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source)
+{
+ return angle::Result::Continue;
+}
+
angle::Result TextureNULL::setStorage(const gl::Context *context,
gl::TextureType type,
size_t levels,
@@ -93,6 +125,17 @@ angle::Result TextureNULL::setStorage(const gl::Context *context,
return angle::Result::Continue;
}
+angle::Result TextureNULL::setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset)
+{
+ return angle::Result::Continue;
+}
+
angle::Result TextureNULL::setEGLImageTarget(const gl::Context *context,
gl::TextureType type,
egl::Image *image)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h
index 64dbfef4b73..4b2ddb9dd84 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/null/TextureNULL.h
@@ -64,12 +64,42 @@ class TextureNULL : public TextureImpl
const gl::Rectangle &sourceArea,
gl::Framebuffer *source) override;
+ angle::Result copyTexture(const gl::Context *context,
+ const gl::ImageIndex &index,
+ GLenum internalFormat,
+ GLenum type,
+ size_t sourceLevel,
+ bool unpackFlipY,
+ bool unpackPremultiplyAlpha,
+ bool unpackUnmultiplyAlpha,
+ const gl::Texture *source) override;
+ angle::Result copySubTexture(const gl::Context *context,
+ const gl::ImageIndex &index,
+ const gl::Offset &destOffset,
+ size_t sourceLevel,
+ const gl::Box &sourceBox,
+ bool unpackFlipY,
+ bool unpackPremultiplyAlpha,
+ bool unpackUnmultiplyAlpha,
+ const gl::Texture *source) override;
+
+ angle::Result copyCompressedTexture(const gl::Context *context,
+ const gl::Texture *source) override;
+
angle::Result setStorage(const gl::Context *context,
gl::TextureType type,
size_t levels,
GLenum internalFormat,
const gl::Extents &size) override;
+ angle::Result setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset) override;
+
angle::Result setEGLImageTarget(const gl::Context *context,
gl::TextureType type,
egl::Image *image) override;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp
index 4cbc899e4d6..7ca97537fa7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.cpp
@@ -608,4 +608,32 @@ angle::Result GetVertexRangeInfo(const gl::Context *context,
}
return angle::Result::Continue;
}
+
+gl::Rectangle ClipRectToScissor(const gl::State &glState, const gl::Rectangle &rect, bool invertY)
+{
+ if (glState.isScissorTestEnabled())
+ {
+ gl::Rectangle clippedRect;
+ if (!gl::ClipRectangle(glState.getScissor(), rect, &clippedRect))
+ {
+ return gl::Rectangle();
+ }
+
+ if (invertY)
+ {
+ clippedRect.y = rect.height - clippedRect.y - clippedRect.height;
+ }
+
+ return clippedRect;
+ }
+
+ // If the scissor test isn't enabled, assume it has infinite size. Its intersection with the
+ // rect would be the rect itself.
+ //
+ // Note that on Vulkan, returning this (as opposed to a fixed max-int-sized rect) could lead to
+ // unnecessary pipeline creations if two otherwise identical pipelines are used on framebuffers
+ // with different sizes. If such usage is observed in an application, we should investigate
+ // possible optimizations.
+ return rect;
+}
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h
index e7a4b8625ee..1025005b42d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/renderer_utils.h
@@ -28,6 +28,7 @@ namespace gl
{
struct FormatType;
struct InternalFormat;
+class State;
} // namespace gl
namespace egl
@@ -286,6 +287,8 @@ angle::Result GetVertexRangeInfo(const gl::Context *context,
GLint baseVertex,
GLint *startVertexOut,
size_t *vertexCountOut);
+
+gl::Rectangle ClipRectToScissor(const gl::State &glState, const gl::Rectangle &rect, bool invertY);
} // namespace rx
#endif // LIBANGLE_RENDERER_RENDERER_UTILS_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp
index 3d0389e519f..bd0385ef86d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/BufferVk.cpp
@@ -179,7 +179,7 @@ angle::Result BufferVk::getIndexRange(const gl::Context *context,
TRACE_EVENT0("gpu.angle", "BufferVk::getIndexRange");
// Needed before reading buffer or we could get stale data.
- ANGLE_TRY(renderer->finish(contextVk));
+ ANGLE_TRY(contextVk->finishImpl());
// TODO(jmadill): Consider keeping a shadow system memory copy in some cases.
ASSERT(mBuffer.valid());
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.cpp
index 5f6892b3d41..b9685b852e0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.cpp
@@ -25,14 +25,28 @@ namespace vk
{
namespace
{
+ANGLE_MAYBE_UNUSED
angle::Result InitAndBeginCommandBuffer(vk::Context *context,
const CommandPool &commandPool,
const VkCommandBufferInheritanceInfo &inheritanceInfo,
VkCommandBufferUsageFlags flags,
- CommandBuffer *commandBuffer)
+ angle::PoolAllocator *poolAllocator,
+ priv::SecondaryCommandBuffer *commandBuffer)
{
ASSERT(!commandBuffer->valid());
+ commandBuffer->initialize(poolAllocator);
+ return angle::Result::Continue;
+}
+ANGLE_MAYBE_UNUSED
+angle::Result InitAndBeginCommandBuffer(vk::Context *context,
+ const CommandPool &commandPool,
+ const VkCommandBufferInheritanceInfo &inheritanceInfo,
+ VkCommandBufferUsageFlags flags,
+ angle::PoolAllocator *poolAllocator,
+ PrimaryCommandBuffer *commandBuffer)
+{
+ ASSERT(!commandBuffer->valid());
VkCommandBufferAllocateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
createInfo.commandPool = commandPool.getHandle();
@@ -124,6 +138,36 @@ void MakeDebugUtilsLabel(GLenum source, const char *marker, VkDebugUtilsLabelEXT
kLabelColors[colorIndex].writeData(label->color);
}
+constexpr VkSubpassContents kRenderPassContents =
+ CommandBuffer::ExecutesInline() ? VK_SUBPASS_CONTENTS_INLINE
+ : VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS;
+
+// Helpers to unify executeCommands call based on underlying cmd buffer type
+ANGLE_MAYBE_UNUSED
+void ExecuteCommands(PrimaryCommandBuffer *primCmdBuffer,
+ priv::SecondaryCommandBuffer *secCmdBuffer)
+{
+ secCmdBuffer->executeCommands(primCmdBuffer->getHandle());
+}
+
+ANGLE_MAYBE_UNUSED
+void ExecuteCommands(PrimaryCommandBuffer *primCmdBuffer, priv::CommandBuffer *secCmdBuffer)
+{
+ primCmdBuffer->executeCommands(1, secCmdBuffer);
+}
+
+ANGLE_MAYBE_UNUSED
+std::string DumpCommands(const priv::SecondaryCommandBuffer &commandBuffer, const char *separator)
+{
+ return commandBuffer.dumpCommands(separator);
+}
+
+ANGLE_MAYBE_UNUSED
+std::string DumpCommands(const priv::CommandBuffer &commandBuffer, const char *separator)
+{
+ return "--blob--";
+}
+
} // anonymous namespace
// CommandGraphResource implementation.
@@ -164,18 +208,14 @@ angle::Result CommandGraphResource::recordCommands(Context *context,
return angle::Result::Continue;
}
-const gl::Rectangle &CommandGraphResource::getRenderPassRenderArea() const
-{
- ASSERT(hasStartedRenderPass());
- return mCurrentWritingNode->getRenderPassRenderArea();
-}
-
-angle::Result CommandGraphResource::beginRenderPass(ContextVk *contextVk,
- const Framebuffer &framebuffer,
- const gl::Rectangle &renderArea,
- const RenderPassDesc &renderPassDesc,
- const std::vector<VkClearValue> &clearValues,
- CommandBuffer **commandBufferOut)
+angle::Result CommandGraphResource::beginRenderPass(
+ ContextVk *contextVk,
+ const Framebuffer &framebuffer,
+ const gl::Rectangle &renderArea,
+ const RenderPassDesc &renderPassDesc,
+ const AttachmentOpsArray &renderPassAttachmentOps,
+ const std::vector<VkClearValue> &clearValues,
+ CommandBuffer **commandBufferOut)
{
// If a barrier has been inserted in the meantime, stop the command buffer.
if (!hasChildlessWritingNode())
@@ -183,9 +223,8 @@ angle::Result CommandGraphResource::beginRenderPass(ContextVk *contextVk,
startNewCommands(contextVk->getRenderer());
}
- // Hard-code RenderPass to clear the first render target to the current clear value.
- // TODO(jmadill): Proper clear value implementation. http://anglebug.com/2361
- mCurrentWritingNode->storeRenderPassInfo(framebuffer, renderArea, renderPassDesc, clearValues);
+ mCurrentWritingNode->storeRenderPassInfo(framebuffer, renderArea, renderPassDesc,
+ renderPassAttachmentOps, clearValues);
mCurrentWritingNode->setCommandBufferOwner(contextVk);
@@ -251,9 +290,11 @@ void CommandGraphResource::onWriteImpl(CommandGraphNode *writingNode, Serial cur
}
// CommandGraphNode implementation.
-CommandGraphNode::CommandGraphNode(CommandGraphNodeFunction function)
+CommandGraphNode::CommandGraphNode(CommandGraphNodeFunction function,
+ angle::PoolAllocator *poolAllocator)
: mRenderPassClearValues{},
mFunction(function),
+ mPoolAllocator(poolAllocator),
mQueryPool(VK_NULL_HANDLE),
mQueryIndex(0),
mFenceSyncEvent(VK_NULL_HANDLE),
@@ -267,18 +308,11 @@ CommandGraphNode::CommandGraphNode(CommandGraphNodeFunction function)
CommandGraphNode::~CommandGraphNode()
{
mRenderPassFramebuffer.setHandle(VK_NULL_HANDLE);
-
// Command buffers are managed by the command pool, so don't need to be freed.
mOutsideRenderPassCommands.releaseHandle();
mInsideRenderPassCommands.releaseHandle();
}
-CommandBuffer *CommandGraphNode::getOutsideRenderPassCommands()
-{
- ASSERT(!mHasChildren);
- return &mOutsideRenderPassCommands;
-}
-
angle::Result CommandGraphNode::beginOutsideRenderPassRecording(Context *context,
const CommandPool &commandPool,
CommandBuffer **commandsOut)
@@ -291,11 +325,11 @@ angle::Result CommandGraphNode::beginOutsideRenderPassRecording(Context *context
inheritanceInfo.subpass = 0;
inheritanceInfo.framebuffer = VK_NULL_HANDLE;
inheritanceInfo.occlusionQueryEnable =
- context->getRenderer()->getPhysicalDeviceFeatures().inheritedQueries;
+ CommandBuffer::SupportsQueries(context->getRenderer()->getPhysicalDeviceFeatures());
inheritanceInfo.queryFlags = 0;
inheritanceInfo.pipelineStatistics = 0;
- ANGLE_TRY(InitAndBeginCommandBuffer(context, commandPool, inheritanceInfo, 0,
+ ANGLE_TRY(InitAndBeginCommandBuffer(context, commandPool, inheritanceInfo, 0, mPoolAllocator,
&mOutsideRenderPassCommands));
*commandsOut = &mOutsideRenderPassCommands;
@@ -319,13 +353,14 @@ angle::Result CommandGraphNode::beginInsideRenderPassRecording(Context *context,
inheritanceInfo.subpass = 0;
inheritanceInfo.framebuffer = mRenderPassFramebuffer.getHandle();
inheritanceInfo.occlusionQueryEnable =
- context->getRenderer()->getPhysicalDeviceFeatures().inheritedQueries;
+ CommandBuffer::SupportsQueries(context->getRenderer()->getPhysicalDeviceFeatures());
inheritanceInfo.queryFlags = 0;
inheritanceInfo.pipelineStatistics = 0;
- ANGLE_TRY(InitAndBeginCommandBuffer(
- context, context->getRenderer()->getCommandPool(), inheritanceInfo,
- VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, &mInsideRenderPassCommands));
+ ANGLE_TRY(InitAndBeginCommandBuffer(context, context->getRenderer()->getCommandPool(),
+ inheritanceInfo,
+ VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,
+ mPoolAllocator, &mInsideRenderPassCommands));
*commandsOut = &mInsideRenderPassCommands;
return angle::Result::Continue;
@@ -334,9 +369,11 @@ angle::Result CommandGraphNode::beginInsideRenderPassRecording(Context *context,
void CommandGraphNode::storeRenderPassInfo(const Framebuffer &framebuffer,
const gl::Rectangle renderArea,
const vk::RenderPassDesc &renderPassDesc,
+ const AttachmentOpsArray &renderPassAttachmentOps,
const std::vector<VkClearValue> &clearValues)
{
- mRenderPassDesc = renderPassDesc;
+ mRenderPassDesc = renderPassDesc;
+ mRenderPassAttachmentOps = renderPassAttachmentOps;
mRenderPassFramebuffer.setHandle(framebuffer.getHandle());
mRenderPassRenderArea = renderArea;
std::copy(clearValues.begin(), clearValues.end(), mRenderPassClearValues.begin());
@@ -437,7 +474,7 @@ void CommandGraphNode::visitParents(std::vector<CommandGraphNode *> *stack)
angle::Result CommandGraphNode::visitAndExecute(vk::Context *context,
Serial serial,
RenderPassCache *renderPassCache,
- CommandBuffer *primaryCommandBuffer)
+ PrimaryCommandBuffer *primaryCommandBuffer)
{
switch (mFunction)
{
@@ -462,16 +499,16 @@ angle::Result CommandGraphNode::visitAndExecute(vk::Context *context,
if (mOutsideRenderPassCommands.valid())
{
ANGLE_VK_TRY(context, mOutsideRenderPassCommands.end());
- primaryCommandBuffer->executeCommands(1, &mOutsideRenderPassCommands);
+ ExecuteCommands(primaryCommandBuffer, &mOutsideRenderPassCommands);
}
if (mInsideRenderPassCommands.valid())
{
- // Pull a compatible RenderPass from the cache.
- // TODO(jmadill): Insert real ops and layout transitions.
+ // Pull a RenderPass from the cache.
+ // TODO(jmadill): Insert layout transitions.
RenderPass *renderPass = nullptr;
- ANGLE_TRY(renderPassCache->getCompatibleRenderPass(context, serial, mRenderPassDesc,
- &renderPass));
+ ANGLE_TRY(renderPassCache->getRenderPassWithOps(
+ context, serial, mRenderPassDesc, mRenderPassAttachmentOps, &renderPass));
ANGLE_VK_TRY(context, mInsideRenderPassCommands.end());
@@ -488,9 +525,8 @@ angle::Result CommandGraphNode::visitAndExecute(vk::Context *context,
beginInfo.clearValueCount = mRenderPassDesc.attachmentCount();
beginInfo.pClearValues = mRenderPassClearValues.data();
- primaryCommandBuffer->beginRenderPass(
- beginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
- primaryCommandBuffer->executeCommands(1, &mInsideRenderPassCommands);
+ primaryCommandBuffer->beginRenderPass(beginInfo, kRenderPassContents);
+ ExecuteCommands(primaryCommandBuffer, &mInsideRenderPassCommands);
primaryCommandBuffer->endRenderPass();
}
break;
@@ -594,15 +630,33 @@ void CommandGraphNode::setDiagnosticInfo(CommandGraphResourceType resourceType,
mResourceID = resourceID;
}
-const gl::Rectangle &CommandGraphNode::getRenderPassRenderArea() const
+std::string CommandGraphNode::dumpCommandsForDiagnostics(const char *separator) const
{
- return mRenderPassRenderArea;
+ std::string result;
+ if (mOutsideRenderPassCommands.valid())
+ {
+ result += separator;
+ result += "Outside RP:";
+ result += DumpCommands(mOutsideRenderPassCommands, separator);
+ }
+ if (mInsideRenderPassCommands.valid())
+ {
+ result += separator;
+ result += "Inside RP:";
+ result += DumpCommands(mInsideRenderPassCommands, separator);
+ }
+ return result;
}
// CommandGraph implementation.
-CommandGraph::CommandGraph(bool enableGraphDiagnostics)
- : mEnableGraphDiagnostics(enableGraphDiagnostics), mLastBarrierIndex(kInvalidNodeIndex)
-{}
+CommandGraph::CommandGraph(bool enableGraphDiagnostics, angle::PoolAllocator *poolAllocator)
+ : mEnableGraphDiagnostics(enableGraphDiagnostics),
+ mPoolAllocator(poolAllocator),
+ mLastBarrierIndex(kInvalidNodeIndex)
+{
+ // Push so that allocations made from here will be recycled in clear() below.
+ mPoolAllocator->push();
+}
CommandGraph::~CommandGraph()
{
@@ -612,16 +666,17 @@ CommandGraph::~CommandGraph()
CommandGraphNode *CommandGraph::allocateNode(CommandGraphNodeFunction function)
{
// TODO(jmadill): Use a pool allocator for the CPU node allocations.
- CommandGraphNode *newCommands = new CommandGraphNode(function);
+ CommandGraphNode *newCommands = new CommandGraphNode(function, mPoolAllocator);
mNodes.emplace_back(newCommands);
return newCommands;
}
-CommandGraphNode *CommandGraph::allocateBarrierNode(CommandGraphResourceType resourceType,
- CommandGraphNodeFunction function)
+CommandGraphNode *CommandGraph::allocateBarrierNode(CommandGraphNodeFunction function,
+ CommandGraphResourceType resourceType,
+ uintptr_t resourceID)
{
CommandGraphNode *newNode = allocateNode(function);
- newNode->setDiagnosticInfo(resourceType, 0);
+ newNode->setDiagnosticInfo(resourceType, resourceID);
setNewBarrier(newNode);
return newNode;
@@ -632,16 +687,16 @@ void CommandGraph::setNewBarrier(CommandGraphNode *newBarrier)
size_t previousBarrierIndex = 0;
CommandGraphNode *previousBarrier = getLastBarrierNode(&previousBarrierIndex);
- // Add a dependency from previousBarrier to all nodes in (previousBarrier, newBarrier].
+ // Add a dependency from previousBarrier to all nodes in (previousBarrier, newBarrier).
if (previousBarrier && previousBarrierIndex + 1 < mNodes.size())
{
- size_t afterNodesCount = mNodes.size() - (previousBarrierIndex + 1);
+ size_t afterNodesCount = mNodes.size() - (previousBarrierIndex + 2);
CommandGraphNode::SetHappensBeforeDependencies(
previousBarrier, &mNodes[previousBarrierIndex + 1], afterNodesCount);
}
- // Add a dependency from all nodes in (previousBarrier, newBarrier) to newBarrier.
- addDependenciesToNextBarrier(previousBarrierIndex + 1, mNodes.size() - 1, newBarrier);
+ // Add a dependency from all nodes in [previousBarrier, newBarrier) to newBarrier.
+ addDependenciesToNextBarrier(previousBarrierIndex, mNodes.size() - 1, newBarrier);
mLastBarrierIndex = mNodes.size() - 1;
}
@@ -650,7 +705,7 @@ angle::Result CommandGraph::submitCommands(Context *context,
Serial serial,
RenderPassCache *renderPassCache,
CommandPool *commandPool,
- CommandBuffer *primaryCommandBufferOut)
+ PrimaryCommandBuffer *primaryCommandBufferOut)
{
// There is no point in submitting an empty command buffer, so make sure not to call this
// function if there's nothing to do.
@@ -743,6 +798,12 @@ bool CommandGraph::empty() const
void CommandGraph::clear()
{
mLastBarrierIndex = kInvalidNodeIndex;
+ // Release cmd graph pool memory now that cmds are submitted
+ // NOTE: This frees all memory since last push. Right now only the CommandGraph
+ // will push the allocator (at creation and below). If other people start
+ // pushing the allocator this (and/or the allocator) will need to be updated.
+ mPoolAllocator->pop();
+ mPoolAllocator->push();
// TODO(jmadill): Use pool allocator for performance. http://anglebug.com/2951
for (CommandGraphNode *node : mNodes)
@@ -754,65 +815,68 @@ void CommandGraph::clear()
void CommandGraph::beginQuery(const QueryPool *queryPool, uint32_t queryIndex)
{
- CommandGraphNode *newNode =
- allocateBarrierNode(CommandGraphResourceType::Query, CommandGraphNodeFunction::BeginQuery);
+ CommandGraphNode *newNode = allocateBarrierNode(CommandGraphNodeFunction::BeginQuery,
+ CommandGraphResourceType::Query, 0);
newNode->setQueryPool(queryPool, queryIndex);
}
void CommandGraph::endQuery(const QueryPool *queryPool, uint32_t queryIndex)
{
CommandGraphNode *newNode =
- allocateBarrierNode(CommandGraphResourceType::Query, CommandGraphNodeFunction::EndQuery);
+ allocateBarrierNode(CommandGraphNodeFunction::EndQuery, CommandGraphResourceType::Query, 0);
newNode->setQueryPool(queryPool, queryIndex);
}
void CommandGraph::writeTimestamp(const QueryPool *queryPool, uint32_t queryIndex)
{
- CommandGraphNode *newNode = allocateBarrierNode(CommandGraphResourceType::Query,
- CommandGraphNodeFunction::WriteTimestamp);
+ CommandGraphNode *newNode = allocateBarrierNode(CommandGraphNodeFunction::WriteTimestamp,
+ CommandGraphResourceType::Query, 0);
newNode->setQueryPool(queryPool, queryIndex);
}
void CommandGraph::setFenceSync(const vk::Event &event)
{
- CommandGraphNode *newNode = allocateBarrierNode(CommandGraphResourceType::FenceSync,
- CommandGraphNodeFunction::SetFenceSync);
+ CommandGraphNode *newNode = allocateBarrierNode(CommandGraphNodeFunction::SetFenceSync,
+ CommandGraphResourceType::FenceSync,
+ reinterpret_cast<uintptr_t>(&event));
newNode->setFenceSync(event);
}
void CommandGraph::waitFenceSync(const vk::Event &event)
{
- CommandGraphNode *newNode = allocateBarrierNode(CommandGraphResourceType::FenceSync,
- CommandGraphNodeFunction::WaitFenceSync);
+ CommandGraphNode *newNode = allocateBarrierNode(CommandGraphNodeFunction::WaitFenceSync,
+ CommandGraphResourceType::FenceSync,
+ reinterpret_cast<uintptr_t>(&event));
newNode->setFenceSync(event);
}
void CommandGraph::insertDebugMarker(GLenum source, std::string &&marker)
{
- CommandGraphNode *newNode = allocateBarrierNode(CommandGraphResourceType::DebugMarker,
- CommandGraphNodeFunction::InsertDebugMarker);
+ CommandGraphNode *newNode = allocateBarrierNode(CommandGraphNodeFunction::InsertDebugMarker,
+ CommandGraphResourceType::DebugMarker, 0);
newNode->setDebugMarker(source, std::move(marker));
}
void CommandGraph::pushDebugMarker(GLenum source, std::string &&marker)
{
- CommandGraphNode *newNode = allocateBarrierNode(CommandGraphResourceType::DebugMarker,
- CommandGraphNodeFunction::PushDebugMarker);
+ CommandGraphNode *newNode = allocateBarrierNode(CommandGraphNodeFunction::PushDebugMarker,
+ CommandGraphResourceType::DebugMarker, 0);
newNode->setDebugMarker(source, std::move(marker));
}
void CommandGraph::popDebugMarker()
{
- allocateBarrierNode(CommandGraphResourceType::DebugMarker,
- CommandGraphNodeFunction::PopDebugMarker);
+ allocateBarrierNode(CommandGraphNodeFunction::PopDebugMarker,
+ CommandGraphResourceType::DebugMarker, 0);
}
// Dumps the command graph into a dot file that works with graphviz.
void CommandGraph::dumpGraphDotFile(std::ostream &out) const
{
- // This ID maps a node pointer to a monatonic ID. It allows us to look up parent node IDs.
+ // This ID maps a node pointer to a monotonic ID. It allows us to look up parent node IDs.
std::map<const CommandGraphNode *, int> nodeIDMap;
std::map<uintptr_t, int> objectIDMap;
+ std::map<std::pair<VkQueryPool, uint32_t>, int> queryIDMap;
// Map nodes to ids.
for (size_t nodeIndex = 0; nodeIndex < mNodes.size(); ++nodeIndex)
@@ -825,6 +889,7 @@ void CommandGraph::dumpGraphDotFile(std::ostream &out) const
int framebufferIDCounter = 1;
int imageIDCounter = 1;
int queryIDCounter = 1;
+ int fenceIDCounter = 1;
out << "digraph {" << std::endl;
@@ -843,6 +908,29 @@ void CommandGraph::dumpGraphDotFile(std::ostream &out) const
strstr << " " << node->getDebugMarker();
}
}
+ else if (node->getResourceTypeForDiagnostics() == CommandGraphResourceType::Query)
+ {
+ // Special case for queries as they cannot generate a resource ID at creation time that
+ // would reliably fit in a uintptr_t.
+ strstr << " ";
+
+ ASSERT(node->getResourceIDForDiagnostics() == 0);
+
+ auto queryID = std::make_pair(node->getQueryPool(), node->getQueryIndex());
+
+ auto it = queryIDMap.find(queryID);
+ if (it != queryIDMap.end())
+ {
+ strstr << it->second;
+ }
+ else
+ {
+ int id = queryIDCounter++;
+
+ queryIDMap[queryID] = id;
+ strstr << id;
+ }
+ }
else
{
strstr << " ";
@@ -870,8 +958,8 @@ void CommandGraph::dumpGraphDotFile(std::ostream &out) const
case CommandGraphResourceType::Image:
id = imageIDCounter++;
break;
- case CommandGraphResourceType::Query:
- id = queryIDCounter++;
+ case CommandGraphResourceType::FenceSync:
+ id = fenceIDCounter++;
break;
default:
UNREACHABLE();
@@ -884,8 +972,8 @@ void CommandGraph::dumpGraphDotFile(std::ostream &out) const
}
const std::string &label = strstr.str();
- out << " " << nodeID << "[label =<" << label << "<BR/> <FONT POINT-SIZE=\"10\">Node ID "
- << nodeID << "</FONT>>];" << std::endl;
+ out << " " << nodeID << "[label =<" << label << "<BR/><FONT POINT-SIZE=\"10\">Node ID "
+ << nodeID << node->dumpCommandsForDiagnostics("<BR/>") << "</FONT>>];" << std::endl;
}
for (const CommandGraphNode *node : mNodes)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.h
index adf199335f2..811c9c3f09e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/CommandGraph.h
@@ -10,6 +10,7 @@
#ifndef LIBANGLE_RENDERER_VULKAN_COMMAND_GRAPH_H_
#define LIBANGLE_RENDERER_VULKAN_COMMAND_GRAPH_H_
+#include "libANGLE/renderer/vulkan/SecondaryCommandBuffer.h"
#include "libANGLE/renderer/vulkan/vk_cache_utils.h"
namespace rx
@@ -17,6 +18,7 @@ namespace rx
namespace vk
{
+
enum class VisitedState
{
Unvisited,
@@ -61,18 +63,22 @@ class CommandBufferOwner
ANGLE_INLINE void onCommandBufferFinished() { mCommandBuffer = nullptr; }
protected:
- vk::CommandBuffer *mCommandBuffer = nullptr;
+ CommandBuffer *mCommandBuffer = nullptr;
};
// Only used internally in the command graph. Kept in the header for better inlining performance.
class CommandGraphNode final : angle::NonCopyable
{
public:
- CommandGraphNode(CommandGraphNodeFunction function);
+ CommandGraphNode(CommandGraphNodeFunction function, angle::PoolAllocator *poolAllocator);
~CommandGraphNode();
// Immutable queries for when we're walking the commands tree.
- CommandBuffer *getOutsideRenderPassCommands();
+ CommandBuffer *getOutsideRenderPassCommands()
+ {
+ ASSERT(!mHasChildren);
+ return &mOutsideRenderPassCommands;
+ }
CommandBuffer *getInsideRenderPassCommands()
{
@@ -92,8 +98,27 @@ class CommandGraphNode final : angle::NonCopyable
void storeRenderPassInfo(const Framebuffer &framebuffer,
const gl::Rectangle renderArea,
const vk::RenderPassDesc &renderPassDesc,
+ const AttachmentOpsArray &renderPassAttachmentOps,
const std::vector<VkClearValue> &clearValues);
+ void clearRenderPassColorAttachment(size_t attachmentIndex, const VkClearColorValue &clearValue)
+ {
+ mRenderPassAttachmentOps[attachmentIndex].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ mRenderPassClearValues[attachmentIndex].color = clearValue;
+ }
+
+ void clearRenderPassDepthAttachment(size_t attachmentIndex, float depth)
+ {
+ mRenderPassAttachmentOps[attachmentIndex].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ mRenderPassClearValues[attachmentIndex].depthStencil.depth = depth;
+ }
+
+ void clearRenderPassStencilAttachment(size_t attachmentIndex, uint32_t stencil)
+ {
+ mRenderPassAttachmentOps[attachmentIndex].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ mRenderPassClearValues[attachmentIndex].depthStencil.stencil = stencil;
+ }
+
// Dependency commands order node execution in the command graph.
// Once a node has commands that must happen after it, recording is stopped and the node is
// frozen forever.
@@ -108,9 +133,11 @@ class CommandGraphNode final : angle::NonCopyable
static void SetHappensBeforeDependencies(CommandGraphNode **beforeNodes,
size_t beforeNodesCount,
CommandGraphNode *afterNode);
+
static void SetHappensBeforeDependencies(CommandGraphNode *beforeNode,
CommandGraphNode **afterNodes,
size_t afterNodesCount);
+
bool hasParents() const;
bool hasChildren() const { return mHasChildren; }
@@ -120,7 +147,7 @@ class CommandGraphNode final : angle::NonCopyable
angle::Result visitAndExecute(Context *context,
Serial serial,
RenderPassCache *renderPassCache,
- CommandBuffer *primaryCommandBuffer);
+ PrimaryCommandBuffer *primaryCommandBuffer);
// Only used in the command graph diagnostics.
const std::vector<CommandGraphNode *> &getParentsForDiagnostics() const;
@@ -128,12 +155,15 @@ class CommandGraphNode final : angle::NonCopyable
CommandGraphResourceType getResourceTypeForDiagnostics() const { return mResourceType; }
uintptr_t getResourceIDForDiagnostics() const { return mResourceID; }
+ std::string dumpCommandsForDiagnostics(const char *separator) const;
- const gl::Rectangle &getRenderPassRenderArea() const;
+ const gl::Rectangle &getRenderPassRenderArea() const { return mRenderPassRenderArea; }
CommandGraphNodeFunction getFunction() const { return mFunction; }
void setQueryPool(const QueryPool *queryPool, uint32_t queryIndex);
+ VkQueryPool getQueryPool() const { return mQueryPool; }
+ uint32_t getQueryIndex() const { return mQueryIndex; }
void setFenceSync(const vk::Event &event);
void setDebugMarker(GLenum source, std::string &&marker);
const std::string &getDebugMarker() const { return mDebugMarker; }
@@ -166,12 +196,13 @@ class CommandGraphNode final : angle::NonCopyable
// Only used if we need a RenderPass for these commands.
RenderPassDesc mRenderPassDesc;
+ AttachmentOpsArray mRenderPassAttachmentOps;
Framebuffer mRenderPassFramebuffer;
gl::Rectangle mRenderPassRenderArea;
gl::AttachmentArray<VkClearValue> mRenderPassClearValues;
CommandGraphNodeFunction mFunction;
-
+ angle::PoolAllocator *mPoolAllocator;
// Keep separate buffers for commands inside and outside a RenderPass.
// TODO(jmadill): We might not need inside and outside RenderPass commands separate.
CommandBuffer mOutsideRenderPassCommands;
@@ -257,28 +288,68 @@ class CommandGraphResource : angle::NonCopyable
const Framebuffer &framebuffer,
const gl::Rectangle &renderArea,
const RenderPassDesc &renderPassDesc,
+ const AttachmentOpsArray &renderPassAttachmentOps,
const std::vector<VkClearValue> &clearValues,
CommandBuffer **commandBufferOut);
- // Checks if we're in a RenderPass, returning true if so. Updates serial internally.
- // Returns the started command buffer in commandBufferOut.
+ // Checks if we're in a RenderPass without children.
+ bool hasStartedRenderPass() const
+ {
+ return hasChildlessWritingNode() &&
+ mCurrentWritingNode->getInsideRenderPassCommands()->valid();
+ }
+
+ // Checks if we're in a RenderPass that encompasses renderArea, returning true if so. Updates
+ // serial internally. Returns the started command buffer in commandBufferOut.
ANGLE_INLINE bool appendToStartedRenderPass(Serial currentQueueSerial,
+ const gl::Rectangle &renderArea,
CommandBuffer **commandBufferOut)
{
updateQueueSerial(currentQueueSerial);
if (hasStartedRenderPass())
{
- *commandBufferOut = mCurrentWritingNode->getInsideRenderPassCommands();
- return true;
- }
- else
- {
- return false;
+ if (mCurrentWritingNode->getRenderPassRenderArea().encloses(renderArea))
+ {
+ *commandBufferOut = mCurrentWritingNode->getInsideRenderPassCommands();
+ return true;
+ }
}
+
+ return false;
+ }
+
+ // Returns true if the render pass is started, but there are no commands yet recorded in it.
+ // This is useful to know if the render pass ops can be modified.
+ bool renderPassStartedButEmpty() const
+ {
+ return hasStartedRenderPass() &&
+ mCurrentWritingNode->getInsideRenderPassCommands()->empty();
+ }
+
+ void clearRenderPassColorAttachment(size_t attachmentIndex, const VkClearColorValue &clearValue)
+ {
+ ASSERT(renderPassStartedButEmpty());
+ mCurrentWritingNode->clearRenderPassColorAttachment(attachmentIndex, clearValue);
+ }
+
+ void clearRenderPassDepthAttachment(size_t attachmentIndex, float depth)
+ {
+ ASSERT(renderPassStartedButEmpty());
+ mCurrentWritingNode->clearRenderPassDepthAttachment(attachmentIndex, depth);
+ }
+
+ void clearRenderPassStencilAttachment(size_t attachmentIndex, uint32_t stencil)
+ {
+ ASSERT(renderPassStartedButEmpty());
+ mCurrentWritingNode->clearRenderPassStencilAttachment(attachmentIndex, stencil);
}
// Accessor for RenderPass RenderArea.
- const gl::Rectangle &getRenderPassRenderArea() const;
+ const gl::Rectangle &getRenderPassRenderArea() const
+ {
+ ASSERT(hasStartedRenderPass());
+ return mCurrentWritingNode->getRenderPassRenderArea();
+ }
// Called when 'this' object changes, but we'd like to start a new command buffer later.
void finishCurrentCommands(RendererVk *renderer);
@@ -307,13 +378,6 @@ class CommandGraphResource : angle::NonCopyable
return (mCurrentWritingNode != nullptr && !mCurrentWritingNode->hasChildren());
}
- // Checks if we're in a RenderPass without children.
- bool hasStartedRenderPass() const
- {
- return hasChildlessWritingNode() &&
- mCurrentWritingNode->getInsideRenderPassCommands()->valid();
- }
-
void startNewCommands(RendererVk *renderer);
void onWriteImpl(CommandGraphNode *writingNode, Serial currentSerial);
@@ -338,13 +402,13 @@ class CommandGraphResource : angle::NonCopyable
// ANGLE's CommandGraph (and CommandGraphNode) attempt to solve these problems using deferred
// command submission. We also sometimes call this command re-ordering. A brief summary:
//
-// During GL command processing, we record Vulkan commands into secondary command buffers, which
+// During GL command processing, we record Vulkan commands into SecondaryCommandBuffers, which
// are stored in CommandGraphNodes, and these nodes are chained together via dependencies to
-// for a directed acyclic CommandGraph. When we need to submit the CommandGraph, say during a
+// form a directed acyclic CommandGraph. When we need to submit the CommandGraph, say during a
// SwapBuffers or ReadPixels call, we begin a primary Vulkan CommandBuffer, and walk the
-// CommandGraph, starting at the most senior nodes, recording secondary CommandBuffers inside
+// CommandGraph, starting at the most senior nodes, recording SecondaryCommandBuffers inside
// and outside RenderPasses as necessary, filled with the right load/store operations. Once
-// the primary CommandBuffer has recorded all of the secondary CommandBuffers from all the open
+// the primary CommandBuffer has recorded all of the SecondaryCommandBuffers from all the open
// CommandGraphNodes, we submit the primary CommandBuffer to the VkQueue on the device.
//
// The Command Graph consists of an array of open Command Graph Nodes. It supports allocating new
@@ -353,7 +417,7 @@ class CommandGraphResource : angle::NonCopyable
class CommandGraph final : angle::NonCopyable
{
public:
- explicit CommandGraph(bool enableGraphDiagnostics);
+ explicit CommandGraph(bool enableGraphDiagnostics, angle::PoolAllocator *poolAllocator);
~CommandGraph();
// Allocates a new CommandGraphNode and adds it to the list of current open nodes. No ordering
@@ -366,7 +430,7 @@ class CommandGraph final : angle::NonCopyable
Serial serial,
RenderPassCache *renderPassCache,
CommandPool *commandPool,
- CommandBuffer *primaryCommandBufferOut);
+ PrimaryCommandBuffer *primaryCommandBufferOut);
bool empty() const;
void clear();
@@ -384,8 +448,9 @@ class CommandGraph final : angle::NonCopyable
void popDebugMarker();
private:
- CommandGraphNode *allocateBarrierNode(CommandGraphResourceType resourceType,
- CommandGraphNodeFunction function);
+ CommandGraphNode *allocateBarrierNode(CommandGraphNodeFunction function,
+ CommandGraphResourceType resourceType,
+ uintptr_t resourceID);
void setNewBarrier(CommandGraphNode *newBarrier);
CommandGraphNode *getLastBarrierNode(size_t *indexOut);
void addDependenciesToNextBarrier(size_t begin, size_t end, CommandGraphNode *nextBarrier);
@@ -394,6 +459,7 @@ class CommandGraph final : angle::NonCopyable
std::vector<CommandGraphNode *> mNodes;
bool mEnableGraphDiagnostics;
+ angle::PoolAllocator *mPoolAllocator;
// A set of nodes (eventually) exist that act as barriers to guarantee submission order. For
// example, a glMemoryBarrier() calls would lead to such a barrier or beginning and ending a
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp
index c2ab5fb003c..a383f6a2f39 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -20,6 +20,7 @@
#include "libANGLE/renderer/vulkan/CompilerVk.h"
#include "libANGLE/renderer/vulkan/FenceNVVk.h"
#include "libANGLE/renderer/vulkan/FramebufferVk.h"
+#include "libANGLE/renderer/vulkan/MemoryObjectVk.h"
#include "libANGLE/renderer/vulkan/ProgramPipelineVk.h"
#include "libANGLE/renderer/vulkan/ProgramVk.h"
#include "libANGLE/renderer/vulkan/QueryVk.h"
@@ -27,6 +28,7 @@
#include "libANGLE/renderer/vulkan/RendererVk.h"
#include "libANGLE/renderer/vulkan/SamplerVk.h"
#include "libANGLE/renderer/vulkan/ShaderVk.h"
+#include "libANGLE/renderer/vulkan/SurfaceVk.h"
#include "libANGLE/renderer/vulkan/SyncVk.h"
#include "libANGLE/renderer/vulkan/TextureVk.h"
#include "libANGLE/renderer/vulkan/TransformFeedbackVk.h"
@@ -72,6 +74,7 @@ ContextVk::ContextVk(const gl::State &state, gl::ErrorSet *errorSet, RendererVk
vk::Context(renderer),
mCurrentPipeline(nullptr),
mCurrentDrawMode(gl::PrimitiveMode::InvalidEnum),
+ mCurrentWindowSurface(nullptr),
mVertexArray(nullptr),
mDrawFramebuffer(nullptr),
mProgram(nullptr),
@@ -116,6 +119,9 @@ ContextVk::~ContextVk() = default;
void ContextVk::onDestroy(const gl::Context *context)
{
+ // Force a flush on destroy.
+ (void)finishImpl();
+
mDriverUniformsSetLayout.reset();
mIncompleteTextures.onDestroy(context);
mDriverUniformsBuffer.destroy(getDevice());
@@ -187,12 +193,38 @@ angle::Result ContextVk::initialize()
angle::Result ContextVk::flush(const gl::Context *context)
{
- return mRenderer->flush(this);
+ return flushImpl();
+}
+
+angle::Result ContextVk::flushImpl()
+{
+ const vk::Semaphore *waitSemaphore = nullptr;
+ const vk::Semaphore *signalSemaphore = nullptr;
+ if (mCurrentWindowSurface && !mRenderer->getCommandGraph()->empty())
+ {
+ ANGLE_TRY(mCurrentWindowSurface->generateSemaphoresForFlush(this, &waitSemaphore,
+ &signalSemaphore));
+ }
+
+ return mRenderer->flush(this, waitSemaphore, signalSemaphore);
}
angle::Result ContextVk::finish(const gl::Context *context)
{
- return mRenderer->finish(this);
+ return finishImpl();
+}
+
+angle::Result ContextVk::finishImpl()
+{
+ const vk::Semaphore *waitSemaphore = nullptr;
+ const vk::Semaphore *signalSemaphore = nullptr;
+ if (mCurrentWindowSurface && !mRenderer->getCommandGraph()->empty())
+ {
+ ANGLE_TRY(mCurrentWindowSurface->generateSemaphoresForFlush(this, &waitSemaphore,
+ &signalSemaphore));
+ }
+
+ return mRenderer->finish(this, waitSemaphore, signalSemaphore);
}
angle::Result ContextVk::setupDraw(const gl::Context *context,
@@ -228,10 +260,13 @@ angle::Result ContextVk::setupDraw(const gl::Context *context,
if (!mCommandBuffer)
{
mDirtyBits |= mNewCommandBufferDirtyBits;
+
+ gl::Rectangle scissoredRenderArea = mDrawFramebuffer->getScissoredRenderArea(this);
if (!mDrawFramebuffer->appendToStartedRenderPass(mRenderer->getCurrentQueueSerial(),
- &mCommandBuffer))
+ scissoredRenderArea, &mCommandBuffer))
{
- ANGLE_TRY(mDrawFramebuffer->startNewRenderPass(this, &mCommandBuffer));
+ ANGLE_TRY(
+ mDrawFramebuffer->startNewRenderPass(this, scissoredRenderArea, &mCommandBuffer));
}
}
@@ -366,9 +401,7 @@ angle::Result ContextVk::handleDirtyPipeline(const gl::Context *context,
mGraphicsPipelineTransition.reset();
}
-
- commandBuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, mCurrentPipeline->getPipeline());
-
+ commandBuffer->bindGraphicsPipeline(mCurrentPipeline->getPipeline());
// Update the queue serial for the pipeline object.
ASSERT(mCurrentPipeline && mCurrentPipeline->valid());
mCurrentPipeline->updateSerial(mRenderer->getCurrentQueueSerial());
@@ -419,7 +452,7 @@ angle::Result ContextVk::handleDirtyIndexBuffer(const gl::Context *context,
vk::BufferHelper *elementArrayBuffer = mVertexArray->getCurrentElementArrayBuffer();
ASSERT(elementArrayBuffer != nullptr);
- commandBuffer->bindIndexBuffer(elementArrayBuffer->getBuffer().getHandle(),
+ commandBuffer->bindIndexBuffer(elementArrayBuffer->getBuffer(),
mVertexArray->getCurrentElementArrayBufferOffset(),
gl_vk::kIndexTypeMap[mCurrentDrawElementsType]);
@@ -435,9 +468,9 @@ angle::Result ContextVk::handleDirtyDescriptorSets(const gl::Context *context,
ANGLE_TRY(mProgram->updateDescriptorSets(this, commandBuffer));
// Bind the graphics descriptor sets.
- commandBuffer->bindDescriptorSets(
- VK_PIPELINE_BIND_POINT_GRAPHICS, mProgram->getPipelineLayout(),
- kDriverUniformsDescriptorSetIndex, 1, &mDriverUniformsDescriptorSet, 0, nullptr);
+ commandBuffer->bindGraphicsDescriptorSets(mProgram->getPipelineLayout(),
+ kDriverUniformsDescriptorSetIndex, 1,
+ &mDriverUniformsDescriptorSet, 0, nullptr);
return angle::Result::Continue;
}
@@ -459,7 +492,7 @@ angle::Result ContextVk::drawArrays(const gl::Context *context,
{
ANGLE_TRY(setupDraw(context, mode, first, count, 1, gl::DrawElementsType::InvalidEnum,
nullptr, mNonIndexedDirtyBitsMask, &commandBuffer));
- commandBuffer->draw(clampedVertexCount, 1, first, 0);
+ commandBuffer->draw(clampedVertexCount, first);
}
return angle::Result::Continue;
@@ -481,7 +514,7 @@ angle::Result ContextVk::drawArraysInstanced(const gl::Context *context,
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(setupDraw(context, mode, first, count, instances, gl::DrawElementsType::InvalidEnum,
nullptr, mNonIndexedDirtyBitsMask, &commandBuffer));
- commandBuffer->draw(gl::GetClampedVertexCount<uint32_t>(count), instances, first, 0);
+ commandBuffer->drawInstanced(gl::GetClampedVertexCount<uint32_t>(count), instances, first);
return angle::Result::Continue;
}
@@ -500,7 +533,7 @@ angle::Result ContextVk::drawElements(const gl::Context *context,
else
{
ANGLE_TRY(setupIndexedDraw(context, mode, count, 1, type, indices, &commandBuffer));
- commandBuffer->drawIndexed(count, 1, 0, 0, 0);
+ commandBuffer->drawIndexed(count);
}
return angle::Result::Continue;
@@ -522,7 +555,7 @@ angle::Result ContextVk::drawElementsInstanced(const gl::Context *context,
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(setupIndexedDraw(context, mode, count, instances, type, indices, &commandBuffer));
- commandBuffer->drawIndexed(count, instances, 0, 0, 0);
+ commandBuffer->drawIndexedInstanced(count, instances);
return angle::Result::Continue;
}
@@ -560,17 +593,17 @@ angle::Result ContextVk::drawElementsIndirect(const gl::Context *context,
return angle::Result::Stop;
}
-GLenum ContextVk::getResetStatus()
+gl::GraphicsResetStatus ContextVk::getResetStatus()
{
if (mRenderer->isDeviceLost())
{
// TODO(geofflang): It may be possible to track which context caused the device lost and
// return either GL_GUILTY_CONTEXT_RESET or GL_INNOCENT_CONTEXT_RESET.
// http://anglebug.com/2787
- return GL_UNKNOWN_CONTEXT_RESET;
+ return gl::GraphicsResetStatus::UnknownContextReset;
}
- return GL_NO_ERROR;
+ return gl::GraphicsResetStatus::NoError;
}
std::string ContextVk::getVendorString() const
@@ -655,13 +688,12 @@ void ContextVk::updateDepthRange(float nearPlane, float farPlane)
void ContextVk::updateScissor(const gl::State &glState)
{
- FramebufferVk *framebufferVk = vk::GetImpl(glState.getDrawFramebuffer());
- gl::Box dimensions = framebufferVk->getState().getDimensions();
- gl::Rectangle renderArea(0, 0, dimensions.width, dimensions.height);
-
- VkRect2D scissor;
- gl_vk::GetScissor(glState, isViewportFlipEnabledForDrawFBO(), renderArea, &scissor);
+ FramebufferVk *framebufferVk = vk::GetImpl(glState.getDrawFramebuffer());
+ gl::Rectangle scissoredRenderArea = framebufferVk->getScissoredRenderArea(this);
+ VkRect2D scissor = gl_vk::GetRect(scissoredRenderArea);
mGraphicsPipelineDesc->updateScissor(&mGraphicsPipelineTransition, scissor);
+
+ framebufferVk->onScissorChange(this);
}
angle::Result ContextVk::syncState(const gl::Context *context,
@@ -958,6 +990,15 @@ angle::Result ContextVk::onMakeCurrent(const gl::Context *context)
drawSurface != nullptr && mRenderer->getFeatures().flipViewportY &&
!IsMaskFlagSet(drawSurface->getOrientation(), EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE);
+ if (drawSurface && drawSurface->getType() == EGL_WINDOW_BIT)
+ {
+ mCurrentWindowSurface = GetImplAs<WindowSurfaceVk>(drawSurface);
+ }
+ else
+ {
+ mCurrentWindowSurface = nullptr;
+ }
+
const gl::State &glState = context->getState();
updateFlipViewportDrawFramebuffer(glState);
updateFlipViewportReadFramebuffer(glState);
@@ -1074,6 +1115,11 @@ std::vector<PathImpl *> ContextVk::createPaths(GLsizei)
return std::vector<PathImpl *>();
}
+MemoryObjectImpl *ContextVk::createMemoryObject()
+{
+ return new MemoryObjectVk();
+}
+
void ContextVk::invalidateCurrentTextures()
{
ASSERT(mProgram);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h
index 09d651ffc4b..c56266d3d99 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ContextVk.h
@@ -25,6 +25,7 @@ struct FeaturesVk;
namespace rx
{
class RendererVk;
+class WindowSurfaceVk;
class ContextVk : public ContextImpl, public vk::Context, public vk::CommandBufferOwner
{
@@ -38,7 +39,9 @@ class ContextVk : public ContextImpl, public vk::Context, public vk::CommandBuff
// Flush and finish.
angle::Result flush(const gl::Context *context) override;
+ angle::Result flushImpl();
angle::Result finish(const gl::Context *context) override;
+ angle::Result finishImpl();
// Drawing methods.
angle::Result drawArrays(const gl::Context *context,
@@ -78,7 +81,7 @@ class ContextVk : public ContextImpl, public vk::Context, public vk::CommandBuff
const void *indirect) override;
// Device loss
- GLenum getResetStatus() override;
+ gl::GraphicsResetStatus getResetStatus() override;
// Vendor and description strings.
std::string getVendorString() const override;
@@ -152,6 +155,9 @@ class ContextVk : public ContextImpl, public vk::Context, public vk::CommandBuff
// Path object creation
std::vector<PathImpl *> createPaths(GLsizei) override;
+ // Memory object creation.
+ MemoryObjectImpl *createMemoryObject() override;
+
angle::Result dispatchCompute(const gl::Context *context,
GLuint numGroupsX,
GLuint numGroupsY,
@@ -167,6 +173,8 @@ class ContextVk : public ContextImpl, public vk::Context, public vk::CommandBuff
ANGLE_INLINE void invalidateVertexAndIndexBuffers()
{
+ // TODO: Make the pipeline invalidate more fine-grained. Only need to dirty here if PSO
+ // VtxInput state (stride, fmt, inputRate...) has changed. http://anglebug.com/3256
invalidateCurrentPipeline();
mDirtyBits.set(DIRTY_BIT_VERTEX_BUFFERS);
mDirtyBits.set(DIRTY_BIT_INDEX_BUFFER);
@@ -286,6 +294,8 @@ class ContextVk : public ContextImpl, public vk::Context, public vk::CommandBuff
vk::PipelineHelper *mCurrentPipeline;
gl::PrimitiveMode mCurrentDrawMode;
+ WindowSurfaceVk *mCurrentWindowSurface;
+
// Keep a cached pipeline description structure that can be used to query the pipeline cache.
// Kept in a pointer so allocations can be aligned, and structs can be portably packed.
std::unique_ptr<vk::GraphicsPipelineDesc> mGraphicsPipelineDesc;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp
index 43bf3eedde4..f8e85301ede 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/DisplayVk.cpp
@@ -84,7 +84,8 @@ DeviceImpl *DisplayVk::createDevice()
egl::Error DisplayVk::waitClient(const gl::Context *context)
{
TRACE_EVENT0("gpu.angle", "DisplayVk::waitClient");
- return angle::ToEGL(mRenderer->finish(this), this, EGL_BAD_ACCESS);
+ ContextVk *contextVk = vk::GetImpl(context);
+ return angle::ToEGL(contextVk->finishImpl(), this, EGL_BAD_ACCESS);
}
egl::Error DisplayVk::waitNative(const gl::Context *context, EGLint engine)
@@ -171,9 +172,6 @@ void DisplayVk::generateExtensions(egl::DisplayExtensions *outExtensions) const
outExtensions->createContextRobustness = true;
outExtensions->surfaceOrientation = true;
outExtensions->displayTextureShareGroup = true;
-
- // TODO(geofflang): Extension is exposed but not implemented so that other aspects of the Vulkan
- // backend can be tested in Chrome. http://anglebug.com/2722
outExtensions->robustResourceInitialization = true;
// The Vulkan implementation will always say that EGL_KHR_swap_buffers_with_damage is supported.
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index b0af4745256..566629eca54 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -31,13 +31,21 @@ namespace rx
namespace
{
+// The value to assign an alpha channel that's emulated. The type is unsigned int, though it will
+// automatically convert to the actual data type.
+constexpr unsigned int kEmulatedAlphaValue = 1;
+
constexpr size_t kMinReadPixelsBufferSize = 128000;
+// 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.
+constexpr VkClearValue kUninitializedClearValue = {{{0.95, 0.05, 0.95, 0.95}}};
const gl::InternalFormat &GetReadAttachmentInfo(const gl::Context *context,
RenderTargetVk *renderTarget)
{
GLenum implFormat =
- renderTarget->getImageFormat().textureFormat().fboImplementationInternalFormat;
+ renderTarget->getImageFormat().imageFormat().fboImplementationInternalFormat;
return gl::GetSizedInternalFormatInfo(implFormat);
}
@@ -45,7 +53,7 @@ bool ClipToRenderTarget(const gl::Rectangle &area,
RenderTargetVk *renderTarget,
gl::Rectangle *rectOut)
{
- const gl::Extents &renderTargetExtents = renderTarget->getImageExtents();
+ const gl::Extents renderTargetExtents = renderTarget->getExtents();
gl::Rectangle renderTargetRect(0, 0, renderTargetExtents.width, renderTargetExtents.height);
return ClipRectangle(area, renderTargetRect, rectOut);
}
@@ -54,12 +62,12 @@ bool HasSrcAndDstBlitProperties(RendererVk *renderer,
RenderTargetVk *srcRenderTarget,
RenderTargetVk *dstRenderTarget)
{
- const VkFormat srcFormat = srcRenderTarget->getImageFormat().vkTextureFormat;
- const VkFormat dstFormat = dstRenderTarget->getImageFormat().vkTextureFormat;
+ const VkFormat srcFormat = srcRenderTarget->getImageFormat().vkImageFormat;
+ const VkFormat dstFormat = dstRenderTarget->getImageFormat().vkImageFormat;
// Verifies if the draw and read images have the necessary prerequisites for blitting.
- return renderer->hasTextureFormatFeatureBits(srcFormat, VK_FORMAT_FEATURE_BLIT_SRC_BIT) &&
- renderer->hasTextureFormatFeatureBits(dstFormat, VK_FORMAT_FEATURE_BLIT_DST_BIT);
+ return renderer->hasImageFormatFeatureBits(srcFormat, VK_FORMAT_FEATURE_BLIT_SRC_BIT) &&
+ renderer->hasImageFormatFeatureBits(dstFormat, VK_FORMAT_FEATURE_BLIT_DST_BIT);
}
// Special rules apply to VkBufferImageCopy with depth/stencil. The components are tightly packed
@@ -95,6 +103,25 @@ const angle::Format &GetDepthStencilImageToBufferFormat(const angle::Format &ima
return imageFormat;
}
}
+
+void SetEmulatedAlphaValue(const vk::Format &format, VkClearColorValue *value)
+{
+ if (format.vkFormatIsInt)
+ {
+ if (format.vkFormatIsUnsigned)
+ {
+ value->uint32[3] = kEmulatedAlphaValue;
+ }
+ else
+ {
+ value->int32[3] = kEmulatedAlphaValue;
+ }
+ }
+ else
+ {
+ value->float32[3] = kEmulatedAlphaValue;
+ }
+}
} // anonymous namespace
// static
@@ -165,145 +192,141 @@ angle::Result FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
{
ContextVk *contextVk = vk::GetImpl(context);
- // This command buffer is only started once.
- vk::CommandBuffer *commandBuffer = nullptr;
-
- const gl::FramebufferAttachment *depthAttachment = mState.getDepthAttachment();
- bool clearDepth = (depthAttachment && (mask & GL_DEPTH_BUFFER_BIT) != 0);
- ASSERT(!clearDepth || depthAttachment->isAttached());
-
- // If depth write is disabled, pretend that GL_DEPTH_BUFFER_BIT is not specified altogether.
- clearDepth = clearDepth && contextVk->getState().getDepthStencilState().depthMask;
-
- const gl::FramebufferAttachment *stencilAttachment = mState.getStencilAttachment();
- bool clearStencil = (stencilAttachment && (mask & GL_STENCIL_BUFFER_BIT) != 0);
- ASSERT(!clearStencil || stencilAttachment->isAttached());
+ bool clearColor = IsMaskFlagSet(mask, static_cast<GLbitfield>(GL_COLOR_BUFFER_BIT));
+ bool clearDepth = IsMaskFlagSet(mask, static_cast<GLbitfield>(GL_DEPTH_BUFFER_BIT));
+ bool clearStencil = IsMaskFlagSet(mask, static_cast<GLbitfield>(GL_STENCIL_BUFFER_BIT));
+ gl::DrawBufferMask clearColorBuffers;
+ if (clearColor)
+ {
+ clearColorBuffers = mState.getEnabledDrawBuffers();
+ }
- bool clearColor = IsMaskFlagSet(static_cast<int>(mask), GL_COLOR_BUFFER_BIT);
+ const VkClearColorValue &clearColorValue = contextVk->getClearColorValue().color;
+ const VkClearDepthStencilValue &clearDepthStencilValue =
+ contextVk->getClearDepthStencilValue().depthStencil;
- const gl::State &glState = context->getState();
+ return clearImpl(context, clearColorBuffers, clearDepth, clearStencil, clearColorValue,
+ clearDepthStencilValue);
+}
- VkClearDepthStencilValue clearDepthStencilValue =
- contextVk->getClearDepthStencilValue().depthStencil;
+angle::Result FramebufferVk::clearImpl(const gl::Context *context,
+ gl::DrawBufferMask clearColorBuffers,
+ bool clearDepth,
+ bool clearStencil,
+ const VkClearColorValue &clearColorValue,
+ const VkClearDepthStencilValue &clearDepthStencilValue)
+{
+ ContextVk *contextVk = vk::GetImpl(context);
- // Apply the stencil mask to the clear value.
- clearDepthStencilValue.stencil &= contextVk->getState().getDepthStencilState().stencilWritemask;
+ const gl::Rectangle scissoredRenderArea = getScissoredRenderArea(contextVk);
- // If the depth or stencil is being cleared, and the image was originally requested to have a
- // single aspect, but it's emulated with a depth/stencil format, clear both aspects, setting the
- // other aspect to 0.
- if (clearStencil || clearDepth)
+ // Discard clear altogether if scissor has 0 width or height.
+ if (scissoredRenderArea.width == 0 || scissoredRenderArea.height == 0)
{
- RenderTargetVk *depthStencil = mRenderTargetCache.getDepthStencil();
- const vk::Format &format = depthStencil->getImageFormat();
-
- // GL_DEPTH_COMPONENT24 is always emulated with a format that has stencil.
- if (format.angleFormat().stencilBits == 0)
- {
- clearStencil = true;
- clearDepthStencilValue.stencil = 0;
- }
- // GL_STENCIL_INDEX8 may or may not be emulated.
- else if (format.angleFormat().depthBits == 0 && format.vkTextureFormat != VK_FORMAT_S8_UINT)
- {
- clearDepth = true;
- clearDepthStencilValue.depth = 0;
- }
+ return angle::Result::Continue;
}
- // The most costly clear mode is when we need to mask out specific color channels. This can
- // only be done with a draw call. The scissor region however can easily be integrated with
- // this method. Similarly for depth/stencil clear.
- VkColorComponentFlags colorMaskFlags = contextVk->getClearColorMask();
- if (clearColor && (mActiveColorComponents & colorMaskFlags) != mActiveColorComponents)
- {
- ANGLE_TRY(clearWithDraw(contextVk, colorMaskFlags));
+ mFramebuffer.updateQueueSerial(contextVk->getRenderer()->getCurrentQueueSerial());
- // Stencil clears must be handled separately. The only way to write out a stencil value from
- // a fragment shader in Vulkan is with VK_EXT_shader_stencil_export. Support for this
- // extension is sparse. Hence, we call into the RenderPass clear path. We similarly clear
- // depth to keep the code simple, but depth clears could be combined with the masked color
- // clears as an optimization.
+ // This function assumes that only enabled attachments are asked to be cleared.
+ ASSERT((clearColorBuffers & mState.getEnabledDrawBuffers()) == clearColorBuffers);
- if (clearDepth || clearStencil)
- {
- ANGLE_TRY(clearWithClearAttachments(contextVk, false, clearDepth, clearStencil,
- clearDepthStencilValue));
- }
- return angle::Result::Continue;
- }
+ // Adjust clear behavior based on whether the respective attachments are present; if asked to
+ // clear a non-existent attachment, don't attempt to clear it.
- if (glState.isScissorTestEnabled())
- {
- // With scissor test enabled, we clear very differently and we don't need to access
- // the image inside each attachment we can just use clearCmdAttachments with our
- // scissor region instead.
- ANGLE_TRY(clearWithClearAttachments(contextVk, clearColor, clearDepth, clearStencil,
- clearDepthStencilValue));
- return angle::Result::Continue;
- }
+ VkColorComponentFlags colorMaskFlags = contextVk->getClearColorMask();
+ bool clearColor = clearColorBuffers.any();
- // Standard Depth/stencil clear without scissor.
- if (clearDepth || clearStencil)
- {
- ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
+ const gl::FramebufferAttachment *depthAttachment = mState.getDepthAttachment();
+ clearDepth = clearDepth && depthAttachment;
+ ASSERT(!clearDepth || depthAttachment->isAttached());
- RenderTargetVk *renderTarget = mRenderTargetCache.getDepthStencil();
- const angle::Format &format = renderTarget->getImageFormat().textureFormat();
- const VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
+ const gl::FramebufferAttachment *stencilAttachment = mState.getStencilAttachment();
+ clearStencil = clearStencil && stencilAttachment;
+ ASSERT(!clearStencil || stencilAttachment->isAttached());
- VkImageAspectFlags clearAspects = aspectFlags;
- if (!clearDepth)
- {
- clearAspects &= ~VK_IMAGE_ASPECT_DEPTH_BIT;
- }
- if (!clearStencil)
- {
- clearAspects &= ~VK_IMAGE_ASPECT_STENCIL_BIT;
- }
+ uint8_t stencilMask =
+ static_cast<uint8_t>(contextVk->getState().getDepthStencilState().stencilWritemask);
- vk::ImageHelper *image = renderTarget->getImageForWrite(&mFramebuffer);
- image->clearDepthStencil(aspectFlags, clearAspects, clearDepthStencilValue, commandBuffer);
- }
+ // The front-end should ensure we don't attempt to clear color if all channels are masked.
+ ASSERT(!clearColor || colorMaskFlags != 0);
+ // The front-end should ensure we don't attempt to clear depth if depth write is disabled.
+ ASSERT(!clearDepth || contextVk->getState().getDepthStencilState().depthMask);
+ // The front-end should ensure we don't attempt to clear stencil if all bits are masked.
+ ASSERT(!clearStencil || stencilMask != 0);
- if (!clearColor)
+ // If there is nothing to clear, return right away (for example, if asked to clear depth, but
+ // there is no depth attachment).
+ if (!clearColor && !clearDepth && !clearStencil)
{
return angle::Result::Continue;
}
- const auto *attachment = mState.getFirstNonNullAttachment();
- ASSERT(attachment && attachment->isAttached());
+ VkClearDepthStencilValue modifiedDepthStencilValue = clearDepthStencilValue;
- if (!commandBuffer)
- {
- ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
- }
+ // We can use render pass load ops if clearing depth, unmasked color or unmasked stencil. If
+ // there's a depth mask, depth clearing is already disabled.
+ bool maskedClearColor =
+ clearColor && (mActiveColorComponents & colorMaskFlags) != mActiveColorComponents;
+ bool maskedClearStencil = stencilMask != 0xFF;
- // TODO(jmadill): Support gaps in RenderTargets. http://anglebug.com/2394
- const auto &colorRenderTargets = mRenderTargetCache.getColors();
- const VkClearColorValue &clearColorValue = contextVk->getClearColorValue().color;
- for (size_t colorIndex : mState.getEnabledDrawBuffers())
+ bool clearColorWithRenderPassLoadOp = clearColor && !maskedClearColor;
+ bool clearStencilWithRenderPassLoadOp = clearStencil && !maskedClearStencil;
+
+ // At least one of color, depth or stencil should be clearable with render pass loadOp for us
+ // to use this clear path.
+ bool clearAnyWithRenderPassLoadOp =
+ clearColorWithRenderPassLoadOp || clearDepth || clearStencilWithRenderPassLoadOp;
+
+ if (clearAnyWithRenderPassLoadOp)
{
- VkClearColorValue modifiedClearColorValue = clearColorValue;
- RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndex];
+ // Clearing color is indicated by the set bits in this mask. If not clearing colors with
+ // render pass loadOp, the default value of all-zeros means the clear is not done in
+ // clearWithRenderPassOp below. In that case, only clear depth/stencil with render pass
+ // loadOp.
+ gl::DrawBufferMask clearBuffersWithRenderPassLoadOp;
+ if (clearColorWithRenderPassLoadOp)
+ {
+ clearBuffersWithRenderPassLoadOp = clearColorBuffers;
+ }
+ ANGLE_TRY(clearWithRenderPassOp(
+ contextVk, scissoredRenderArea, clearBuffersWithRenderPassLoadOp, clearDepth,
+ clearStencilWithRenderPassLoadOp, clearColorValue, modifiedDepthStencilValue));
- // It's possible we're clearing a render target that has no alpha channel but we represent
- // it with a texture that has one. We must not affect its alpha channel no matter what the
- // clear value is in that case.
- if (mEmulatedAlphaAttachmentMask[colorIndex])
+ // On some hardware, having inline commands at this point results in corrupted output. In
+ // that case, end the render pass immediately. http://anglebug.com/2361
+ if (contextVk->getRenderer()->getFeatures().restartRenderPassAfterLoadOpClear)
{
- modifiedClearColorValue.float32[3] = 1.0;
+ mFramebuffer.finishCurrentCommands(contextVk->getRenderer());
}
- ASSERT(colorRenderTarget);
- vk::ImageHelper *image = colorRenderTarget->getImageForWrite(&mFramebuffer);
+ // Fallback to other methods for whatever isn't cleared here.
+ clearDepth = false;
+ if (clearColorWithRenderPassLoadOp)
+ {
+ clearColorBuffers.reset();
+ clearColor = false;
+ }
+ if (clearStencilWithRenderPassLoadOp)
+ {
+ clearStencil = false;
+ }
- // If we're clearing a cube map face ensure we only clear the selected layer.
- image->clearColorLayer(modifiedClearColorValue, colorRenderTarget->getLevelIndex(), 1,
- colorRenderTarget->getLayerIndex(), 1, commandBuffer);
+ // If nothing left to clear, early out.
+ if (!clearColor && !clearStencil)
+ {
+ return angle::Result::Continue;
+ }
}
- return angle::Result::Continue;
+ // Note: depth clear is always done through render pass loadOp.
+ ASSERT(clearDepth == false);
+
+ // The most costly clear mode is when we need to mask out specific color channels or stencil
+ // bits. This can only be done with a draw call.
+ return clearWithDraw(contextVk, scissoredRenderArea, clearColorBuffers, clearStencil,
+ colorMaskFlags, stencilMask, clearColorValue,
+ static_cast<uint8_t>(modifiedDepthStencilValue.stencil));
}
angle::Result FramebufferVk::clearBufferfv(const gl::Context *context,
@@ -311,8 +334,27 @@ angle::Result FramebufferVk::clearBufferfv(const gl::Context *context,
GLint drawbuffer,
const GLfloat *values)
{
- ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
- return angle::Result::Stop;
+ VkClearValue clearValue = {};
+
+ bool clearDepth = false;
+ gl::DrawBufferMask clearColorBuffers;
+
+ if (buffer == GL_DEPTH)
+ {
+ clearDepth = true;
+ clearValue.depthStencil.depth = values[0];
+ }
+ else
+ {
+ clearColorBuffers.set(drawbuffer);
+ clearValue.color.float32[0] = values[0];
+ clearValue.color.float32[1] = values[1];
+ clearValue.color.float32[2] = values[2];
+ clearValue.color.float32[3] = values[3];
+ }
+
+ return clearImpl(context, clearColorBuffers, clearDepth, false, clearValue.color,
+ clearValue.depthStencil);
}
angle::Result FramebufferVk::clearBufferuiv(const gl::Context *context,
@@ -320,8 +362,18 @@ angle::Result FramebufferVk::clearBufferuiv(const gl::Context *context,
GLint drawbuffer,
const GLuint *values)
{
- ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
- return angle::Result::Stop;
+ VkClearValue clearValue = {};
+
+ gl::DrawBufferMask clearColorBuffers;
+ clearColorBuffers.set(drawbuffer);
+
+ clearValue.color.uint32[0] = values[0];
+ clearValue.color.uint32[1] = values[1];
+ clearValue.color.uint32[2] = values[2];
+ clearValue.color.uint32[3] = values[3];
+
+ return clearImpl(context, clearColorBuffers, false, false, clearValue.color,
+ clearValue.depthStencil);
}
angle::Result FramebufferVk::clearBufferiv(const gl::Context *context,
@@ -329,8 +381,28 @@ angle::Result FramebufferVk::clearBufferiv(const gl::Context *context,
GLint drawbuffer,
const GLint *values)
{
- ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
- return angle::Result::Stop;
+ VkClearValue clearValue = {};
+
+ bool clearStencil = false;
+ gl::DrawBufferMask clearColorBuffers;
+
+ if (buffer == GL_STENCIL)
+ {
+ clearStencil = true;
+ clearValue.depthStencil.stencil =
+ gl::clamp(values[0], 0, std::numeric_limits<uint8_t>::max());
+ }
+ else
+ {
+ clearColorBuffers.set(drawbuffer);
+ clearValue.color.int32[0] = values[0];
+ clearValue.color.int32[1] = values[1];
+ clearValue.color.int32[2] = values[2];
+ clearValue.color.int32[3] = values[3];
+ }
+
+ return clearImpl(context, clearColorBuffers, false, clearStencil, clearValue.color,
+ clearValue.depthStencil);
}
angle::Result FramebufferVk::clearBufferfi(const gl::Context *context,
@@ -339,8 +411,13 @@ angle::Result FramebufferVk::clearBufferfi(const gl::Context *context,
GLfloat depth,
GLint stencil)
{
- ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
- return angle::Result::Stop;
+ VkClearValue clearValue = {};
+
+ clearValue.depthStencil.depth = depth;
+ clearValue.depthStencil.stencil = gl::clamp(stencil, 0, std::numeric_limits<uint8_t>::max());
+
+ return clearImpl(context, gl::DrawBufferMask(), true, true, clearValue.color,
+ clearValue.depthStencil);
}
GLenum FramebufferVk::getImplementationColorReadFormat(const gl::Context *context) const
@@ -424,7 +501,7 @@ angle::Result FramebufferVk::blitWithCopy(ContextVk *contextVk,
VkImageAspectFlags aspectMask =
vk::GetDepthStencilAspectFlagsForCopy(blitDepthBuffer, blitStencilBuffer);
- vk::CommandBuffer *commandBuffer;
+ vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
vk::ImageHelper *writeImage = drawRenderTarget->getImageForWrite(&mFramebuffer);
@@ -462,7 +539,7 @@ angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk,
RenderTargetVk *drawRenderTarget)
{
RendererVk *renderer = contextVk->getRenderer();
- const angle::Format &readFormat = readRenderTarget->getImageFormat().textureFormat();
+ const angle::Format &readFormat = readRenderTarget->getImageFormat().imageFormat();
ASSERT(aspect == VK_IMAGE_ASPECT_DEPTH_BIT || aspect == VK_IMAGE_ASPECT_STENCIL_BIT);
@@ -509,7 +586,7 @@ angle::Result FramebufferVk::blitWithReadback(ContextVk *contextVk,
// Reinitialize the commandBuffer after a read pixels because it calls
// renderer->finish which makes command buffers obsolete.
- vk::CommandBuffer *commandBuffer;
+ vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
// We read the bytes of the image in a buffer, now we have to copy them into the
@@ -669,17 +746,17 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
vk::ImageHelper *dstImage = drawRenderTarget->getImageForWrite(&mFramebuffer);
- vk::CommandBuffer *commandBuffer;
+ vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mFramebuffer.recordCommands(contextVk, &commandBuffer));
const vk::Format &readImageFormat = readRenderTarget->getImageFormat();
VkImageAspectFlags aspectMask =
colorBlit ? VK_IMAGE_ASPECT_COLOR_BIT
- : vk::GetDepthStencilAspectFlags(readImageFormat.textureFormat());
+ : vk::GetDepthStencilAspectFlags(readImageFormat.imageFormat());
vk::ImageHelper *srcImage = readRenderTarget->getImageForRead(
&mFramebuffer, vk::ImageLayout::TransferSrc, commandBuffer);
- const gl::Extents sourceFrameBufferExtents = readRenderTarget->getImageExtents();
+ const gl::Extents sourceFrameBufferExtents = readRenderTarget->getExtents();
gl::Rectangle readRect = readRectIn;
if (flipSource)
@@ -699,8 +776,8 @@ angle::Result FramebufferVk::blitWithCommand(ContextVk *contextVk,
blit.dstSubresource.baseArrayLayer = 0;
blit.dstSubresource.layerCount = 1;
- const gl::Extents &drawFrameBufferExtents = drawRenderTarget->getImageExtents();
- gl::Rectangle drawRect = drawRectIn;
+ const gl::Extents drawFrameBufferExtents = drawRenderTarget->getExtents();
+ gl::Rectangle drawRect = drawRectIn;
if (flipDest)
{
@@ -768,7 +845,7 @@ angle::Result FramebufferVk::syncState(const gl::Context *context,
if (renderTarget)
{
const angle::Format &emulatedFormat =
- renderTarget->getImageFormat().textureFormat();
+ renderTarget->getImageFormat().imageFormat();
updateActiveColorMasks(
colorIndex, emulatedFormat.redBits > 0, emulatedFormat.greenBits > 0,
emulatedFormat.blueBits > 0, emulatedFormat.alphaBits > 0);
@@ -836,14 +913,14 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe
return angle::Result::Continue;
}
- vk::RenderPass *renderPass = nullptr;
- ANGLE_TRY(
- contextVk->getRenderer()->getCompatibleRenderPass(contextVk, mRenderPassDesc, &renderPass));
+ vk::RenderPass *compatibleRenderPass = nullptr;
+ ANGLE_TRY(contextVk->getRenderer()->getCompatibleRenderPass(contextVk, mRenderPassDesc,
+ &compatibleRenderPass));
// If we've a Framebuffer provided by a Surface (default FBO/backbuffer), query it.
if (mBackbuffer)
{
- return mBackbuffer->getCurrentFramebuffer(contextVk, *renderPass, framebufferOut);
+ return mBackbuffer->getCurrentFramebuffer(contextVk, *compatibleRenderPass, framebufferOut);
}
// Gather VkImageViews over all FBO attachments, also size of attached region.
@@ -858,8 +935,8 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe
ASSERT(colorRenderTarget);
attachments.push_back(colorRenderTarget->getDrawImageView()->getHandle());
- ASSERT(attachmentsSize.empty() || attachmentsSize == colorRenderTarget->getImageExtents());
- attachmentsSize = colorRenderTarget->getImageExtents();
+ ASSERT(attachmentsSize.empty() || attachmentsSize == colorRenderTarget->getExtents());
+ attachmentsSize = colorRenderTarget->getExtents();
}
RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil();
@@ -868,8 +945,8 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe
attachments.push_back(depthStencilRenderTarget->getDrawImageView()->getHandle());
ASSERT(attachmentsSize.empty() ||
- attachmentsSize == depthStencilRenderTarget->getImageExtents());
- attachmentsSize = depthStencilRenderTarget->getImageExtents();
+ attachmentsSize == depthStencilRenderTarget->getExtents());
+ attachmentsSize = depthStencilRenderTarget->getExtents();
}
ASSERT(!attachments.empty());
@@ -878,7 +955,7 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.flags = 0;
- framebufferInfo.renderPass = renderPass->getHandle();
+ framebufferInfo.renderPass = compatibleRenderPass->getHandle();
framebufferInfo.attachmentCount = static_cast<uint32_t>(attachments.size());
framebufferInfo.pAttachments = attachments.data();
framebufferInfo.width = static_cast<uint32_t>(attachmentsSize.width);
@@ -891,136 +968,124 @@ angle::Result FramebufferVk::getFramebuffer(ContextVk *contextVk, vk::Framebuffe
return angle::Result::Continue;
}
-angle::Result FramebufferVk::clearWithClearAttachments(
+angle::Result FramebufferVk::clearWithRenderPassOp(
ContextVk *contextVk,
- bool clearColor,
+ const gl::Rectangle &clearArea,
+ gl::DrawBufferMask clearColorBuffers,
bool clearDepth,
bool clearStencil,
+ const VkClearColorValue &clearColorValue,
const VkClearDepthStencilValue &clearDepthStencilValue)
{
- // Trigger a new command node to ensure overlapping writes happen sequentially.
- mFramebuffer.finishCurrentCommands(contextVk->getRenderer());
-
- // This command can only happen inside a render pass, so obtain one if its already happening
- // or create a new one if not.
- vk::CommandBuffer *commandBuffer = nullptr;
- vk::RecordingMode mode = vk::RecordingMode::Start;
- ANGLE_TRY(getCommandBufferForDraw(contextVk, &commandBuffer, &mode));
-
- // The array layer is offset by the ImageView. So we shouldn't need to set a base array layer.
- VkClearRect clearRect = {};
- clearRect.baseArrayLayer = 0;
- clearRect.layerCount = 1;
-
- // When clearing, the scissor region must be clipped to the renderArea per the validation rules
- // in Vulkan.
- gl::Rectangle intersection;
- if (!gl::ClipRectangle(contextVk->getState().getScissor(),
- mFramebuffer.getRenderPassRenderArea(), &intersection))
+ // Start a new render pass if:
+ //
+ // - no render pass has started,
+ // - there is a render pass started but it contains commands; we cannot modify its ops, so new
+ // render pass is needed,
+ // - the current render area doesn't match the clear area. We need the render area to be
+ // exactly as specified by the scissor for the loadOp to clear only that area. See
+ // onScissorChange for more information.
+
+ if (!mFramebuffer.valid() || !mFramebuffer.renderPassStartedButEmpty() ||
+ mFramebuffer.getRenderPassRenderArea() != clearArea)
{
- // There is nothing to clear since the scissor is outside of the render area.
- return angle::Result::Continue;
+ vk::CommandBuffer *commandBuffer;
+ ANGLE_TRY(startNewRenderPass(contextVk, clearArea, &commandBuffer));
}
- clearRect.rect = gl_vk::GetRect(intersection);
+ size_t attachmentIndex = 0;
- if (contextVk->isViewportFlipEnabledForDrawFBO())
- {
- clearRect.rect.offset.y = mFramebuffer.getRenderPassRenderArea().height -
- clearRect.rect.offset.y - clearRect.rect.extent.height;
- }
-
- gl::AttachmentArray<VkClearAttachment> clearAttachments;
- int clearAttachmentIndex = 0;
-
- if (clearColor)
+ // Go through clearColorBuffers and set the appropriate loadOp and clear values.
+ // TODO: Support gaps in RenderTargets. http://anglebug.com/2394
+ for (size_t colorIndex : mState.getEnabledDrawBuffers())
{
- RenderTargetVk *renderTarget = getColorReadRenderTarget();
- const vk::Format &format = renderTarget->getImageFormat();
- VkClearValue modifiedClear = contextVk->getClearColorValue();
-
- // We need to make sure we are not clearing the alpha channel if we are using a buffer
- // format that doesn't have an alpha channel.
- if (format.angleFormat().alphaBits == 0)
+ if (clearColorBuffers.test(colorIndex))
{
- modifiedClear.color.float32[3] = 1.0;
- }
+ RenderTargetVk *renderTarget = getColorReadRenderTarget();
- // TODO(jmadill): Support gaps in RenderTargets. http://anglebug.com/2394
- for (size_t colorIndex : mState.getEnabledDrawBuffers())
- {
- VkClearAttachment &clearAttachment = clearAttachments[clearAttachmentIndex];
- clearAttachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- clearAttachment.colorAttachment = static_cast<uint32_t>(colorIndex);
- clearAttachment.clearValue = modifiedClear;
- ++clearAttachmentIndex;
+ // If the render target doesn't have alpha, but its emulated format has it, clear the
+ // alpha to 1.
+ VkClearColorValue value = clearColorValue;
+ if (mEmulatedAlphaAttachmentMask[colorIndex])
+ {
+ SetEmulatedAlphaValue(renderTarget->getImageFormat(), &value);
+ }
+
+ mFramebuffer.clearRenderPassColorAttachment(attachmentIndex, value);
}
+ ++attachmentIndex;
}
- VkClearValue depthStencilClearValue = {};
- depthStencilClearValue.depthStencil = clearDepthStencilValue;
-
- if (clearDepth && clearStencil && mState.getDepthStencilAttachment() != nullptr)
- {
- // When we have a packed depth/stencil attachment we can do 1 clear for both when it
- // applies.
- VkClearAttachment &clearAttachment = clearAttachments[clearAttachmentIndex];
- clearAttachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
- clearAttachment.colorAttachment = VK_ATTACHMENT_UNUSED;
- clearAttachment.clearValue = depthStencilClearValue;
- ++clearAttachmentIndex;
- }
- else
+ // Set the appropriate loadOp and clear values for depth and stencil.
+ RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil();
+ if (depthStencilRenderTarget)
{
if (clearDepth)
{
- VkClearAttachment &clearAttachment = clearAttachments[clearAttachmentIndex];
- clearAttachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
- clearAttachment.colorAttachment = VK_ATTACHMENT_UNUSED;
- clearAttachment.clearValue = depthStencilClearValue;
- ++clearAttachmentIndex;
+ mFramebuffer.clearRenderPassDepthAttachment(attachmentIndex,
+ clearDepthStencilValue.depth);
}
if (clearStencil)
{
- VkClearAttachment &clearAttachment = clearAttachments[clearAttachmentIndex];
- clearAttachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
- clearAttachment.colorAttachment = VK_ATTACHMENT_UNUSED;
- clearAttachment.clearValue = depthStencilClearValue;
- ++clearAttachmentIndex;
+ mFramebuffer.clearRenderPassStencilAttachment(attachmentIndex,
+ clearDepthStencilValue.stencil);
}
}
- commandBuffer->clearAttachments(static_cast<uint32_t>(clearAttachmentIndex),
- clearAttachments.data(), 1, &clearRect);
return angle::Result::Continue;
}
angle::Result FramebufferVk::clearWithDraw(ContextVk *contextVk,
- VkColorComponentFlags colorMaskFlags)
+ const gl::Rectangle &clearArea,
+ gl::DrawBufferMask clearColorBuffers,
+ bool clearStencil,
+ VkColorComponentFlags colorMaskFlags,
+ uint8_t stencilMask,
+ const VkClearColorValue &clearColorValue,
+ uint8_t clearStencilValue)
{
RendererVk *renderer = contextVk->getRenderer();
- // If the format of the framebuffer does not have an alpha channel, we need to make sure we do
- // not affect the alpha channel of the type we're using to emulate the format.
- // TODO(jmadill): Implement EXT_draw_buffers http://anglebug.com/2394
- RenderTargetVk *renderTarget = mRenderTargetCache.getColors()[0];
- ASSERT(renderTarget);
+ UtilsVk::ClearFramebufferParameters params = {};
+ params.renderPassDesc = &getRenderPassDesc();
+ params.renderAreaHeight = mState.getDimensions().height;
+ params.clearArea = clearArea;
+ params.colorClearValue = clearColorValue;
+ params.stencilClearValue = clearStencilValue;
+ params.stencilMask = stencilMask;
- UtilsVk::ClearImageParameters params = {};
- params.colorMaskFlags = colorMaskFlags;
- params.alphaMask = &getEmulatedAlphaAttachmentMask();
- params.renderPassDesc = &getRenderPassDesc();
+ params.clearColor = true;
+ params.clearStencil = clearStencil;
- const vk::Format &imageFormat = renderTarget->getImageFormat();
- params.clearValue = contextVk->getClearColorValue().color;
- bool overrideAlphaWithOne =
- imageFormat.textureFormat().alphaBits > 0 && imageFormat.angleFormat().alphaBits == 0;
- params.clearValue.float32[3] = overrideAlphaWithOne ? 1.0f : params.clearValue.float32[3];
+ const auto &colorRenderTargets = mRenderTargetCache.getColors();
+ for (size_t colorIndex : clearColorBuffers)
+ {
+ const RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndex];
+ ASSERT(colorRenderTarget);
- params.renderAreaHeight = mState.getDimensions().height;
+ params.colorFormat = &colorRenderTarget->getImage().getFormat().imageFormat();
+ params.colorAttachmentIndex = colorIndex;
+ params.colorMaskFlags = colorMaskFlags;
+ if (mEmulatedAlphaAttachmentMask[colorIndex])
+ {
+ params.colorMaskFlags &= ~VK_COLOR_COMPONENT_A_BIT;
+ }
- return renderer->getUtils().clearImage(contextVk, this, params);
+ ANGLE_TRY(renderer->getUtils().clearFramebuffer(contextVk, this, params));
+
+ // Clear stencil only once!
+ params.clearStencil = false;
+ }
+
+ // If there was no color clear, clear stencil alone.
+ if (params.clearStencil)
+ {
+ params.clearColor = false;
+ ANGLE_TRY(renderer->getUtils().clearFramebuffer(contextVk, this, params));
+ }
+
+ return angle::Result::Continue;
}
angle::Result FramebufferVk::getSamplePosition(const gl::Context *context,
@@ -1031,29 +1096,14 @@ angle::Result FramebufferVk::getSamplePosition(const gl::Context *context,
return angle::Result::Stop;
}
-angle::Result FramebufferVk::getCommandBufferForDraw(ContextVk *contextVk,
- vk::CommandBuffer **commandBufferOut,
- vk::RecordingMode *modeOut)
-{
- RendererVk *renderer = contextVk->getRenderer();
-
- // This will clear the current write operation if it is complete.
- if (appendToStartedRenderPass(renderer->getCurrentQueueSerial(), commandBufferOut))
- {
- *modeOut = vk::RecordingMode::Append;
- return angle::Result::Continue;
- }
-
- return startNewRenderPass(contextVk, commandBufferOut);
-}
-
angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk,
+ const gl::Rectangle &renderArea,
vk::CommandBuffer **commandBufferOut)
{
vk::Framebuffer *framebuffer = nullptr;
ANGLE_TRY(getFramebuffer(contextVk, &framebuffer));
- // TODO(jmadill): Proper clear value implementation. http://anglebug.com/2361
+ vk::AttachmentOpsArray renderPassAttachmentOps;
std::vector<VkClearValue> attachmentClearValues;
vk::CommandBuffer *writeCommands = nullptr;
@@ -1069,22 +1119,30 @@ angle::Result FramebufferVk::startNewRenderPass(ContextVk *contextVk,
RenderTargetVk *colorRenderTarget = colorRenderTargets[colorIndex];
ASSERT(colorRenderTarget);
- colorRenderTarget->onColorDraw(&mFramebuffer, writeCommands, &renderPassDesc);
- attachmentClearValues.emplace_back(contextVk->getClearColorValue());
+ ANGLE_TRY(colorRenderTarget->onColorDraw(contextVk, &mFramebuffer, writeCommands,
+ &renderPassDesc));
+
+ renderPassAttachmentOps.initWithLoadStore(attachmentClearValues.size(),
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+ attachmentClearValues.emplace_back(kUninitializedClearValue);
}
RenderTargetVk *depthStencilRenderTarget = mRenderTargetCache.getDepthStencil();
if (depthStencilRenderTarget)
{
- depthStencilRenderTarget->onDepthStencilDraw(&mFramebuffer, writeCommands, &renderPassDesc);
- attachmentClearValues.emplace_back(contextVk->getClearDepthStencilValue());
- }
+ ANGLE_TRY(depthStencilRenderTarget->onDepthStencilDraw(contextVk, &mFramebuffer,
+ writeCommands, &renderPassDesc));
- gl::Rectangle renderArea =
- gl::Rectangle(0, 0, mState.getDimensions().width, mState.getDimensions().height);
+ renderPassAttachmentOps.initWithLoadStore(attachmentClearValues.size(),
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
+ attachmentClearValues.emplace_back(kUninitializedClearValue);
+ }
return mFramebuffer.beginRenderPass(contextVk, *framebuffer, renderArea, mRenderPassDesc,
- attachmentClearValues, commandBufferOut);
+ renderPassAttachmentOps, attachmentClearValues,
+ commandBufferOut);
}
void FramebufferVk::updateActiveColorMasks(size_t colorIndex, bool r, bool g, bool b, bool a)
@@ -1108,7 +1166,6 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
void *pixels)
{
TRACE_EVENT0("gpu.angle", "FramebufferVk::readPixelsImpl");
- RendererVk *renderer = contextVk->getRenderer();
ANGLE_TRY(renderTarget->ensureImageInitialized(contextVk));
@@ -1120,7 +1177,7 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
vk::ImageHelper *srcImage =
renderTarget->getImageForRead(&mFramebuffer, vk::ImageLayout::TransferSrc, commandBuffer);
- const angle::Format *readFormat = &srcImage->getFormat().textureFormat();
+ const angle::Format *readFormat = &srcImage->getFormat().imageFormat();
if (copyAspectFlags != VK_IMAGE_ASPECT_COLOR_BIT)
{
@@ -1155,7 +1212,7 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
// Triggers a full finish.
// TODO(jmadill): Don't block on asynchronous readback.
- ANGLE_TRY(renderer->finish(contextVk));
+ ANGLE_TRY(contextVk->finishImpl());
// The buffer we copied to needs to be invalidated before we read from it because its not been
// created with the host coherent bit.
@@ -1167,9 +1224,48 @@ angle::Result FramebufferVk::readPixelsImpl(ContextVk *contextVk,
return angle::Result::Continue;
}
-const gl::Extents &FramebufferVk::getReadImageExtents() const
+gl::Extents FramebufferVk::getReadImageExtents() const
{
- return getColorReadRenderTarget()->getImageExtents();
+ ASSERT(getColorReadRenderTarget()->getExtents().width == mState.getDimensions().width);
+ ASSERT(getColorReadRenderTarget()->getExtents().height == mState.getDimensions().height);
+
+ return getColorReadRenderTarget()->getExtents();
+}
+
+gl::Rectangle FramebufferVk::getCompleteRenderArea() const
+{
+ return gl::Rectangle(0, 0, mState.getDimensions().width, mState.getDimensions().height);
+}
+
+gl::Rectangle FramebufferVk::getScissoredRenderArea(ContextVk *contextVk) const
+{
+ const gl::Rectangle renderArea(0, 0, mState.getDimensions().width,
+ mState.getDimensions().height);
+ bool invertViewport = contextVk->isViewportFlipEnabledForDrawFBO();
+
+ return ClipRectToScissor(contextVk->getState(), renderArea, invertViewport);
+}
+
+void FramebufferVk::onScissorChange(ContextVk *contextVk)
+{
+ gl::Rectangle scissoredRenderArea = getScissoredRenderArea(contextVk);
+
+ // If the scissor has grown beyond the previous scissoredRenderArea, make sure the render pass
+ // is restarted. Otherwise, we can continue using the same renderpass area.
+ //
+ // Without a scissor, the render pass area covers the whole of the framebuffer. With a
+ // scissored clear, the render pass area could be smaller than the framebuffer size. When the
+ // scissor changes, if the scissor area is completely encompassed by the render pass area, it's
+ // possible to continue using the same render pass. However, if the current render pass area
+ // is too small, we need to start a new one. The latter can happen if a scissored clear starts
+ // a render pass, the scissor is disabled and a draw call is issued to affect the whole
+ // framebuffer.
+ mFramebuffer.updateQueueSerial(contextVk->getRenderer()->getCurrentQueueSerial());
+ if (mFramebuffer.hasStartedRenderPass() &&
+ !mFramebuffer.getRenderPassRenderArea().encloses(scissoredRenderArea))
+ {
+ mFramebuffer.finishCurrentCommands(contextVk->getRenderer());
+ }
}
RenderTargetVk *FramebufferVk::getFirstRenderTarget() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h
index d159c73def3..1677f82fce7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h
@@ -100,20 +100,29 @@ class FramebufferVk : public FramebufferImpl
RenderTargetVk *renderTarget,
void *pixels);
- const gl::Extents &getReadImageExtents() const;
+ gl::Extents getReadImageExtents() const;
+ gl::Rectangle getCompleteRenderArea() const;
+ gl::Rectangle getScissoredRenderArea(ContextVk *contextVk) const;
+
+ void onScissorChange(ContextVk *contextVk);
const gl::DrawBufferMask &getEmulatedAlphaAttachmentMask() const;
RenderTargetVk *getColorReadRenderTarget() const;
// This will clear the current write operation if it is complete.
- bool appendToStartedRenderPass(Serial currentQueueSerial, vk::CommandBuffer **commandBufferOut)
+ bool appendToStartedRenderPass(Serial currentQueueSerial,
+ const gl::Rectangle &renderArea,
+ vk::CommandBuffer **commandBufferOut)
{
- return mFramebuffer.appendToStartedRenderPass(currentQueueSerial, commandBufferOut);
+ return mFramebuffer.appendToStartedRenderPass(currentQueueSerial, renderArea,
+ commandBufferOut);
}
vk::FramebufferHelper *getFramebuffer() { return &mFramebuffer; }
- angle::Result startNewRenderPass(ContextVk *context, vk::CommandBuffer **commandBufferOut);
+ angle::Result startNewRenderPass(ContextVk *context,
+ const gl::Rectangle &renderArea,
+ vk::CommandBuffer **commandBufferOut);
RenderTargetVk *getFirstRenderTarget() const;
GLint getSamples() const;
@@ -125,11 +134,6 @@ class FramebufferVk : public FramebufferImpl
const gl::FramebufferState &state,
WindowSurfaceVk *backbuffer);
- // Helper for appendToStarted/else startNewRenderPass.
- angle::Result getCommandBufferForDraw(ContextVk *contextVk,
- vk::CommandBuffer **commandBufferOut,
- vk::RecordingMode *modeOut);
-
// The 'in' rectangles must be clipped to the scissor and FBO. The clipping is done in 'blit'.
angle::Result blitWithCommand(ContextVk *contextVk,
const gl::Rectangle &readRectIn,
@@ -159,12 +163,27 @@ class FramebufferVk : public FramebufferImpl
angle::Result getFramebuffer(ContextVk *contextVk, vk::Framebuffer **framebufferOut);
- angle::Result clearWithClearAttachments(ContextVk *contextVk,
- bool clearColor,
- bool clearDepth,
- bool clearStencil,
- const VkClearDepthStencilValue &clearDepthStencilValue);
- angle::Result clearWithDraw(ContextVk *contextVk, VkColorComponentFlags colorMaskFlags);
+ angle::Result clearImpl(const gl::Context *context,
+ gl::DrawBufferMask clearColorBuffers,
+ bool clearDepth,
+ bool clearStencil,
+ const VkClearColorValue &clearColorValue,
+ const VkClearDepthStencilValue &clearDepthStencilValue);
+ angle::Result clearWithRenderPassOp(ContextVk *contextVk,
+ const gl::Rectangle &clearArea,
+ gl::DrawBufferMask clearColorBuffers,
+ bool clearDepth,
+ bool clearStencil,
+ const VkClearColorValue &clearColorValue,
+ const VkClearDepthStencilValue &clearDepthStencilValue);
+ angle::Result clearWithDraw(ContextVk *contextVk,
+ const gl::Rectangle &clearArea,
+ gl::DrawBufferMask clearColorBuffers,
+ bool clearStencil,
+ VkColorComponentFlags colorMaskFlags,
+ uint8_t stencilMask,
+ const VkClearColorValue &clearColorValue,
+ uint8_t clearStencilValue);
void updateActiveColorMasks(size_t colorIndex, bool r, bool g, bool b, bool a);
void updateRenderPassDesc();
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp
index d0677d63b9f..2233e840600 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp
@@ -156,7 +156,6 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState,
// Parse attribute locations and replace them in the vertex shader.
// See corresponding code in OutputVulkanGLSL.cpp.
- // TODO(jmadill): Also do the same for ESSL 3 fragment outputs.
for (const sh::Attribute &attribute : programState.getAttributes())
{
// Warning: If we endup supporting ES 3.0 shaders and up, Program::linkAttributes is going
@@ -182,6 +181,34 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState,
InsertQualifierSpecifierString(&vertexSource, attribute.name, "");
}
+ // Parse output locations and replace them in the fragment shader.
+ // See corresponding code in OutputVulkanGLSL.cpp.
+ // TODO(syoussefi): Add support for EXT_blend_func_extended. http://anglebug.com/3385
+ const auto &outputLocations = programState.getOutputLocations();
+ const auto &outputVariables = programState.getOutputVariables();
+ for (const gl::VariableLocation &outputLocation : outputLocations)
+ {
+ if (outputLocation.arrayIndex == 0 && outputLocation.used() && !outputLocation.ignored)
+ {
+ const sh::OutputVariable &outputVar = outputVariables[outputLocation.index];
+
+ std::string locationString;
+ if (outputVar.location != -1)
+ {
+ locationString = "location = " + Str(outputVar.location);
+ }
+ else
+ {
+ // If there is only one output, it is allowed not to have a location qualifier, in
+ // which case it defaults to 0. GLSL ES 3.00 spec, section 4.3.8.2.
+ ASSERT(outputVariables.size() == 1);
+ locationString = "location = 0";
+ }
+
+ InsertLayoutSpecifierString(&fragmentSource, outputVar.name, locationString);
+ }
+ }
+
// Assign varying locations.
for (const gl::PackedVaryingRegister &varyingReg : resources.varyingPacking.getRegisterList())
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp
new file mode 100644
index 00000000000..a645b973f54
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp
@@ -0,0 +1,130 @@
+// 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.
+//
+// MemoryObjectVk.cpp: Defines the class interface for MemoryObjectVk, implementing
+// MemoryObjectImpl.
+
+#include "libANGLE/renderer/vulkan/MemoryObjectVk.h"
+
+#include <vulkan/vulkan.h>
+
+#include "common/debug.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/renderer/vulkan/ContextVk.h"
+#include "libANGLE/renderer/vulkan/RendererVk.h"
+
+#if !defined(ANGLE_PLATFORM_WINDOWS)
+# include <unistd.h>
+#else
+# include <io.h>
+#endif
+
+namespace rx
+{
+
+namespace
+{
+
+constexpr int kInvalidFd = -1;
+
+#if defined(ANGLE_PLATFORM_WINDOWS)
+int close(int fd)
+{
+ return _close(fd);
+}
+#endif
+
+} // namespace
+
+MemoryObjectVk::MemoryObjectVk() : mSize(0), mFd(kInvalidFd) {}
+
+MemoryObjectVk::~MemoryObjectVk() = default;
+
+void MemoryObjectVk::onDestroy(const gl::Context *context)
+{
+ if (mFd != kInvalidFd)
+ {
+ close(mFd);
+ mFd = kInvalidFd;
+ }
+}
+
+angle::Result MemoryObjectVk::importFd(gl::Context *context,
+ GLuint64 size,
+ gl::HandleType handleType,
+ GLint fd)
+{
+ switch (handleType)
+ {
+ case gl::HandleType::OpaqueFd:
+ return importOpaqueFd(context, size, fd);
+
+ default:
+ UNREACHABLE();
+ return angle::Result::Stop;
+ }
+}
+
+angle::Result MemoryObjectVk::importOpaqueFd(gl::Context *context, GLuint64 size, GLint fd)
+{
+ ASSERT(mFd == kInvalidFd);
+ mFd = fd;
+ mSize = size;
+ return angle::Result::Continue;
+}
+
+angle::Result MemoryObjectVk::createImage(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ GLuint64 offset,
+ vk::ImageHelper *image)
+{
+ ContextVk *contextVk = vk::GetImpl(context);
+ RendererVk *renderer = contextVk->getRenderer();
+
+ const vk::Format &vkFormat = renderer->getFormat(internalFormat);
+
+ static constexpr VkImageUsageFlags kAllImageUsageFlags =
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
+ VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT |
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
+
+ // All supported usage flags must be specified.
+ // See EXT_external_objects issue 13.
+ // TODO(spang): Query supported usage for format via vkGetPhysicalDeviceFormatProperties.
+ // http://anglebug.com/3389
+ VkImageUsageFlags imageUsageFlags = kAllImageUsageFlags;
+
+ VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {};
+ externalMemoryImageCreateInfo.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
+ externalMemoryImageCreateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+
+ ANGLE_TRY(image->initExternal(contextVk, type, size, vkFormat, 1, imageUsageFlags,
+ vk::ImageLayout::ExternalPreInitialized,
+ &externalMemoryImageCreateInfo, levels, 1));
+
+ VkMemoryRequirements externalMemoryRequirements;
+ image->getImage().getMemoryRequirements(renderer->getDevice(), &externalMemoryRequirements);
+
+ ASSERT(mFd != -1);
+ VkImportMemoryFdInfoKHR importMemoryFdInfo = {};
+ importMemoryFdInfo.sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR;
+ importMemoryFdInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
+ importMemoryFdInfo.fd = dup(mFd);
+
+ // TODO(jmadill, spang): Memory sub-allocation. http://anglebug.com/2162
+ ASSERT(offset == 0);
+ ASSERT(externalMemoryRequirements.size == mSize);
+
+ VkMemoryPropertyFlags flags = 0;
+ ANGLE_TRY(image->initExternalMemory(contextVk, renderer->getMemoryProperties(),
+ externalMemoryRequirements, &importMemoryFdInfo,
+ VK_QUEUE_FAMILY_EXTERNAL, flags));
+
+ return angle::Result::Continue;
+}
+
+} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.h
new file mode 100644
index 00000000000..9963f3d7820
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.h
@@ -0,0 +1,48 @@
+// 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.
+//
+// MemoryObjectVk.h: Defines the class interface for MemoryObjectVk,
+// implementing MemoryObjectImpl.
+
+#ifndef LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
+#define LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
+
+#include "libANGLE/renderer/MemoryObjectImpl.h"
+#include "libANGLE/renderer/vulkan/vk_helpers.h"
+#include "libANGLE/renderer/vulkan/vk_wrapper.h"
+
+namespace rx
+{
+
+class MemoryObjectVk : public MemoryObjectImpl
+{
+ public:
+ MemoryObjectVk();
+ ~MemoryObjectVk() override;
+
+ void onDestroy(const gl::Context *context) override;
+
+ angle::Result importFd(gl::Context *context,
+ GLuint64 size,
+ gl::HandleType handleType,
+ GLint fd) override;
+
+ angle::Result createImage(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ GLuint64 offset,
+ vk::ImageHelper *image);
+
+ private:
+ angle::Result importOpaqueFd(gl::Context *context, GLuint64 size, GLint fd);
+
+ GLuint64 mSize;
+ int mFd;
+};
+
+} // namespace rx
+
+#endif // LIBANGLE_RENDERER_VULKAN_MEMORYOBJECTVK_H_
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 206bc20ce3b..f9b6e9b072e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -927,16 +927,15 @@ angle::Result ProgramVk::updateDescriptorSets(ContextVk *contextVk,
{
constexpr uint32_t kShaderTypeMin = static_cast<uint32_t>(gl::kGLES2ShaderTypeMin);
constexpr uint32_t kShaderTypeMax = static_cast<uint32_t>(gl::kGLES2ShaderTypeMax);
- commandBuffer->bindDescriptorSets(
- VK_PIPELINE_BIND_POINT_GRAPHICS, mPipelineLayout.get(), low,
- mUsedDescriptorSetRange.length(), &mDescriptorSets[low],
+ commandBuffer->bindGraphicsDescriptorSets(
+ mPipelineLayout.get(), low, mUsedDescriptorSetRange.length(), &mDescriptorSets[low],
kShaderTypeMax - kShaderTypeMin + 1, mUniformBlocksOffsets.data() + kShaderTypeMin);
}
else
{
- commandBuffer->bindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, mPipelineLayout.get(),
- low, mUsedDescriptorSetRange.length(),
- &mDescriptorSets[low], 0, nullptr);
+ commandBuffer->bindGraphicsDescriptorSets(mPipelineLayout.get(), low,
+ mUsedDescriptorSetRange.length(),
+ &mDescriptorSets[low], 0, nullptr);
}
return angle::Result::Continue;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp
index 42c42992c91..9aa1febdca9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/QueryVk.cpp
@@ -110,7 +110,7 @@ angle::Result QueryVk::getResult(const gl::Context *context, bool wait)
// has pending work should flush begin too.
if (mQueryHelper.hasPendingWork(renderer))
{
- ANGLE_TRY(renderer->flush(contextVk));
+ ANGLE_TRY(contextVk->flushImpl());
ASSERT(!mQueryHelperTimeElapsedBegin.hasPendingWork(renderer));
ASSERT(!mQueryHelper.hasPendingWork(renderer));
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/README.md b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/README.md
index dba3eec81bc..f615a611d8e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/README.md
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/README.md
@@ -3,24 +3,26 @@
ANGLE's Vulkan back-end implementation lives in this folder.
[Vulkan](https://www.khronos.org/vulkan/) is an explicit graphics API. It has a lot in common with
-other explicit APIs such as Microsoft's
-[D3D12](https://docs.microsoft.com/en-us/windows/desktop/direct3d12/directx-12-programming-guide)
-and Apple's [Metal](https://developer.apple.com/metal/). Compared to APIs like OpenGL or D3D11
-explicit APIs can offer a number of significant benefits:
+other explicit APIs such as Microsoft's [D3D12][D3D12 Guide] and Apple's
+[Metal](https://developer.apple.com/metal/). Compared to APIs like OpenGL or D3D11 explicit APIs can
+offer a number of significant benefits:
* Lower API call CPU overhead.
* A smaller API surface with more direct hardware control.
* Better support for multi-core programming.
* Vulkan in particular has open-source tooling and tests.
+[D3D12 Guide]: https://docs.microsoft.com/en-us/windows/desktop/direct3d12/directx-12-programming-guide
+
+[TOC]
+
## Back-end Design
The [RendererVk](RendererVk.cpp) is a singleton. RendererVk owns shared global resources like the
-[VkDevice](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkDevice.html),
-[VkQueue](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkQueue.html), the
-[Vulkan format tables](vk_format_utils.h) and [internal Vulkan shaders](shaders). The back-end
-creates a new [ContextVk](ContextVk.cpp) instance to manage each allocated OpenGL Context. ContextVk
-processes state changes and handles action commands like `glDrawArrays` and `glDrawElements`.
+[VkDevice][VkDevice], [VkQueue][VkQueue], the [Vulkan format tables](vk_format_utils.h) and
+[internal Vulkan shaders](shaders). The back-end creates a new [ContextVk](ContextVk.cpp) instance
+to manage each allocated OpenGL Context. ContextVk processes state changes and handles action
+commands like `glDrawArrays` and `glDrawElements`.
### Fast OpenGL State Transitions
@@ -28,25 +30,20 @@ Typical OpenGL programs issue a few small state change commands between draw cal
the typical app's use case to be as fast as possible so this leads to unique performance challenges.
Vulkan in quite different from OpenGL because it requires a separate compiled
-[VkPipeline](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkPipeline.html)
-for each state vector. Compiling VkPipelines is multiple orders of magnitude slower than enabling or
-disabling an OpenGL render state. To speed this up we use three levels of caching when transitioning
-states in the Vulkan back-end.
+[VkPipeline][VkPipeline] for each state vector. Compiling VkPipelines is multiple orders of
+magnitude slower than enabling or disabling an OpenGL render state. To speed this up we use three
+levels of caching when transitioning states in the Vulkan back-end.
-The first level is the driver's
-[VkPipelineCache](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkPipelineCache.html). The driver cache reduces pipeline recompilation time
-significantly. But even cached pipeline recompilations are orders of manitude slower than OpenGL
-state changes.
+The first level is the driver's [VkPipelineCache][VkPipelineCache]. The driver
+cache reduces pipeline recompilation time significantly. But even cached
+pipeline recompilations are orders of manitude slower than OpenGL state changes.
The second level cache is an ANGLE-owned hash map from OpenGL state vectors to compiled pipelines.
-See
-[GraphicsPipelineCache](https://chromium.googlesource.com/angle/angle/+/225f08bf85a368f905362cdd1366e4795680452c/src/libANGLE/renderer/vulkan/vk_cache_utils.h#498)
-in [vk_cache_utils.h](vk_cache_utils.h). ANGLE's
-[GraphicsPipelineDesc](https://chromium.googlesource.com/angle/angle/+/225f08bf85a368f905362cdd1366e4795680452c/src/libANGLE/renderer/vulkan/vk_cache_utils.h#244)
-class is a tightly packed 256-byte description of the current OpenGL rendering state. We
-also use a [xxHash](https://github.com/Cyan4973/xxHash) for the fastest possible hash computation.
-The hash map speeds up state changes considerably. But it is still significantly slower than OpenGL
-implementations.
+See [GraphicsPipelineCache][GraphicsPipelineCache] in [vk_cache_utils.h](vk_cache_utils.h). ANGLE's
+[GraphicsPipelineDesc][GraphicsPipelineDesc] class is a tightly packed 256-byte description of the
+current OpenGL rendering state. We also use a [xxHash](https://github.com/Cyan4973/xxHash) for the
+fastest possible hash computation. The hash map speeds up state changes considerably. But it is
+still significantly slower than OpenGL implementations.
To get best performance we use a transition table from each OpenGL state vector to neighbouring
state vectors. The transition table points from GraphicsPipelineCache entries directly to
@@ -63,3 +60,186 @@ Note that the current design of the transition table stores transitions in an un
applications map from one state to many this will slow down the transition time. This could be
improved in the future using a faster look up. For instance we could keep a sorted transition table
or use a small hash map for transitions.
+
+[VkDevice]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkDevice.html
+[VkQueue]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkQueue.html
+[VkPipeline]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkPipeline.html
+[VkPipelineCache]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkPipelineCache.html
+[GraphicsPipelineCache]: https://chromium.googlesource.com/angle/angle/+/225f08bf85a368f905362cdd1366e4795680452c/src/libANGLE/renderer/vulkan/vk_cache_utils.h#498
+[GraphicsPipelineDesc]: https://chromium.googlesource.com/angle/angle/+/225f08bf85a368f905362cdd1366e4795680452c/src/libANGLE/renderer/vulkan/vk_cache_utils.h#244
+
+### Shader Module Compilation
+
+ANGLE converts application shaders into Vulkan [VkShaderModules][VkShaderModule] through a series
+of steps:
+
+1. **ANGLE Internal Translation**: The initial calls to `glCompileShader` are passed to the [ANGLE
+shader translator][translator]. The translator compiles application shaders into Vulkan-compatible
+GLSL. Vulkan-compatible GLSL matches the [GL_KHR_vulkan_glsl][GL_KHR_vulkan_glsl] extension spec
+with some additional workarounds and emulation. We emulate OpenGL's different depth range, viewport
+y flipping, default uniforms, and OpenGL [line segment
+rasterization](#opengl-line-segment-rasterization). For more info see
+[TranslatorVulkan.cpp][TranslatorVulkan.cpp]. After initial compilation the shaders are not
+complete. They are templated with markers that are filled in later at link time.
+
+1. **Link-Time Translation**: During a call to `glLinkProgram` the Vulkan back-end can know the
+necessary locations and properties to write to connect the shader stage interfaces. We get the
+completed shader source using ANGLE's [GlslangWrapper][GlslangWrapper.cpp] helper class. We still
+cannot generate `VkShaderModules` since some ANGLE features like [OpenGL line
+rasterization](#opengl-line-segment-rasterization) emulation depend on draw-time information.
+
+1. **Draw-time SPIR-V Generation**: Once the application records a draw call we use Khronos'
+[glslang][glslang] to convert the Vulkan-compatible GLSL into SPIR-V with the correct draw-time
+defines. The SPIR-V is then compiled into `VkShaderModules`. For details please see
+[GlslangWrapper.cpp][GlslangWrapper.cpp]. The `VkShaderModules` are then used by `VkPipelines`. Note
+that we currently don't use [SPIRV-Tools][SPIRV-Tools] to perform any SPIR-V optimization. This
+could be something to improve on in the future.
+
+See the below diagram for a high-level view of the shader translation flow:
+
+<!-- Generated from https://bramp.github.io/js-sequence-diagrams/
+participant App
+participant "ANGLE Front-end"
+participant "Vulkan Back-end"
+participant "ANGLE Translator"
+participant "GlslangWrapper"
+participant "Glslang"
+
+App->"ANGLE Front-end": glCompileShader (VS)
+"ANGLE Front-end"->"Vulkan Back-end": ShaderVk::compile
+"Vulkan Back-end"->"ANGLE Translator": sh::Compile
+"ANGLE Translator"- ->"ANGLE Front-end": return Vulkan-compatible GLSL
+
+Note right of "ANGLE Front-end": Source is templated\nwith markers to be\nfilled at link time.
+
+Note right of App: Same for FS, GS, etc...
+
+App->"ANGLE Front-end": glCreateProgram (...)
+App->"ANGLE Front-end": glAttachShader (...)
+App->"ANGLE Front-end": glLinkProgram
+"ANGLE Front-end"->"Vulkan Back-end": ProgramVk::link
+
+Note right of "Vulkan Back-end": ProgramVk inits uniforms,\nlayouts, and descriptors.
+
+"Vulkan Back-end"->GlslangWrapper: GlslangWrapper::GetShaderSource
+GlslangWrapper- ->"Vulkan Back-end": return filled-in sources
+
+Note right of "Vulkan Back-end": Source is templated with\ndefines to be resolved at\ndraw time.
+
+"Vulkan Back-end"- ->"ANGLE Front-end": return success
+
+Note right of App: App execution continues...
+
+App->"ANGLE Front-end": glDrawArrays (any draw)
+"ANGLE Front-end"->"Vulkan Back-end": ContextVk::drawArrays
+
+"Vulkan Back-end"->GlslangWrapper: GlslangWrapper::GetShaderCode (with defines)
+GlslangWrapper->Glslang: GlslangToSpv
+Glslang- ->"Vulkan Back-end": Return SPIR-V
+
+Note right of "Vulkan Back-end": We init VkShaderModules\nand VkPipeline then\nrecord the draw.
+
+"Vulkan Back-end"- ->"ANGLE Front-end": return success
+-->
+
+![Vulkan Shader Translation Flow](https://raw.githubusercontent.com/google/angle/master/src/libANGLE/renderer/vulkan/doc/img/VulkanShaderTranslation.svg?sanitize=true)
+
+[VkShaderModule]: https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkShaderModule.html
+[translator]: https://chromium.googlesource.com/angle/angle/+/refs/heads/master/src/compiler/translator/
+[GL_KHR_vulkan_glsl]: https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_vulkan_glsl.txt
+[TranslatorVulkan.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/master/src/compiler/translator/TranslatorVulkan.cpp
+[glslang]: https://github.com/KhronosGroup/glslang
+[GlslangWrapper.cpp]: https://chromium.googlesource.com/angle/angle/+/refs/heads/master/src/libANGLE/renderer/vulkan/GlslangWrapper.cpp
+[SPIRV-Tools]: https://github.com/KhronosGroup/SPIRV-Tools
+
+### OpenGL Line Segment Rasterization
+
+OpenGL and Vulkan both render line segments as a series of pixels between two points. They differ in
+which pixels cover the line.
+
+For single sample rendering Vulkan uses an algorithm based on quad coverage. A small shape is
+extruded around the line segment. Samples covered by the shape then represent the line segment. See
+[the Vulkan spec][VulkanLineRaster] for more details.
+
+OpenGL's algorithm is based on [Bresenham's line algorithm][Bresenham]. Bresenham's algorithm
+selects pixels on the line between the two segment points. Note Bresenham's does not support
+multisampling. When compared visually you can see the Vulkan line segment rasterization algorithm
+always selects a superset of the line segment pixels rasterized in OpenGL. See this example:
+
+![Vulkan vs OpenGL Line Rasterization][VulkanVsGLLineRaster]
+
+The OpenGL spec defines a "diamond-exit" rule to select fragments on a line. Please refer to the 2.0
+spec section 3.4.1 "Basic Line Segment Rasterization" spec for more details. To implement this rule
+we inject a small computation to test if a pixel falls within the diamond in the start of the pixel
+shader. If the pixel fails the diamond test we discard the fragment. Note that we only perform this
+test when drawing lines. See the section on [Shader Compilation](#shader-module-compilation) for
+more info. See the below diagram for an illustration of the diamond rule:
+
+![OpenGL Diamond Rule Example][DiamondRule]
+
+We can implement the OpenGL test by checking the intersection of the line and the medial axes of the
+pixel `p`. If the length of the line segment between intersections `p` and the point center is
+greater than a half-pixel for all possible `p` then the pixel is not on the segment. To solve for
+`p` we use the pixel center `a` given by `gl_FragCoord` and the projection of `a` onto the line
+segment `b` given by the interpolated `gl_Position`. Since `gl_Position` is not available in the
+fragment shader we must add an internal position varying when drawing lines.
+
+The full code derivation is omitted for brevity. It reduces to the following shader snippet:
+
+```vec2 position = PositionVarying.xy / PositionVarying.w;
+vec2 b = ((position * 0.5) + 0.5) * gl_Viewport.zw + gl_Viewport.xy;
+vec2 ba = abs(b - gl_FragCoord.xy);
+vec2 ba2 = 2.0 * (ba * ba);
+vec2 bp = ba2 + ba2.yx - ba;
+if (bp.x > epsilon && bp.y > epsilon)
+ discard;
+```
+
+Note that we must also pass the viewport size as an internal uniform. We use a small epsilon value
+to correct for cases when the line segment is perfectly parallel or perpendicular to the window. For
+code please see [TranslatorVulkan.cpp][TranslatorVulkan.cpp] under
+`AddLineSegmentRasterizationEmulation`.
+
+[VulkanLineRaster]: https://www.khronos.org/registry/vulkan/specs/1.1/html/chap24.html#primsrast-lines-basic
+[Bresenham]: https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
+[VulkanVsGLLineRaster]: doc/img/LineRasterComparison.gif
+[DiamondRule]: doc/img/LineRasterPixelExample.png
+
+### Format Tables and Format Emulation
+
+#### Overrides and Fallbacks
+
+The [required Vulkan format support][VulkanRequiredSupport] tables do not implement the full set of
+formats needed for OpenGL conformance with extensions. ANGLE emulates missing formats using *format
+overrides* and *format fallbacks*.
+
+An *override* implements a missing GL format with a required format in all cases. For example, the
+luminance texture format `L8_UNORM` does not exist in Vulkan. We override `L8_UNORM` with the
+required image format `R8_UNORM`.
+
+A *fallback* is one or more non-required formats ANGLE checks for support at runtime. For example,
+`R8_UNORM` is not a required vertex buffer format. Some drivers do support `R8_UNORM` for vertex
+buffers. So at runtime we check for sampled image support and fall back to `R32_FLOAT` if `R8_UNORM`
+is not supported.
+
+#### The Vulkan Format Table
+
+Overrides and fallbacks are implemented in ANGLE's [Vulkan format
+table][vk_format_table_autogen.cpp]. The table is auto-generated by
+[`gen_vk_format_table.py`](gen_vk_format_table.py). We store the mapping from
+[`angle::Format::ID`](../FormatID_autogen.h) to [VkFormat][VkFormat] in
+[`vk_format_map.json`](vk_format_map.json). The format map also lists the overrides and fallbacks.
+To update the tables please modify the format map JSON and then run
+[`scripts/run_code_generation.py`][RunCodeGeneration].
+
+The [`vk::Format`](vk_format_utils.h) class describes the information ANGLE needs for a particular
+`VkFormat`. The 'ANGLE' format ID is a reference to the front-end format. The 'Image' or 'Buffer'
+format are the native Vulkan formats that implement a particular front-end format for `VkImages` and
+`VkBuffers`. For the above example of `R8_UNORM` overriding `L8_UNORM`, `L8_UNORM` is the ANGLE
+format and `R8_UNORM` is the Image format.
+
+For more information please see the source files.
+
+[VulkanRequiredSupport]: https://renderdoc.org/vkspec_chunked/chap37.html#features-required-format-support
+[VkFormat]: https://renderdoc.org/vkspec_chunked/chap37.html#VkFormat
+[RunCodeGeneration]: ../../../../scripts/run_code_generation.py \ No newline at end of file
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp
index 8035c8ee23c..854130d75bb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.cpp
@@ -52,42 +52,52 @@ void RenderTargetVk::reset()
mOwner = nullptr;
}
-void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk,
- vk::CommandBuffer *commandBuffer,
- vk::RenderPassDesc *renderPassDesc)
+angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk,
+ vk::FramebufferHelper *framebufferVk,
+ vk::CommandBuffer *commandBuffer,
+ vk::RenderPassDesc *renderPassDesc)
{
ASSERT(commandBuffer->valid());
- ASSERT(!mImage->getFormat().textureFormat().hasDepthOrStencilBits());
+ ASSERT(!mImage->getFormat().imageFormat().hasDepthOrStencilBits());
// Store the attachment info in the renderPassDesc.
renderPassDesc->packAttachment(mImage->getFormat());
+ ANGLE_TRY(ensureImageInitialized(contextVk));
+
// TODO(jmadill): Use automatic layout transition. http://anglebug.com/2361
mImage->changeLayout(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::ColorAttachment,
commandBuffer);
// Set up dependencies between the RT resource and the Framebuffer.
mImage->addWriteDependency(framebufferVk);
+
+ return angle::Result::Continue;
}
-void RenderTargetVk::onDepthStencilDraw(vk::FramebufferHelper *framebufferVk,
- vk::CommandBuffer *commandBuffer,
- vk::RenderPassDesc *renderPassDesc)
+angle::Result RenderTargetVk::onDepthStencilDraw(ContextVk *contextVk,
+ vk::FramebufferHelper *framebufferVk,
+ vk::CommandBuffer *commandBuffer,
+ vk::RenderPassDesc *renderPassDesc)
{
ASSERT(commandBuffer->valid());
- ASSERT(mImage->getFormat().textureFormat().hasDepthOrStencilBits());
+ ASSERT(mImage->getFormat().imageFormat().hasDepthOrStencilBits());
// Store the attachment info in the renderPassDesc.
renderPassDesc->packAttachment(mImage->getFormat());
// TODO(jmadill): Use automatic layout transition. http://anglebug.com/2361
- const angle::Format &format = mImage->getFormat().textureFormat();
+ const angle::Format &format = mImage->getFormat().imageFormat();
VkImageAspectFlags aspectFlags = vk::GetDepthStencilAspectFlags(format);
+ ANGLE_TRY(ensureImageInitialized(contextVk));
+
mImage->changeLayout(aspectFlags, vk::ImageLayout::DepthStencilAttachment, commandBuffer);
// Set up dependencies between the RT resource and the Framebuffer.
mImage->addWriteDependency(framebufferVk);
+
+ return angle::Result::Continue;
}
vk::ImageHelper &RenderTargetVk::getImage()
@@ -119,10 +129,10 @@ const vk::Format &RenderTargetVk::getImageFormat() const
return mImage->getFormat();
}
-const gl::Extents &RenderTargetVk::getImageExtents() const
+gl::Extents RenderTargetVk::getExtents() const
{
ASSERT(mImage && mImage->valid());
- return mImage->getExtents();
+ return mImage->getLevelExtents2D(mLevelIndex);
}
void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView)
@@ -172,8 +182,11 @@ angle::Result RenderTargetVk::ensureImageInitialized(ContextVk *contextVk)
{
if (mOwner)
{
+ // If the render target source is a texture, make sure the image is initialized and its
+ // staged updates flushed.
return mOwner->ensureImageInitialized(contextVk);
}
+
return angle::Result::Continue;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h
index bc6ace30740..de816e2fa58 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h
@@ -20,7 +20,6 @@ namespace rx
{
namespace vk
{
-class CommandBuffer;
struct Format;
class FramebufferHelper;
class ImageHelper;
@@ -52,12 +51,14 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
void reset();
// Note: RenderTargets should be called in order, with the depth/stencil onRender last.
- void onColorDraw(vk::FramebufferHelper *framebufferVk,
- vk::CommandBuffer *commandBuffer,
- vk::RenderPassDesc *renderPassDesc);
- void onDepthStencilDraw(vk::FramebufferHelper *framebufferVk,
- vk::CommandBuffer *commandBuffer,
- vk::RenderPassDesc *renderPassDesc);
+ angle::Result onColorDraw(ContextVk *contextVk,
+ vk::FramebufferHelper *framebufferVk,
+ vk::CommandBuffer *commandBuffer,
+ vk::RenderPassDesc *renderPassDesc);
+ angle::Result onDepthStencilDraw(ContextVk *contextVk,
+ vk::FramebufferHelper *framebufferVk,
+ vk::CommandBuffer *commandBuffer,
+ vk::RenderPassDesc *renderPassDesc);
vk::ImageHelper &getImage();
const vk::ImageHelper &getImage() const;
@@ -72,7 +73,7 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget
vk::ImageView *getReadImageView() const;
const vk::Format &getImageFormat() const;
- const gl::Extents &getImageExtents() const;
+ gl::Extents getExtents() const;
size_t getLevelIndex() const { return mLevelIndex; }
size_t getLayerIndex() const { return mLayerIndex; }
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index 1e485a90f7e..3e911b8cf61 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -17,14 +17,6 @@
namespace rx
{
-
-namespace
-{
-constexpr VkClearDepthStencilValue kDefaultClearDepthStencilValue = {0.0f, 1};
-constexpr VkClearColorValue kBlackClearColorValue = {{0}};
-
-} // anonymous namespace
-
RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
: RenderbufferImpl(state), mOwnsImage(false), mImage(nullptr)
{}
@@ -71,7 +63,7 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
mOwnsImage = true;
}
- const angle::Format &textureFormat = vkFormat.textureFormat();
+ const angle::Format &textureFormat = vkFormat.imageFormat();
bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
const VkImageUsageFlags usage =
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
@@ -92,19 +84,9 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
ANGLE_TRY(mImage->initImageView(contextVk, gl::TextureType::_2D, aspect, gl::SwizzleState(),
&mImageView, 0, 1));
- // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
- vk::CommandBuffer *commandBuffer = nullptr;
- ANGLE_TRY(mImage->recordCommands(contextVk, &commandBuffer));
-
- if (isDepthOrStencilFormat)
- {
- mImage->clearDepthStencil(aspect, aspect, kDefaultClearDepthStencilValue,
- commandBuffer);
- }
- else
- {
- mImage->clearColor(kBlackClearColorValue, 0, 1, commandBuffer);
- }
+ // Clear the renderbuffer if it has emulated channels.
+ ANGLE_TRY(mImage->clearIfEmulatedFormat(vk::GetImpl(context), gl::ImageIndex::Make2D(0),
+ vkFormat));
mRenderTarget.init(mImage, &mImageView, 0, 0, nullptr);
}
@@ -135,7 +117,7 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex
mOwnsImage = false;
const vk::Format &vkFormat = renderer->getFormat(image->getFormat().info->sizedInternalFormat);
- const angle::Format &textureFormat = vkFormat.textureFormat();
+ const angle::Format &textureFormat = vkFormat.imageFormat();
VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat);
@@ -172,8 +154,8 @@ angle::Result RenderbufferVk::getAttachmentRenderTarget(const gl::Context *conte
angle::Result RenderbufferVk::initializeContents(const gl::Context *context,
const gl::ImageIndex &imageIndex)
{
- UNIMPLEMENTED();
- return angle::Result::Continue;
+ mImage->stageSubresourceRobustClear(imageIndex, mImage->getFormat().angleFormat());
+ return mImage->flushAllStagedUpdates(vk::GetImpl(context));
}
void RenderbufferVk::releaseOwnershipOfImage(const gl::Context *context)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp
index 9e14e4b7c39..49bebbcbefa 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -41,6 +41,7 @@ const uint32_t kMockDeviceID = 0xf005ba11;
constexpr char kMockDeviceName[] = "Vulkan Mock Device";
constexpr size_t kInFlightCommandsLimit = 100u;
constexpr VkFormatFeatureFlags kInvalidFormatFeatureFlags = static_cast<VkFormatFeatureFlags>(-1);
+constexpr size_t kDefaultPoolAllocatorPageSize = 16 * 1024;
} // anonymous namespace
namespace rx
@@ -457,6 +458,34 @@ void ChoosePhysicalDevice(const std::vector<VkPhysicalDevice> &physicalDevices,
vkGetPhysicalDeviceProperties(*physicalDeviceOut, physicalDevicePropertiesOut);
}
+void InitializeSubmitInfo(VkSubmitInfo *submitInfo,
+ const vk::PrimaryCommandBuffer &commandBuffer,
+ const vk::Semaphore *waitSemaphore,
+ VkPipelineStageFlags *waitStageMask,
+ const vk::Semaphore *signalSemaphore)
+{
+ // Verify that the submitInfo has been zero'd out.
+ ASSERT(submitInfo->waitSemaphoreCount == 0);
+ ASSERT(submitInfo->signalSemaphoreCount == 0);
+
+ submitInfo->sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submitInfo->commandBufferCount = 1;
+ submitInfo->pCommandBuffers = commandBuffer.ptr();
+
+ if (waitSemaphore)
+ {
+ submitInfo->waitSemaphoreCount = 1;
+ submitInfo->pWaitSemaphores = waitSemaphore->ptr();
+ submitInfo->pWaitDstStageMask = waitStageMask;
+ }
+
+ if (signalSemaphore)
+ {
+ submitInfo->signalSemaphoreCount = 1;
+ submitInfo->pSignalSemaphores = signalSemaphore->ptr();
+ }
+}
+
// Initially dumping the command graphs is disabled.
constexpr bool kEnableCommandGraphDiagnostics = false;
@@ -505,7 +534,8 @@ RendererVk::RendererVk()
mCurrentQueueSerial(mQueueSerialFactory.generate()),
mDeviceLost(false),
mPipelineCacheVkUpdateTimeout(kPipelineCacheVkUpdatePeriod),
- mCommandGraph(kEnableCommandGraphDiagnostics),
+ mPoolAllocator(kDefaultPoolAllocatorPageSize, 1),
+ mCommandGraph(kEnableCommandGraphDiagnostics, &mPoolAllocator),
mGpuEventsEnabled(false),
mGpuClockSync{std::numeric_limits<double>::max(), std::numeric_limits<double>::max()},
mGpuEventTimestampOrigin(0)
@@ -521,7 +551,7 @@ void RendererVk::onDestroy(vk::Context *context)
if (!mInFlightCommands.empty() || !mGarbage.empty())
{
// TODO(jmadill): Not nice to pass nullptr here, but shouldn't be a problem.
- (void)finish(context);
+ (void)finish(context, nullptr, nullptr);
}
mUtils.destroy(mDevice);
@@ -531,7 +561,6 @@ void RendererVk::onDestroy(vk::Context *context)
mRenderPassCache.destroy(mDevice);
mPipelineCache.destroy(mDevice);
- mSubmitSemaphorePool.destroy(mDevice);
mShaderLibrary.destroy(mDevice);
mGpuEventQueryPool.destroy(mDevice);
@@ -929,6 +958,11 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
enabledDeviceExtensions.push_back(VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME);
}
+ if (getFeatures().supportsAndroidHardwareBuffer || getFeatures().supportsExternalMemoryFd)
+ {
+ enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ }
+
#if defined(ANGLE_PLATFORM_ANDROID)
if (getFeatures().supportsAndroidHardwareBuffer)
{
@@ -941,15 +975,34 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
ASSERT(!getFeatures().supportsAndroidHardwareBuffer);
#endif
+ if (getFeatures().supportsExternalMemoryFd)
+ {
+ enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
+ }
+
+ if (getFeatures().supportsExternalSemaphoreFd)
+ {
+ enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME);
+ }
+
+ if (getFeatures().supportsExternalSemaphoreFd)
+ {
+ enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
+ }
+
std::sort(enabledDeviceExtensions.begin(), enabledDeviceExtensions.end(), StrLess);
ANGLE_VK_TRY(displayVk, VerifyExtensionsPresent(deviceExtensionNames, enabledDeviceExtensions));
// Select additional features to be enabled
VkPhysicalDeviceFeatures2KHR enabledFeatures = {};
enabledFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
- enabledFeatures.features.inheritedQueries = mPhysicalDeviceFeatures.inheritedQueries;
+ enabledFeatures.features.independentBlend = mPhysicalDeviceFeatures.independentBlend;
enabledFeatures.features.robustBufferAccess = mPhysicalDeviceFeatures.robustBufferAccess;
enabledFeatures.features.samplerAnisotropy = mPhysicalDeviceFeatures.samplerAnisotropy;
+ if (!vk::CommandBuffer::ExecutesInline())
+ {
+ enabledFeatures.features.inheritedQueries = mPhysicalDeviceFeatures.inheritedQueries;
+ }
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT divisorFeatures = {};
divisorFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT;
@@ -1018,9 +1071,6 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
// Initialize the vulkan pipeline cache.
ANGLE_TRY(initPipelineCache(displayVk));
- // Initialize the submission semaphore pool.
- ANGLE_TRY(mSubmitSemaphorePool.init(displayVk, vk::kDefaultSemaphorePoolSize));
-
#if ANGLE_ENABLE_VULKAN_GPU_TRACE_EVENTS
angle::PlatformMethods *platform = ANGLEPlatformCurrent();
ASSERT(platform);
@@ -1037,7 +1087,7 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
// Calculate the difference between CPU and GPU clocks for GPU event reporting.
ANGLE_TRY(mGpuEventQueryPool.init(displayVk, VK_QUERY_TYPE_TIMESTAMP,
vk::kDefaultTimestampQueryPoolSize));
- ANGLE_TRY(synchronizeCpuGpuTime(displayVk));
+ ANGLE_TRY(synchronizeCpuGpuTime(displayVk, nullptr, nullptr));
}
return angle::Result::Continue;
@@ -1139,8 +1189,16 @@ gl::Version RendererVk::getMaxSupportedESVersion() const
maxVersion = gl::Version(2, 0);
#endif
- // Vulkan inherited queries are required to support any GL query type
- if (!mPhysicalDeviceFeatures.inheritedQueries)
+ // If the command buffer doesn't support queries, we can't support ES3.
+ if (!vk::CommandBuffer::SupportsQueries(mPhysicalDeviceFeatures))
+ {
+ maxVersion = std::max(maxVersion, gl::Version(2, 0));
+ }
+
+ // If independentBlend is not supported, we can't have a mix of has-alpha and emulated-alpha
+ // render targets in a framebuffer. We also cannot perform masked clears of multiple render
+ // targets.
+ if (!mPhysicalDeviceFeatures.independentBlend)
{
maxVersion = std::max(maxVersion, gl::Version(2, 0));
}
@@ -1184,13 +1242,6 @@ void RendererVk::initFeatures(const ExtensionNameList &deviceExtensionNames)
mFeatures.clampPointSize = true;
}
- // We also need to clamp point size on several Android drivers.
- // TODO(jmadill): Remove suppression once fixed. http://anglebug.com/2599
- if (IsAndroid())
- {
- mFeatures.clampPointSize = true;
- }
-
#if defined(ANGLE_PLATFORM_ANDROID)
// Work around ineffective compute-graphics barriers on Nexus 5X.
// TODO(syoussefi): Figure out which other vendors and driver versions are affected.
@@ -1211,10 +1262,28 @@ void RendererVk::initFeatures(const ExtensionNameList &deviceExtensionNames)
ExtensionFound(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, deviceExtensionNames);
#endif
+ if (ExtensionFound(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, deviceExtensionNames))
+ {
+ mFeatures.supportsExternalMemoryFd = true;
+ }
+
+ if (ExtensionFound(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME, deviceExtensionNames))
+ {
+ mFeatures.supportsExternalSemaphoreFd = true;
+ }
+
if (IsLinux() && IsIntel(mPhysicalDeviceProperties.vendorID))
{
mFeatures.disableFifoPresentMode = true;
}
+
+ if (vk::CommandBuffer::ExecutesInline())
+ {
+ if (IsAndroid() && IsQualcomm(mPhysicalDeviceProperties.vendorID))
+ {
+ mFeatures.restartRenderPassAfterLoadOpClear = true;
+ }
+ }
}
void RendererVk::initPipelineCacheVkKey()
@@ -1255,31 +1324,6 @@ angle::Result RendererVk::initPipelineCache(DisplayVk *display)
return angle::Result::Continue;
}
-void RendererVk::getSubmitWaitSemaphores(
- vk::Context *context,
- angle::FixedVector<VkSemaphore, kMaxWaitSemaphores> *waitSemaphores,
- angle::FixedVector<VkPipelineStageFlags, kMaxWaitSemaphores> *waitStageMasks)
-{
- if (mSubmitLastSignaledSemaphore.getSemaphore())
- {
- waitSemaphores->push_back(mSubmitLastSignaledSemaphore.getSemaphore()->getHandle());
- waitStageMasks->push_back(VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
-
- // Return the semaphore to the pool (which will remain valid and unused until the
- // queue it's about to be waited on has finished execution).
- mSubmitSemaphorePool.freeSemaphore(context, &mSubmitLastSignaledSemaphore);
- }
-
- for (vk::SemaphoreHelper &semaphore : mSubmitWaitSemaphores)
- {
- waitSemaphores->push_back(semaphore.getSemaphore()->getHandle());
- waitStageMasks->push_back(VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
-
- mSubmitSemaphorePool.freeSemaphore(context, &semaphore);
- }
- mSubmitWaitSemaphores.clear();
-}
-
const gl::Caps &RendererVk::getNativeCaps() const
{
ensureCapsInitialized();
@@ -1316,31 +1360,33 @@ const vk::CommandPool &RendererVk::getCommandPool() const
return mCommandPool;
}
-angle::Result RendererVk::finish(vk::Context *context)
+angle::Result RendererVk::finish(vk::Context *context,
+ const vk::Semaphore *waitSemaphore,
+ const vk::Semaphore *signalSemaphore)
{
if (!mCommandGraph.empty())
{
TRACE_EVENT0("gpu.angle", "RendererVk::finish");
- vk::Scoped<vk::CommandBuffer> commandBatch(mDevice);
+ vk::Scoped<vk::PrimaryCommandBuffer> commandBatch(mDevice);
ANGLE_TRY(flushCommandGraph(context, &commandBatch.get()));
- angle::FixedVector<VkSemaphore, kMaxWaitSemaphores> waitSemaphores;
- angle::FixedVector<VkPipelineStageFlags, kMaxWaitSemaphores> waitStageMasks;
- getSubmitWaitSemaphores(context, &waitSemaphores, &waitStageMasks);
-
- VkSubmitInfo submitInfo = {};
- submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submitInfo.waitSemaphoreCount = static_cast<uint32_t>(waitSemaphores.size());
- submitInfo.pWaitSemaphores = waitSemaphores.data();
- submitInfo.pWaitDstStageMask = waitStageMasks.data();
- submitInfo.commandBufferCount = 1;
- submitInfo.pCommandBuffers = commandBatch.get().ptr();
- submitInfo.signalSemaphoreCount = 0;
- submitInfo.pSignalSemaphores = nullptr;
+ VkSubmitInfo submitInfo = {};
+ VkPipelineStageFlags waitMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
+ InitializeSubmitInfo(&submitInfo, commandBatch.get(), waitSemaphore, &waitMask,
+ signalSemaphore);
ANGLE_TRY(submitFrame(context, submitInfo, std::move(commandBatch.get())));
}
+ else
+ {
+ // If the sempahores were non-null, there will be breaks in the semaphore chain by not
+ // submitting them.
+ // TODO(geofflang): We can request the semaphores from the surface just before submission
+ // once contexts hold the command graph. http://anglebug.com/2464
+ ASSERT(waitSemaphore == nullptr);
+ ASSERT(signalSemaphore == nullptr);
+ }
ASSERT(mQueue != VK_NULL_HANDLE);
ANGLE_VK_TRY(context, vkQueueWaitIdle(mQueue));
@@ -1358,7 +1404,7 @@ angle::Result RendererVk::finish(vk::Context *context)
// multiple times towards the end of the application).
if (mGpuEvents.size() > 0)
{
- ANGLE_TRY(synchronizeCpuGpuTime(context));
+ ANGLE_TRY(synchronizeCpuGpuTime(context, nullptr, nullptr));
}
}
@@ -1432,7 +1478,7 @@ angle::Result RendererVk::checkCompletedCommands(vk::Context *context)
angle::Result RendererVk::submitFrame(vk::Context *context,
const VkSubmitInfo &submitInfo,
- vk::CommandBuffer &&commandBuffer)
+ vk::PrimaryCommandBuffer &&commandBuffer)
{
TRACE_EVENT0("gpu.angle", "RendererVk::submitFrame");
@@ -1555,41 +1601,37 @@ vk::CommandGraph *RendererVk::getCommandGraph()
return &mCommandGraph;
}
-angle::Result RendererVk::flushCommandGraph(vk::Context *context, vk::CommandBuffer *commandBatch)
+angle::Result RendererVk::flushCommandGraph(vk::Context *context,
+ vk::PrimaryCommandBuffer *commandBatch)
{
return mCommandGraph.submitCommands(context, mCurrentQueueSerial, &mRenderPassCache,
&mCommandPool, commandBatch);
}
-angle::Result RendererVk::flush(vk::Context *context)
+angle::Result RendererVk::flush(vk::Context *context,
+ const vk::Semaphore *waitSemaphore,
+ const vk::Semaphore *signalSemaphore)
{
if (mCommandGraph.empty())
{
+ // If the sempahores were non-null, there will be breaks in the semaphore chain by not
+ // submitting them.
+ // TODO(geofflang): We can request the semaphores from the surface just before submission
+ // once contexts hold the command graph. http://anglebug.com/2464
+ ASSERT(waitSemaphore == nullptr);
+ ASSERT(signalSemaphore == nullptr);
return angle::Result::Continue;
}
TRACE_EVENT0("gpu.angle", "RendererVk::flush");
- vk::Scoped<vk::CommandBuffer> commandBatch(mDevice);
+ vk::Scoped<vk::PrimaryCommandBuffer> commandBatch(mDevice);
ANGLE_TRY(flushCommandGraph(context, &commandBatch.get()));
- angle::FixedVector<VkSemaphore, kMaxWaitSemaphores> waitSemaphores;
- angle::FixedVector<VkPipelineStageFlags, kMaxWaitSemaphores> waitStageMasks;
- getSubmitWaitSemaphores(context, &waitSemaphores, &waitStageMasks);
-
- // On every flush, create a semaphore to be signaled. On the next submission, this semaphore
- // will be waited on.
- ANGLE_TRY(mSubmitSemaphorePool.allocateSemaphore(context, &mSubmitLastSignaledSemaphore));
-
- VkSubmitInfo submitInfo = {};
- submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submitInfo.waitSemaphoreCount = static_cast<uint32_t>(waitSemaphores.size());
- submitInfo.pWaitSemaphores = waitSemaphores.data();
- submitInfo.pWaitDstStageMask = waitStageMasks.data();
- submitInfo.commandBufferCount = 1;
- submitInfo.pCommandBuffers = commandBatch.get().ptr();
- submitInfo.signalSemaphoreCount = 1;
- submitInfo.pSignalSemaphores = mSubmitLastSignaledSemaphore.getSemaphore()->ptr();
+ VkSubmitInfo submitInfo = {};
+ VkPipelineStageFlags waitMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
+ InitializeSubmitInfo(&submitInfo, commandBatch.get(), waitSemaphore, &waitMask,
+ signalSemaphore);
ANGLE_TRY(submitFrame(context, submitInfo, commandBatch.release()));
@@ -1664,32 +1706,6 @@ angle::Result RendererVk::syncPipelineCacheVk(DisplayVk *displayVk)
return angle::Result::Continue;
}
-angle::Result RendererVk::allocateSubmitWaitSemaphore(vk::Context *context,
- const vk::Semaphore **outSemaphore)
-{
- ASSERT(mSubmitWaitSemaphores.size() < mSubmitWaitSemaphores.max_size());
-
- vk::SemaphoreHelper semaphore;
- ANGLE_TRY(mSubmitSemaphorePool.allocateSemaphore(context, &semaphore));
-
- mSubmitWaitSemaphores.push_back(std::move(semaphore));
- *outSemaphore = mSubmitWaitSemaphores.back().getSemaphore();
-
- return angle::Result::Continue;
-}
-
-const vk::Semaphore *RendererVk::getSubmitLastSignaledSemaphore(vk::Context *context)
-{
- const vk::Semaphore *semaphore = mSubmitLastSignaledSemaphore.getSemaphore();
-
- // Return the semaphore to the pool (which will remain valid and unused until the
- // queue it's about to be waited on has finished execution). The caller is about
- // to wait on it.
- mSubmitSemaphorePool.freeSemaphore(context, &mSubmitLastSignaledSemaphore);
-
- return semaphore;
-}
-
angle::Result RendererVk::getSubmitFence(vk::Context *context,
vk::Shared<vk::Fence> *sharedFenceOut)
{
@@ -1740,8 +1756,8 @@ angle::Result RendererVk::getTimestamp(vk::Context *context, uint64_t *timestamp
ANGLE_TRY(timestampQueryPool.get().allocateQuery(context, &timestampQuery));
// Record the command buffer
- vk::Scoped<vk::CommandBuffer> commandBatch(mDevice);
- vk::CommandBuffer &commandBuffer = commandBatch.get();
+ vk::Scoped<vk::PrimaryCommandBuffer> commandBatch(mDevice);
+ vk::PrimaryCommandBuffer &commandBuffer = commandBatch.get();
VkCommandBufferAllocateInfo commandBufferInfo = {};
commandBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
@@ -1775,15 +1791,8 @@ angle::Result RendererVk::getTimestamp(vk::Context *context, uint64_t *timestamp
ANGLE_VK_TRY(context, fence.get().init(mDevice, fenceInfo));
// Submit the command buffer
- VkSubmitInfo submitInfo = {};
- submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submitInfo.waitSemaphoreCount = 0;
- submitInfo.pWaitSemaphores = nullptr;
- submitInfo.pWaitDstStageMask = nullptr;
- submitInfo.commandBufferCount = 1;
- submitInfo.pCommandBuffers = commandBuffer.ptr();
- submitInfo.signalSemaphoreCount = 0;
- submitInfo.pSignalSemaphores = nullptr;
+ VkSubmitInfo submitInfo = {};
+ InitializeSubmitInfo(&submitInfo, commandBatch.get(), nullptr, nullptr, nullptr);
ANGLE_VK_TRY(context, vkQueueSubmit(mQueue, 1, &submitInfo, fence.get().getHandle()));
@@ -1809,14 +1818,13 @@ angle::Result RendererVk::getTimestamp(vk::Context *context, uint64_t *timestamp
// These functions look at the mandatory format for support, and fallback to querying the device (if
// necessary) to test the availability of the bits.
-bool RendererVk::hasLinearTextureFormatFeatureBits(VkFormat format,
- const VkFormatFeatureFlags featureBits)
+bool RendererVk::hasLinearImageFormatFeatureBits(VkFormat format,
+ const VkFormatFeatureFlags featureBits)
{
return hasFormatFeatureBits<&VkFormatProperties::linearTilingFeatures>(format, featureBits);
}
-bool RendererVk::hasTextureFormatFeatureBits(VkFormat format,
- const VkFormatFeatureFlags featureBits)
+bool RendererVk::hasImageFormatFeatureBits(VkFormat format, const VkFormatFeatureFlags featureBits)
{
return hasFormatFeatureBits<&VkFormatProperties::optimalTilingFeatures>(format, featureBits);
}
@@ -1841,7 +1849,9 @@ void RendererVk::popDebugMarker()
mCommandGraph.popDebugMarker();
}
-angle::Result RendererVk::synchronizeCpuGpuTime(vk::Context *context)
+angle::Result RendererVk::synchronizeCpuGpuTime(vk::Context *context,
+ const vk::Semaphore *waitSemaphore,
+ const vk::Semaphore *signalSemaphore)
{
ASSERT(mGpuEventsEnabled);
@@ -1946,8 +1956,8 @@ angle::Result RendererVk::synchronizeCpuGpuTime(vk::Context *context)
ANGLE_VK_TRY(context, gpuDone.get().reset(mDevice));
// Record the command buffer
- vk::Scoped<vk::CommandBuffer> commandBatch(mDevice);
- vk::CommandBuffer &commandBuffer = commandBatch.get();
+ vk::Scoped<vk::PrimaryCommandBuffer> commandBatch(mDevice);
+ vk::PrimaryCommandBuffer &commandBuffer = commandBatch.get();
VkCommandBufferAllocateInfo commandBufferInfo = {};
commandBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
@@ -1980,19 +1990,10 @@ angle::Result RendererVk::synchronizeCpuGpuTime(vk::Context *context)
ANGLE_VK_TRY(context, commandBuffer.end());
// Submit the command buffer
- angle::FixedVector<VkSemaphore, kMaxWaitSemaphores> waitSemaphores;
- angle::FixedVector<VkPipelineStageFlags, kMaxWaitSemaphores> waitStageMasks;
- getSubmitWaitSemaphores(context, &waitSemaphores, &waitStageMasks);
-
- VkSubmitInfo submitInfo = {};
- submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submitInfo.waitSemaphoreCount = static_cast<uint32_t>(waitSemaphores.size());
- submitInfo.pWaitSemaphores = waitSemaphores.data();
- submitInfo.pWaitDstStageMask = waitStageMasks.data();
- submitInfo.commandBufferCount = 1;
- submitInfo.pCommandBuffers = commandBuffer.ptr();
- submitInfo.signalSemaphoreCount = 0;
- submitInfo.pSignalSemaphores = nullptr;
+ VkSubmitInfo submitInfo = {};
+ VkPipelineStageFlags waitMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
+ InitializeSubmitInfo(&submitInfo, commandBatch.get(), waitSemaphore, &waitMask,
+ signalSemaphore);
ANGLE_TRY(submitFrame(context, submitInfo, std::move(commandBuffer)));
@@ -2067,7 +2068,7 @@ angle::Result RendererVk::synchronizeCpuGpuTime(vk::Context *context)
}
angle::Result RendererVk::traceGpuEventImpl(vk::Context *context,
- vk::CommandBuffer *commandBuffer,
+ vk::PrimaryCommandBuffer *commandBuffer,
char phase,
const char *name)
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h
index 48a1fe5d444..e4bb0957cd6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RendererVk.h
@@ -13,6 +13,7 @@
#include <vulkan/vulkan.h>
#include <memory>
+#include "common/PoolAlloc.h"
#include "common/angleutils.h"
#include "libANGLE/BlobCache.h"
#include "libANGLE/Caps.h"
@@ -76,8 +77,12 @@ class RendererVk : angle::NonCopyable
VkSurfaceKHR surface,
uint32_t *presentQueueOut);
- angle::Result finish(vk::Context *context);
- angle::Result flush(vk::Context *context);
+ angle::Result finish(vk::Context *context,
+ const vk::Semaphore *waitSemaphore,
+ const vk::Semaphore *signalSemaphore);
+ angle::Result flush(vk::Context *context,
+ const vk::Semaphore *waitSemaphore,
+ const vk::Semaphore *signalSemaphore);
const vk::CommandPool &getCommandPool() const;
@@ -148,8 +153,6 @@ class RendererVk : angle::NonCopyable
angle::Result syncPipelineCacheVk(DisplayVk *displayVk);
- vk::DynamicSemaphorePool *getDynamicSemaphorePool() { return &mSubmitSemaphorePool; }
-
// Request a semaphore, that is expected to be signaled externally. The next submission will
// wait on it.
angle::Result allocateSubmitWaitSemaphore(vk::Context *context,
@@ -182,7 +185,7 @@ class RendererVk : angle::NonCopyable
// The events are queued until the query results are available. Possible values for `phase`
// are TRACE_EVENT_PHASE_*
ANGLE_INLINE angle::Result traceGpuEvent(vk::Context *context,
- vk::CommandBuffer *commandBuffer,
+ vk::PrimaryCommandBuffer *commandBuffer,
char phase,
const char *name)
{
@@ -199,8 +202,8 @@ class RendererVk : angle::NonCopyable
// Query the format properties for select bits (linearTilingFeatures, optimalTilingFeatures and
// bufferFeatures). Looks through mandatory features first, and falls back to querying the
// device (first time only).
- bool hasLinearTextureFormatFeatureBits(VkFormat format, const VkFormatFeatureFlags featureBits);
- bool hasTextureFormatFeatureBits(VkFormat format, const VkFormatFeatureFlags featureBits);
+ bool hasLinearImageFormatFeatureBits(VkFormat format, const VkFormatFeatureFlags featureBits);
+ bool hasImageFormatFeatureBits(VkFormat format, const VkFormatFeatureFlags featureBits);
bool hasBufferFormatFeatureBits(VkFormat format, const VkFormatFeatureFlags featureBits);
void insertDebugMarker(GLenum source, GLuint id, std::string &&marker);
@@ -220,22 +223,20 @@ class RendererVk : angle::NonCopyable
angle::Result initializeDevice(DisplayVk *displayVk, uint32_t queueFamilyIndex);
void ensureCapsInitialized() const;
- void getSubmitWaitSemaphores(
- vk::Context *context,
- angle::FixedVector<VkSemaphore, kMaxWaitSemaphores> *waitSemaphores,
- angle::FixedVector<VkPipelineStageFlags, kMaxWaitSemaphores> *waitStageMasks);
angle::Result submitFrame(vk::Context *context,
const VkSubmitInfo &submitInfo,
- vk::CommandBuffer &&commandBuffer);
+ vk::PrimaryCommandBuffer &&commandBuffer);
void freeAllInFlightResources();
- angle::Result flushCommandGraph(vk::Context *context, vk::CommandBuffer *commandBatch);
+ angle::Result flushCommandGraph(vk::Context *context, vk::PrimaryCommandBuffer *commandBatch);
void initFeatures(const ExtensionNameList &extensions);
void initPipelineCacheVkKey();
angle::Result initPipelineCache(DisplayVk *display);
- angle::Result synchronizeCpuGpuTime(vk::Context *context);
+ angle::Result synchronizeCpuGpuTime(vk::Context *context,
+ const vk::Semaphore *waitSemaphore,
+ const vk::Semaphore *signalSemaphore);
angle::Result traceGpuEventImpl(vk::Context *context,
- vk::CommandBuffer *commandBuffer,
+ vk::PrimaryCommandBuffer *commandBuffer,
char phase,
const char *name);
angle::Result checkCompletedGpuEvents(vk::Context *context);
@@ -306,26 +307,6 @@ class RendererVk : angle::NonCopyable
// A cache of VkFormatProperties as queried from the device over time.
std::array<VkFormatProperties, vk::kNumVkFormats> mFormatProperties;
- // mSubmitWaitSemaphores is a list of specifically requested semaphores to be waited on before a
- // command buffer submission, for example, semaphores signaled by vkAcquireNextImageKHR.
- // After first use, the list is automatically cleared. This is a vector to support concurrent
- // rendering to multiple surfaces.
- //
- // Note that with multiple contexts present, this may result in a context waiting on image
- // acquisition even if it doesn't render to that surface. If CommandGraphs are separated by
- // context or share group for example, this could be moved to the one that actually uses the
- // image.
- angle::FixedVector<vk::SemaphoreHelper, kMaxExternalSemaphores> mSubmitWaitSemaphores;
- // mSubmitLastSignaledSemaphore shows which semaphore was last signaled by submission. This can
- // be set to nullptr if retrieved to be waited on outside RendererVk, such
- // as by the surface before presentation. Each submission waits on the
- // previously signaled semaphore (as well as any in mSubmitWaitSemaphores)
- // and allocates a new semaphore to signal.
- vk::SemaphoreHelper mSubmitLastSignaledSemaphore;
-
- // A pool of semaphores used to support the aforementioned mid-frame submissions.
- vk::DynamicSemaphorePool mSubmitSemaphorePool;
-
// mSubmitFence is the fence that's going to be signaled at the next submission. This is used
// to support SyncVk objects, which may outlive the context (as EGLSync objects).
//
@@ -334,6 +315,9 @@ class RendererVk : angle::NonCopyable
// http://anglebug.com/2701
vk::Shared<vk::Fence> mSubmitFence;
+ // Pool allocator used for command graph but may be expanded to other allocations
+ angle::PoolAllocator mPoolAllocator;
+
// See CommandGraph.h for a desription of the Command Graph.
vk::CommandGraph mCommandGraph;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp
index 0e9725c2a05..a6e6be52287 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.cpp
@@ -14,661 +14,410 @@ namespace rx
{
namespace vk
{
-
-// Allocate/initialize memory for the command and return pointer to Cmd Header
-template <class StructType>
-StructType *SecondaryCommandBuffer::initCommand(CommandID cmdID, size_t variableSize)
-{
- size_t paramSize = sizeof(StructType);
- size_t completeSize = sizeof(CommandHeader) + paramSize + variableSize;
- CommandHeader *header = static_cast<CommandHeader *>(mAllocator->allocate(completeSize));
- // Update cmd ID in header
- header->id = cmdID;
- header->next = nullptr;
- // Update mHead ptr
- mHead = (mHead == nullptr) ? header : mHead;
- // Update prev cmd's "next" ptr and mLast ptr
- if (mLast)
- {
- mLast->next = header;
- }
- // Update mLast ptr
- mLast = header;
-
- uint8_t *fixedParamPtr = reinterpret_cast<uint8_t *>(header) + sizeof(CommandHeader);
- mPtrCmdData = fixedParamPtr + sizeof(StructType);
- return reinterpret_cast<StructType *>(fixedParamPtr);
-}
-
-template <class PtrType>
-void SecondaryCommandBuffer::storePointerParameter(const PtrType *paramData,
- const PtrType **writePtr,
- size_t sizeInBytes)
+namespace priv
{
- *writePtr = reinterpret_cast<const PtrType *>(mPtrCmdData);
- memcpy(mPtrCmdData, paramData, sizeInBytes);
- mPtrCmdData += sizeInBytes;
-}
-void SecondaryCommandBuffer::bindDescriptorSets(VkPipelineBindPoint bindPoint,
- VkPipelineLayout layout,
- uint32_t firstSet,
- uint32_t descriptorSetCount,
- const VkDescriptorSet *descriptorSets,
- uint32_t dynamicOffsetCount,
- const uint32_t *dynamicOffsets)
+ANGLE_INLINE const CommandHeader *NextCommand(const CommandHeader *command)
{
- size_t descSize = descriptorSetCount * sizeof(VkDescriptorSet);
- size_t offsetSize = dynamicOffsetCount * sizeof(uint32_t);
- size_t varSize = descSize + offsetSize;
- BindDescriptorSetParams *paramStruct =
- initCommand<BindDescriptorSetParams>(CommandID::BindDescriptorSets, varSize);
- // Copy params into memory
- paramStruct->bindPoint = bindPoint;
- paramStruct->layout = layout;
- paramStruct->firstSet = firstSet;
- paramStruct->descriptorSetCount = descriptorSetCount;
- paramStruct->dynamicOffsetCount = dynamicOffsetCount;
- // Copy variable sized data
- storePointerParameter(descriptorSets, &paramStruct->descriptorSets, descSize);
- storePointerParameter(dynamicOffsets, &paramStruct->dynamicOffsets, offsetSize);
-}
-
-void SecondaryCommandBuffer::bindIndexBuffer(const VkBuffer &buffer,
- VkDeviceSize offset,
- VkIndexType indexType)
-{
- BindIndexBufferParams *paramStruct =
- initCommand<BindIndexBufferParams>(CommandID::BindIndexBuffer, 0);
- paramStruct->buffer = buffer;
- paramStruct->offset = offset;
- paramStruct->indexType = indexType;
-}
-
-void SecondaryCommandBuffer::bindPipeline(VkPipelineBindPoint pipelineBindPoint,
- VkPipeline pipeline)
-{
- BindPipelineParams *paramStruct = initCommand<BindPipelineParams>(CommandID::BindPipeline, 0);
- paramStruct->pipelineBindPoint = pipelineBindPoint;
- paramStruct->pipeline = pipeline;
-}
-
-void SecondaryCommandBuffer::bindVertexBuffers(uint32_t firstBinding,
- uint32_t bindingCount,
- const VkBuffer *buffers,
- const VkDeviceSize *offsets)
-{
- size_t buffSize = bindingCount * sizeof(VkBuffer);
- size_t offsetSize = bindingCount * sizeof(VkDeviceSize);
- BindVertexBuffersParams *paramStruct =
- initCommand<BindVertexBuffersParams>(CommandID::BindVertexBuffers, buffSize + offsetSize);
- // Copy params
- paramStruct->firstBinding = firstBinding;
- paramStruct->bindingCount = bindingCount;
- // Copy variable sized data
- storePointerParameter(buffers, &paramStruct->buffers, buffSize);
- storePointerParameter(offsets, &paramStruct->offsets, offsetSize);
-}
-
-void SecondaryCommandBuffer::blitImage(VkImage srcImage,
- VkImageLayout srcImageLayout,
- VkImage dstImage,
- VkImageLayout dstImageLayout,
- uint32_t regionCount,
- const VkImageBlit *pRegions,
- VkFilter filter)
-{
- size_t regionSize = regionCount * sizeof(VkImageBlit);
- BlitImageParams *paramStruct = initCommand<BlitImageParams>(CommandID::BlitImage, regionSize);
- paramStruct->srcImage = srcImage;
- paramStruct->srcImageLayout = srcImageLayout;
- paramStruct->dstImage = dstImage;
- paramStruct->dstImageLayout = dstImageLayout;
- paramStruct->regionCount = regionCount;
- paramStruct->filter = filter;
- // Copy variable sized data
- storePointerParameter(pRegions, &paramStruct->pRegions, regionSize);
-}
-
-void SecondaryCommandBuffer::copyBuffer(const VkBuffer &srcBuffer,
- const VkBuffer &destBuffer,
- uint32_t regionCount,
- const VkBufferCopy *regions)
-{
- size_t regionSize = regionCount * sizeof(VkBufferCopy);
- CopyBufferParams *paramStruct =
- initCommand<CopyBufferParams>(CommandID::CopyBuffer, regionSize);
- paramStruct->srcBuffer = srcBuffer;
- paramStruct->destBuffer = destBuffer;
- paramStruct->regionCount = regionCount;
- // Copy variable sized data
- storePointerParameter(regions, &paramStruct->regions, regionSize);
-}
-
-void SecondaryCommandBuffer::copyBufferToImage(VkBuffer srcBuffer,
- VkImage dstImage,
- VkImageLayout dstImageLayout,
- uint32_t regionCount,
- const VkBufferImageCopy *regions)
-{
- size_t regionSize = regionCount * sizeof(VkBufferImageCopy);
- CopyBufferToImageParams *paramStruct =
- initCommand<CopyBufferToImageParams>(CommandID::CopyBufferToImage, regionSize);
- paramStruct->srcBuffer = srcBuffer;
- paramStruct->dstImage = dstImage;
- paramStruct->dstImageLayout = dstImageLayout;
- paramStruct->regionCount = regionCount;
- // Copy variable sized data
- storePointerParameter(regions, &paramStruct->regions, regionSize);
-}
-
-void SecondaryCommandBuffer::copyImage(VkImage srcImage,
- VkImageLayout srcImageLayout,
- VkImage dstImage,
- VkImageLayout dstImageLayout,
- uint32_t regionCount,
- const VkImageCopy *regions)
-{
- size_t regionSize = regionCount * sizeof(VkImageCopy);
- CopyImageParams *paramStruct = initCommand<CopyImageParams>(CommandID::CopyImage, regionSize);
- paramStruct->srcImage = srcImage;
- paramStruct->srcImageLayout = srcImageLayout;
- paramStruct->dstImage = dstImage;
- paramStruct->dstImageLayout = dstImageLayout;
- paramStruct->regionCount = regionCount;
- // Copy variable sized data
- storePointerParameter(regions, &paramStruct->regions, regionSize);
-}
-
-void SecondaryCommandBuffer::copyImageToBuffer(VkImage srcImage,
- VkImageLayout srcImageLayout,
- VkBuffer dstBuffer,
- uint32_t regionCount,
- const VkBufferImageCopy *regions)
-{
- size_t regionSize = regionCount * sizeof(VkBufferImageCopy);
- CopyImageToBufferParams *paramStruct =
- initCommand<CopyImageToBufferParams>(CommandID::CopyImageToBuffer, regionSize);
- paramStruct->srcImage = srcImage;
- paramStruct->srcImageLayout = srcImageLayout;
- paramStruct->dstBuffer = dstBuffer;
- paramStruct->regionCount = regionCount;
- // Copy variable sized data
- storePointerParameter(regions, &paramStruct->regions, regionSize);
-}
-
-void SecondaryCommandBuffer::clearAttachments(uint32_t attachmentCount,
- const VkClearAttachment *attachments,
- uint32_t rectCount,
- const VkClearRect *rects)
-{
- size_t attachSize = attachmentCount * sizeof(VkClearAttachment);
- size_t rectSize = rectCount * sizeof(VkClearRect);
- ClearAttachmentsParams *paramStruct =
- initCommand<ClearAttachmentsParams>(CommandID::ClearAttachments, attachSize + rectSize);
- paramStruct->attachmentCount = attachmentCount;
- paramStruct->rectCount = rectCount;
- // Copy variable sized data
- storePointerParameter(attachments, &paramStruct->attachments, attachSize);
- storePointerParameter(rects, &paramStruct->rects, rectSize);
-}
-
-void SecondaryCommandBuffer::clearColorImage(VkImage image,
- VkImageLayout imageLayout,
- const VkClearColorValue &color,
- uint32_t rangeCount,
- const VkImageSubresourceRange *ranges)
-{
- size_t rangeSize = rangeCount * sizeof(VkImageSubresourceRange);
- ClearColorImageParams *paramStruct =
- initCommand<ClearColorImageParams>(CommandID::ClearColorImage, rangeSize);
- paramStruct->image = image;
- paramStruct->imageLayout = imageLayout;
- paramStruct->color = color;
- paramStruct->rangeCount = rangeCount;
- // Copy variable sized data
- storePointerParameter(ranges, &paramStruct->ranges, rangeSize);
-}
-
-void SecondaryCommandBuffer::clearDepthStencilImage(VkImage image,
- VkImageLayout imageLayout,
- const VkClearDepthStencilValue &depthStencil,
- uint32_t rangeCount,
- const VkImageSubresourceRange *ranges)
-{
- size_t rangeSize = rangeCount * sizeof(VkImageSubresourceRange);
- ClearDepthStencilImageParams *paramStruct =
- initCommand<ClearDepthStencilImageParams>(CommandID::ClearDepthStencilImage, rangeSize);
- paramStruct->image = image;
- paramStruct->imageLayout = imageLayout;
- paramStruct->depthStencil = depthStencil;
- paramStruct->rangeCount = rangeCount;
- // Copy variable sized data
- storePointerParameter(ranges, &paramStruct->ranges, rangeSize);
-}
-
-void SecondaryCommandBuffer::updateBuffer(VkBuffer buffer,
- VkDeviceSize dstOffset,
- VkDeviceSize dataSize,
- const void *data)
-{
- ASSERT(dataSize == static_cast<size_t>(dataSize));
- UpdateBufferParams *paramStruct =
- initCommand<UpdateBufferParams>(CommandID::UpdateBuffer, static_cast<size_t>(dataSize));
- paramStruct->buffer = buffer;
- paramStruct->dstOffset = dstOffset;
- paramStruct->dataSize = dataSize;
- // Copy variable sized data
- storePointerParameter(data, &paramStruct->data, static_cast<size_t>(dataSize));
-}
-
-void SecondaryCommandBuffer::pushConstants(VkPipelineLayout layout,
- VkShaderStageFlags flag,
- uint32_t offset,
- uint32_t size,
- const void *data)
-{
- ASSERT(size == static_cast<size_t>(size));
- PushConstantsParams *paramStruct =
- initCommand<PushConstantsParams>(CommandID::PushConstants, static_cast<size_t>(size));
- paramStruct->layout = layout;
- paramStruct->flag = flag;
- paramStruct->offset = offset;
- paramStruct->size = size;
- // Copy variable sized data
- storePointerParameter(data, &paramStruct->data, static_cast<size_t>(size));
-}
-
-void SecondaryCommandBuffer::setViewport(uint32_t firstViewport,
- uint32_t viewportCount,
- const VkViewport *viewports)
-{
- size_t viewportSize = viewportCount * sizeof(VkViewport);
- SetViewportParams *paramStruct =
- initCommand<SetViewportParams>(CommandID::SetViewport, viewportSize);
- paramStruct->firstViewport = firstViewport;
- paramStruct->viewportCount = viewportCount;
- // Copy variable sized data
- storePointerParameter(viewports, &paramStruct->viewports, viewportSize);
-}
-
-void SecondaryCommandBuffer::setScissor(uint32_t firstScissor,
- uint32_t scissorCount,
- const VkRect2D *scissors)
-{
- size_t scissorSize = scissorCount * sizeof(VkRect2D);
- SetScissorParams *paramStruct =
- initCommand<SetScissorParams>(CommandID::SetScissor, scissorSize);
- paramStruct->firstScissor = firstScissor;
- paramStruct->scissorCount = scissorCount;
- // Copy variable sized data
- storePointerParameter(scissors, &paramStruct->scissors, scissorSize);
-}
-
-void SecondaryCommandBuffer::draw(uint32_t vertexCount,
- uint32_t instanceCount,
- uint32_t firstVertex,
- uint32_t firstInstance)
-{
- DrawParams *paramStruct = initCommand<DrawParams>(CommandID::Draw, 0);
- paramStruct->vertexCount = vertexCount;
- paramStruct->instanceCount = instanceCount;
- paramStruct->firstVertex = firstVertex;
- paramStruct->firstInstance = firstInstance;
-}
-
-void SecondaryCommandBuffer::drawIndexed(uint32_t indexCount,
- uint32_t instanceCount,
- uint32_t firstIndex,
- int32_t vertexOffset,
- uint32_t firstInstance)
-{
- DrawIndexedParams *paramStruct = initCommand<DrawIndexedParams>(CommandID::DrawIndexed, 0);
- paramStruct->indexCount = indexCount;
- paramStruct->instanceCount = instanceCount;
- paramStruct->firstIndex = firstIndex;
- paramStruct->vertexOffset = vertexOffset;
- paramStruct->firstInstance = firstInstance;
-}
-
-void SecondaryCommandBuffer::dispatch(uint32_t groupCountX,
- uint32_t groupCountY,
- uint32_t groupCountZ)
-{
- DispatchParams *paramStruct = initCommand<DispatchParams>(CommandID::Dispatch, 0);
- paramStruct->groupCountX = groupCountX;
- paramStruct->groupCountY = groupCountY;
- paramStruct->groupCountZ = groupCountZ;
-}
-
-void SecondaryCommandBuffer::pipelineBarrier(VkPipelineStageFlags srcStageMask,
- VkPipelineStageFlags dstStageMask,
- VkDependencyFlags dependencyFlags,
- uint32_t memoryBarrierCount,
- const VkMemoryBarrier *memoryBarriers,
- uint32_t bufferMemoryBarrierCount,
- const VkBufferMemoryBarrier *bufferMemoryBarriers,
- uint32_t imageMemoryBarrierCount,
- const VkImageMemoryBarrier *imageMemoryBarriers)
-{
- size_t memBarrierSize = memoryBarrierCount * sizeof(VkMemoryBarrier);
- size_t buffBarrierSize = bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier);
- size_t imgBarrierSize = imageMemoryBarrierCount * sizeof(VkImageMemoryBarrier);
- PipelineBarrierParams *paramStruct = initCommand<PipelineBarrierParams>(
- CommandID::PipelinBarrier, memBarrierSize + buffBarrierSize + imgBarrierSize);
- paramStruct->srcStageMask = srcStageMask;
- paramStruct->dstStageMask = dstStageMask;
- paramStruct->memoryBarrierCount = memoryBarrierCount;
- paramStruct->bufferMemoryBarrierCount = bufferMemoryBarrierCount;
- paramStruct->imageMemoryBarrierCount = imageMemoryBarrierCount;
- // Copy variable sized data
- storePointerParameter(memoryBarriers, &paramStruct->memoryBarriers, memBarrierSize);
- storePointerParameter(bufferMemoryBarriers, &paramStruct->bufferMemoryBarriers,
- buffBarrierSize);
- storePointerParameter(imageMemoryBarriers, &paramStruct->imageMemoryBarriers, imgBarrierSize);
-}
-
-void SecondaryCommandBuffer::setEvent(VkEvent event, VkPipelineStageFlags stageMask)
-{
- SetEventParams *paramStruct = initCommand<SetEventParams>(CommandID::SetEvent, 0);
- paramStruct->event = event;
- paramStruct->stageMask = stageMask;
-}
-
-void SecondaryCommandBuffer::resetEvent(VkEvent event, VkPipelineStageFlags stageMask)
-{
- ResetEventParams *paramStruct = initCommand<ResetEventParams>(CommandID::ResetEvent, 0);
- paramStruct->event = event;
- paramStruct->stageMask = stageMask;
-}
-
-void SecondaryCommandBuffer::waitEvents(uint32_t eventCount,
- const VkEvent *events,
- VkPipelineStageFlags srcStageMask,
- VkPipelineStageFlags dstStageMask,
- uint32_t memoryBarrierCount,
- const VkMemoryBarrier *memoryBarriers,
- uint32_t bufferMemoryBarrierCount,
- const VkBufferMemoryBarrier *bufferMemoryBarriers,
- uint32_t imageMemoryBarrierCount,
- const VkImageMemoryBarrier *imageMemoryBarriers)
-{
- size_t eventSize = eventCount * sizeof(VkEvent);
- size_t memBarrierSize = memoryBarrierCount * sizeof(VkMemoryBarrier);
- size_t buffBarrierSize = bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier);
- size_t imgBarrierSize = imageMemoryBarrierCount * sizeof(VkImageMemoryBarrier);
- WaitEventsParams *paramStruct = initCommand<WaitEventsParams>(
- CommandID::WaitEvents, eventSize + memBarrierSize + buffBarrierSize + imgBarrierSize);
- paramStruct->eventCount = eventCount;
- paramStruct->srcStageMask = srcStageMask;
- paramStruct->dstStageMask = dstStageMask;
- paramStruct->memoryBarrierCount = memoryBarrierCount;
- paramStruct->bufferMemoryBarrierCount = bufferMemoryBarrierCount;
- paramStruct->imageMemoryBarrierCount = imageMemoryBarrierCount;
- // Copy variable sized data
- storePointerParameter(events, &paramStruct->events, eventSize);
- storePointerParameter(memoryBarriers, &paramStruct->memoryBarriers, memBarrierSize);
- storePointerParameter(bufferMemoryBarriers, &paramStruct->bufferMemoryBarriers,
- buffBarrierSize);
- storePointerParameter(imageMemoryBarriers, &paramStruct->imageMemoryBarriers, imgBarrierSize);
-}
-
-void SecondaryCommandBuffer::resetQueryPool(VkQueryPool queryPool,
- uint32_t firstQuery,
- uint32_t queryCount)
-{
- ResetQueryPoolParams *paramStruct =
- initCommand<ResetQueryPoolParams>(CommandID::ResetQueryPool, 0);
- paramStruct->queryPool = queryPool;
- paramStruct->firstQuery = firstQuery;
- paramStruct->queryCount = queryCount;
-}
-
-void SecondaryCommandBuffer::beginQuery(VkQueryPool queryPool,
- uint32_t query,
- VkQueryControlFlags flags)
-{
- BeginQueryParams *paramStruct = initCommand<BeginQueryParams>(CommandID::BeginQuery, 0);
- paramStruct->queryPool = queryPool;
- paramStruct->query = query;
- paramStruct->flags = flags;
-}
-
-void SecondaryCommandBuffer::endQuery(VkQueryPool queryPool, uint32_t query)
-{
- EndQueryParams *paramStruct = initCommand<EndQueryParams>(CommandID::EndQuery, 0);
- paramStruct->queryPool = queryPool;
- paramStruct->query = query;
-}
-
-void SecondaryCommandBuffer::writeTimestamp(VkPipelineStageFlagBits pipelineStage,
- VkQueryPool queryPool,
- uint32_t query)
-{
- WriteTimestampParams *paramStruct =
- initCommand<WriteTimestampParams>(CommandID::WriteTimestamp, 0);
- paramStruct->pipelineStage = pipelineStage;
- paramStruct->queryPool = queryPool;
- paramStruct->query = query;
+ return reinterpret_cast<const CommandHeader *>(reinterpret_cast<const uint8_t *>(command) +
+ command->size);
}
// Parse the cmds in this cmd buffer into given primary cmd buffer
void SecondaryCommandBuffer::executeCommands(VkCommandBuffer cmdBuffer)
{
- for (CommandHeader *currentCommand = mHead; currentCommand;
- currentCommand = currentCommand->next)
+ for (const CommandHeader *command : mCommands)
{
- switch (currentCommand->id)
+ for (const CommandHeader *currentCommand = command;
+ currentCommand->id != CommandID::Invalid; currentCommand = NextCommand(currentCommand))
{
- case CommandID::BindDescriptorSets:
- {
- BindDescriptorSetParams *params =
- getParamPtr<BindDescriptorSetParams>(currentCommand);
- vkCmdBindDescriptorSets(cmdBuffer, params->bindPoint, params->layout,
- params->firstSet, params->descriptorSetCount,
- params->descriptorSets, params->dynamicOffsetCount,
- params->dynamicOffsets);
- break;
- }
- case CommandID::BindIndexBuffer:
- {
- BindIndexBufferParams *params = getParamPtr<BindIndexBufferParams>(currentCommand);
- vkCmdBindIndexBuffer(cmdBuffer, params->buffer, params->offset, params->indexType);
- break;
- }
- case CommandID::BindPipeline:
- {
- BindPipelineParams *params = getParamPtr<BindPipelineParams>(currentCommand);
- vkCmdBindPipeline(cmdBuffer, params->pipelineBindPoint, params->pipeline);
- break;
- }
- case CommandID::BindVertexBuffers:
- {
- BindVertexBuffersParams *params =
- getParamPtr<BindVertexBuffersParams>(currentCommand);
- vkCmdBindVertexBuffers(cmdBuffer, params->firstBinding, params->bindingCount,
- params->buffers, params->offsets);
- break;
- }
- case CommandID::BlitImage:
- {
- BlitImageParams *params = getParamPtr<BlitImageParams>(currentCommand);
- vkCmdBlitImage(cmdBuffer, params->srcImage, params->srcImageLayout,
- params->dstImage, params->dstImageLayout, params->regionCount,
- params->pRegions, params->filter);
- break;
- }
- case CommandID::CopyBuffer:
- {
- CopyBufferParams *params = getParamPtr<CopyBufferParams>(currentCommand);
- vkCmdCopyBuffer(cmdBuffer, params->srcBuffer, params->destBuffer,
- params->regionCount, params->regions);
- break;
- }
- case CommandID::CopyBufferToImage:
- {
- CopyBufferToImageParams *params =
- getParamPtr<CopyBufferToImageParams>(currentCommand);
- vkCmdCopyBufferToImage(cmdBuffer, params->srcBuffer, params->dstImage,
- params->dstImageLayout, params->regionCount,
- params->regions);
- break;
- }
- case CommandID::CopyImage:
- {
- CopyImageParams *params = getParamPtr<CopyImageParams>(currentCommand);
- vkCmdCopyImage(cmdBuffer, params->srcImage, params->srcImageLayout,
- params->dstImage, params->dstImageLayout, params->regionCount,
- params->regions);
- break;
- }
- case CommandID::CopyImageToBuffer:
- {
- CopyImageToBufferParams *params =
- getParamPtr<CopyImageToBufferParams>(currentCommand);
- vkCmdCopyImageToBuffer(cmdBuffer, params->srcImage, params->srcImageLayout,
- params->dstBuffer, params->regionCount, params->regions);
- break;
- }
- case CommandID::ClearAttachments:
- {
- ClearAttachmentsParams *params =
- getParamPtr<ClearAttachmentsParams>(currentCommand);
- vkCmdClearAttachments(cmdBuffer, params->attachmentCount, params->attachments,
- params->rectCount, params->rects);
- break;
- }
- case CommandID::ClearColorImage:
- {
- ClearColorImageParams *params = getParamPtr<ClearColorImageParams>(currentCommand);
- vkCmdClearColorImage(cmdBuffer, params->image, params->imageLayout, &params->color,
- params->rangeCount, params->ranges);
- break;
- }
- case CommandID::ClearDepthStencilImage:
- {
- ClearDepthStencilImageParams *params =
- getParamPtr<ClearDepthStencilImageParams>(currentCommand);
- vkCmdClearDepthStencilImage(cmdBuffer, params->image, params->imageLayout,
- &params->depthStencil, params->rangeCount,
- params->ranges);
- break;
- }
- case CommandID::UpdateBuffer:
- {
- UpdateBufferParams *params = getParamPtr<UpdateBufferParams>(currentCommand);
- vkCmdUpdateBuffer(cmdBuffer, params->buffer, params->dstOffset, params->dataSize,
- params->data);
- break;
- }
- case CommandID::PushConstants:
- {
- PushConstantsParams *params = getParamPtr<PushConstantsParams>(currentCommand);
- vkCmdPushConstants(cmdBuffer, params->layout, params->flag, params->offset,
- params->size, params->data);
- break;
- }
- case CommandID::SetViewport:
- {
- SetViewportParams *params = getParamPtr<SetViewportParams>(currentCommand);
- vkCmdSetViewport(cmdBuffer, params->firstViewport, params->viewportCount,
- params->viewports);
- break;
- }
- case CommandID::SetScissor:
- {
- SetScissorParams *params = getParamPtr<SetScissorParams>(currentCommand);
- vkCmdSetScissor(cmdBuffer, params->firstScissor, params->scissorCount,
- params->scissors);
- break;
- }
- case CommandID::Draw:
- {
- DrawParams *params = getParamPtr<DrawParams>(currentCommand);
- vkCmdDraw(cmdBuffer, params->vertexCount, params->instanceCount,
- params->firstVertex, params->firstInstance);
- break;
- }
- case CommandID::DrawIndexed:
- {
- DrawIndexedParams *params = getParamPtr<DrawIndexedParams>(currentCommand);
- vkCmdDrawIndexed(cmdBuffer, params->indexCount, params->instanceCount,
- params->firstIndex, params->vertexOffset, params->firstInstance);
- break;
- }
- case CommandID::Dispatch:
- {
- DispatchParams *params = getParamPtr<DispatchParams>(currentCommand);
- vkCmdDispatch(cmdBuffer, params->groupCountX, params->groupCountY,
- params->groupCountZ);
- break;
- }
- case CommandID::PipelinBarrier:
- {
- PipelineBarrierParams *params = getParamPtr<PipelineBarrierParams>(currentCommand);
- vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask,
- params->dependencyFlags, params->memoryBarrierCount,
- params->memoryBarriers, params->bufferMemoryBarrierCount,
- params->bufferMemoryBarriers, params->imageMemoryBarrierCount,
- params->imageMemoryBarriers);
- break;
- }
- case CommandID::SetEvent:
- {
- SetEventParams *params = getParamPtr<SetEventParams>(currentCommand);
- vkCmdSetEvent(cmdBuffer, params->event, params->stageMask);
- break;
- }
- case CommandID::ResetEvent:
- {
- ResetEventParams *params = getParamPtr<ResetEventParams>(currentCommand);
- vkCmdResetEvent(cmdBuffer, params->event, params->stageMask);
- break;
- }
- case CommandID::WaitEvents:
- {
- WaitEventsParams *params = getParamPtr<WaitEventsParams>(currentCommand);
- vkCmdWaitEvents(cmdBuffer, params->eventCount, params->events, params->srcStageMask,
- params->dstStageMask, params->memoryBarrierCount,
- params->memoryBarriers, params->bufferMemoryBarrierCount,
- params->bufferMemoryBarriers, params->imageMemoryBarrierCount,
- params->imageMemoryBarriers);
- break;
- }
- case CommandID::ResetQueryPool:
- {
- ResetQueryPoolParams *params = getParamPtr<ResetQueryPoolParams>(currentCommand);
- vkCmdResetQueryPool(cmdBuffer, params->queryPool, params->firstQuery,
- params->queryCount);
- break;
- }
- case CommandID::BeginQuery:
- {
- BeginQueryParams *params = getParamPtr<BeginQueryParams>(currentCommand);
- vkCmdBeginQuery(cmdBuffer, params->queryPool, params->query, params->flags);
- break;
- }
- case CommandID::EndQuery:
+ switch (currentCommand->id)
{
- EndQueryParams *params = getParamPtr<EndQueryParams>(currentCommand);
- vkCmdEndQuery(cmdBuffer, params->queryPool, params->query);
- break;
+ case CommandID::BeginQuery:
+ {
+ const BeginQueryParams *params = getParamPtr<BeginQueryParams>(currentCommand);
+ vkCmdBeginQuery(cmdBuffer, params->queryPool, params->query, params->flags);
+ break;
+ }
+ case CommandID::BindComputeDescriptorSets:
+ {
+ const BindComputeDescriptorSetParams *params =
+ getParamPtr<BindComputeDescriptorSetParams>(currentCommand);
+ const VkDescriptorSet *descriptorSets =
+ Offset<VkDescriptorSet>(params, sizeof(BindComputeDescriptorSetParams));
+ vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE,
+ params->layout, 0, 1, descriptorSets, 0, nullptr);
+ break;
+ }
+ case CommandID::BindComputePipeline:
+ {
+ const BindPipelineParams *params =
+ getParamPtr<BindPipelineParams>(currentCommand);
+ vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, params->pipeline);
+ break;
+ }
+ case CommandID::BindGraphicsDescriptorSets:
+ {
+ const BindGraphicsDescriptorSetParams *params =
+ getParamPtr<BindGraphicsDescriptorSetParams>(currentCommand);
+ const VkDescriptorSet *descriptorSets =
+ Offset<VkDescriptorSet>(params, sizeof(BindGraphicsDescriptorSetParams));
+ const uint32_t *dynamicOffsets = Offset<uint32_t>(
+ descriptorSets, sizeof(VkDescriptorSet) * params->descriptorSetCount);
+ vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
+ params->layout, params->firstSet,
+ params->descriptorSetCount, descriptorSets,
+ params->dynamicOffsetCount, dynamicOffsets);
+ break;
+ }
+ case CommandID::BindGraphicsPipeline:
+ {
+ const BindPipelineParams *params =
+ getParamPtr<BindPipelineParams>(currentCommand);
+ vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, params->pipeline);
+ break;
+ }
+ case CommandID::BindIndexBuffer:
+ {
+ const BindIndexBufferParams *params =
+ getParamPtr<BindIndexBufferParams>(currentCommand);
+ vkCmdBindIndexBuffer(cmdBuffer, params->buffer, params->offset,
+ params->indexType);
+ break;
+ }
+ case CommandID::BindVertexBuffers:
+ {
+ const BindVertexBuffersParams *params =
+ getParamPtr<BindVertexBuffersParams>(currentCommand);
+ const VkBuffer *buffers =
+ Offset<VkBuffer>(params, sizeof(BindVertexBuffersParams));
+ const VkDeviceSize *offsets =
+ Offset<VkDeviceSize>(buffers, sizeof(VkBuffer) * params->bindingCount);
+ vkCmdBindVertexBuffers(cmdBuffer, 0, params->bindingCount, buffers, offsets);
+ break;
+ }
+ case CommandID::BlitImage:
+ {
+ const BlitImageParams *params = getParamPtr<BlitImageParams>(currentCommand);
+ vkCmdBlitImage(cmdBuffer, params->srcImage,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, params->dstImage,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &params->region,
+ params->filter);
+ break;
+ }
+ case CommandID::ClearAttachments:
+ {
+ const ClearAttachmentsParams *params =
+ getParamPtr<ClearAttachmentsParams>(currentCommand);
+ const VkClearAttachment *attachments =
+ Offset<VkClearAttachment>(params, sizeof(ClearAttachmentsParams));
+ vkCmdClearAttachments(cmdBuffer, params->attachmentCount, attachments, 1,
+ &params->rect);
+ break;
+ }
+ case CommandID::ClearColorImage:
+ {
+ const ClearColorImageParams *params =
+ getParamPtr<ClearColorImageParams>(currentCommand);
+ vkCmdClearColorImage(cmdBuffer, params->image, params->imageLayout,
+ &params->color, 1, &params->range);
+ break;
+ }
+ case CommandID::ClearDepthStencilImage:
+ {
+ const ClearDepthStencilImageParams *params =
+ getParamPtr<ClearDepthStencilImageParams>(currentCommand);
+ vkCmdClearDepthStencilImage(cmdBuffer, params->image, params->imageLayout,
+ &params->depthStencil, 1, &params->range);
+ break;
+ }
+ case CommandID::CopyBuffer:
+ {
+ const CopyBufferParams *params = getParamPtr<CopyBufferParams>(currentCommand);
+ const VkBufferCopy *regions =
+ Offset<VkBufferCopy>(params, sizeof(CopyBufferParams));
+ vkCmdCopyBuffer(cmdBuffer, params->srcBuffer, params->destBuffer,
+ params->regionCount, regions);
+ break;
+ }
+ case CommandID::CopyBufferToImage:
+ {
+ const CopyBufferToImageParams *params =
+ getParamPtr<CopyBufferToImageParams>(currentCommand);
+ vkCmdCopyBufferToImage(cmdBuffer, params->srcBuffer, params->dstImage,
+ params->dstImageLayout, 1, &params->region);
+ break;
+ }
+ case CommandID::CopyImage:
+ {
+ const CopyImageParams *params = getParamPtr<CopyImageParams>(currentCommand);
+ vkCmdCopyImage(cmdBuffer, params->srcImage, params->srcImageLayout,
+ params->dstImage, params->dstImageLayout, 1, &params->region);
+ break;
+ }
+ case CommandID::CopyImageToBuffer:
+ {
+ const CopyImageToBufferParams *params =
+ getParamPtr<CopyImageToBufferParams>(currentCommand);
+ vkCmdCopyImageToBuffer(cmdBuffer, params->srcImage, params->srcImageLayout,
+ params->dstBuffer, 1, &params->region);
+ break;
+ }
+ case CommandID::Dispatch:
+ {
+ const DispatchParams *params = getParamPtr<DispatchParams>(currentCommand);
+ vkCmdDispatch(cmdBuffer, params->groupCountX, params->groupCountY,
+ params->groupCountZ);
+ break;
+ }
+ case CommandID::Draw:
+ {
+ const DrawParams *params = getParamPtr<DrawParams>(currentCommand);
+ vkCmdDraw(cmdBuffer, params->vertexCount, 1, params->firstVertex, 0);
+ break;
+ }
+ case CommandID::DrawIndexed:
+ {
+ const DrawIndexedParams *params =
+ getParamPtr<DrawIndexedParams>(currentCommand);
+ vkCmdDrawIndexed(cmdBuffer, params->indexCount, 1, 0, 0, 0);
+ break;
+ }
+ case CommandID::DrawIndexedInstanced:
+ {
+ const DrawIndexedInstancedParams *params =
+ getParamPtr<DrawIndexedInstancedParams>(currentCommand);
+ vkCmdDrawIndexed(cmdBuffer, params->indexCount, params->instanceCount, 0, 0, 0);
+ break;
+ }
+ case CommandID::DrawInstanced:
+ {
+ const DrawInstancedParams *params =
+ getParamPtr<DrawInstancedParams>(currentCommand);
+ vkCmdDraw(cmdBuffer, params->vertexCount, params->instanceCount,
+ params->firstVertex, 0);
+ break;
+ }
+ case CommandID::EndQuery:
+ {
+ const EndQueryParams *params = getParamPtr<EndQueryParams>(currentCommand);
+ vkCmdEndQuery(cmdBuffer, params->queryPool, params->query);
+ break;
+ }
+ case CommandID::ImageBarrier:
+ {
+ const ImageBarrierParams *params =
+ getParamPtr<ImageBarrierParams>(currentCommand);
+ vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask, 0,
+ 0, nullptr, 0, nullptr, 1, &params->imageMemoryBarrier);
+ break;
+ }
+ case CommandID::MemoryBarrier:
+ {
+ const MemoryBarrierParams *params =
+ getParamPtr<MemoryBarrierParams>(currentCommand);
+ vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask, 0,
+ 1, &params->memoryBarrier, 0, nullptr, 0, nullptr);
+ break;
+ }
+ case CommandID::PipelineBarrier:
+ {
+ const PipelineBarrierParams *params =
+ getParamPtr<PipelineBarrierParams>(currentCommand);
+ const VkMemoryBarrier *memoryBarriers =
+ Offset<VkMemoryBarrier>(params, sizeof(PipelineBarrierParams));
+ const VkBufferMemoryBarrier *bufferMemoryBarriers =
+ Offset<VkBufferMemoryBarrier>(
+ memoryBarriers, params->memoryBarrierCount * sizeof(VkMemoryBarrier));
+ const VkImageMemoryBarrier *imageMemoryBarriers = Offset<VkImageMemoryBarrier>(
+ bufferMemoryBarriers,
+ params->bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier));
+ vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask,
+ params->dependencyFlags, params->memoryBarrierCount,
+ memoryBarriers, params->bufferMemoryBarrierCount,
+ bufferMemoryBarriers, params->imageMemoryBarrierCount,
+ imageMemoryBarriers);
+ break;
+ }
+ case CommandID::PushConstants:
+ {
+ const PushConstantsParams *params =
+ getParamPtr<PushConstantsParams>(currentCommand);
+ const void *data = Offset<void>(params, sizeof(PushConstantsParams));
+ vkCmdPushConstants(cmdBuffer, params->layout, params->flag, params->offset,
+ params->size, data);
+ break;
+ }
+ case CommandID::ResetEvent:
+ {
+ const ResetEventParams *params = getParamPtr<ResetEventParams>(currentCommand);
+ vkCmdResetEvent(cmdBuffer, params->event, params->stageMask);
+ break;
+ }
+ case CommandID::ResetQueryPool:
+ {
+ const ResetQueryPoolParams *params =
+ getParamPtr<ResetQueryPoolParams>(currentCommand);
+ vkCmdResetQueryPool(cmdBuffer, params->queryPool, params->firstQuery,
+ params->queryCount);
+ break;
+ }
+ case CommandID::SetEvent:
+ {
+ const SetEventParams *params = getParamPtr<SetEventParams>(currentCommand);
+ vkCmdSetEvent(cmdBuffer, params->event, params->stageMask);
+ break;
+ }
+ case CommandID::WaitEvents:
+ {
+ const WaitEventsParams *params = getParamPtr<WaitEventsParams>(currentCommand);
+ const VkEvent *events = Offset<VkEvent>(params, sizeof(WaitEventsParams));
+ const VkMemoryBarrier *memoryBarriers =
+ Offset<VkMemoryBarrier>(events, params->eventCount * sizeof(VkEvent));
+ const VkBufferMemoryBarrier *bufferMemoryBarriers =
+ Offset<VkBufferMemoryBarrier>(
+ memoryBarriers, params->memoryBarrierCount * sizeof(VkMemoryBarrier));
+ const VkImageMemoryBarrier *imageMemoryBarriers = Offset<VkImageMemoryBarrier>(
+ bufferMemoryBarriers,
+ params->bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier));
+ vkCmdWaitEvents(cmdBuffer, params->eventCount, events, params->srcStageMask,
+ params->dstStageMask, params->memoryBarrierCount,
+ memoryBarriers, params->bufferMemoryBarrierCount,
+ bufferMemoryBarriers, params->imageMemoryBarrierCount,
+ imageMemoryBarriers);
+ break;
+ }
+ case CommandID::WriteTimestamp:
+ {
+ const WriteTimestampParams *params =
+ getParamPtr<WriteTimestampParams>(currentCommand);
+ vkCmdWriteTimestamp(cmdBuffer, params->pipelineStage, params->queryPool,
+ params->query);
+ break;
+ }
+ default:
+ {
+ UNREACHABLE();
+ break;
+ }
}
- case CommandID::WriteTimestamp:
- {
- WriteTimestampParams *params = getParamPtr<WriteTimestampParams>(currentCommand);
- vkCmdWriteTimestamp(cmdBuffer, params->pipelineStage, params->queryPool,
- params->query);
- break;
- }
- default:
+ }
+ }
+}
+
+std::string SecondaryCommandBuffer::dumpCommands(const char *separator) const
+{
+ std::string result;
+ for (const CommandHeader *command : mCommands)
+ {
+ for (const CommandHeader *currentCommand = command;
+ currentCommand->id != CommandID::Invalid; currentCommand = NextCommand(currentCommand))
+ {
+ result += separator;
+ switch (currentCommand->id)
{
- UNREACHABLE();
- break;
+ case CommandID::BeginQuery:
+ result += "BeginQuery";
+ break;
+ case CommandID::BindComputeDescriptorSets:
+ result += "BindComputeDescriptorSets";
+ break;
+ case CommandID::BindComputePipeline:
+ result += "BindComputePipeline";
+ break;
+ case CommandID::BindGraphicsDescriptorSets:
+ result += "BindGraphicsDescriptorSets";
+ break;
+ case CommandID::BindGraphicsPipeline:
+ result += "BindGraphicsPipeline";
+ break;
+ case CommandID::BindIndexBuffer:
+ result += "BindIndexBuffer";
+ break;
+ case CommandID::BindVertexBuffers:
+ result += "BindVertexBuffers";
+ break;
+ case CommandID::BlitImage:
+ result += "BlitImage";
+ break;
+ case CommandID::ClearAttachments:
+ result += "ClearAttachments";
+ break;
+ case CommandID::ClearColorImage:
+ result += "ClearColorImage";
+ break;
+ case CommandID::ClearDepthStencilImage:
+ result += "ClearDepthStencilImage";
+ break;
+ case CommandID::CopyBuffer:
+ result += "CopyBuffer";
+ break;
+ case CommandID::CopyBufferToImage:
+ result += "CopyBufferToImage";
+ break;
+ case CommandID::CopyImage:
+ result += "CopyImage";
+ break;
+ case CommandID::CopyImageToBuffer:
+ result += "CopyImageToBuffer";
+ break;
+ case CommandID::Dispatch:
+ result += "Dispatch";
+ break;
+ case CommandID::Draw:
+ result += "Draw";
+ break;
+ case CommandID::DrawIndexed:
+ result += "DrawIndexed";
+ break;
+ case CommandID::DrawIndexedInstanced:
+ result += "DrawIndexedInstanced";
+ break;
+ case CommandID::DrawInstanced:
+ result += "DrawInstanced";
+ break;
+ case CommandID::EndQuery:
+ result += "EndQuery";
+ break;
+ case CommandID::ImageBarrier:
+ result += "ImageBarrier";
+ break;
+ case CommandID::MemoryBarrier:
+ result += "MemoryBarrier";
+ break;
+ case CommandID::PipelineBarrier:
+ result += "PipelineBarrier";
+ break;
+ case CommandID::PushConstants:
+ result += "PushConstants";
+ break;
+ case CommandID::ResetEvent:
+ result += "ResetEvent";
+ break;
+ case CommandID::ResetQueryPool:
+ result += "ResetQueryPool";
+ break;
+ case CommandID::SetEvent:
+ result += "SetEvent";
+ break;
+ case CommandID::WaitEvents:
+ result += "WaitEvents";
+ break;
+ case CommandID::WriteTimestamp:
+ result += "WriteTimestamp";
+ break;
+ default:
+ {
+ UNREACHABLE();
+ result += "--invalid--";
+ break;
+ }
}
}
}
+ return result;
}
+} // namespace priv
} // namespace vk
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h
index 31b3f59690d..912a4c981fb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SecondaryCommandBuffer.h
@@ -14,6 +14,7 @@
#include <vulkan/vulkan.h>
#include "common/PoolAlloc.h"
+#include "libANGLE/renderer/vulkan/vk_wrapper.h"
namespace rx
{
@@ -21,54 +22,72 @@ namespace rx
namespace vk
{
-enum class CommandID
-{
- // State update cmds
- BindDescriptorSets = 0,
- BindIndexBuffer = 1,
- BindPipeline = 2,
- BindVertexBuffers = 3,
- BlitImage = 4,
- CopyBuffer = 5,
- CopyBufferToImage = 6,
- CopyImage = 7,
- CopyImageToBuffer = 8,
- ClearAttachments = 9,
- ClearColorImage = 10,
- ClearDepthStencilImage = 11,
- UpdateBuffer = 12,
- PushConstants = 13,
- SetViewport = 14,
- SetScissor = 15,
- // Draw/dispatch cmds
- Draw = 16,
- DrawIndexed = 17,
- Dispatch = 18,
- // Sync & Query cmds
- PipelinBarrier = 19,
- ResetEvent = 20,
- SetEvent = 21,
- WaitEvents = 22,
- ResetQueryPool = 23,
- BeginQuery = 24,
- EndQuery = 25,
- WriteTimestamp = 26,
+namespace priv
+{
+
+enum class CommandID : uint16_t
+{
+ // Invalid cmd used to mark end of sequence of commands
+ Invalid = 0,
+ BeginQuery,
+ BindComputeDescriptorSets,
+ BindComputePipeline,
+ BindGraphicsDescriptorSets,
+ BindGraphicsPipeline,
+ BindIndexBuffer,
+ BindVertexBuffers,
+ BlitImage,
+ ClearAttachments,
+ ClearColorImage,
+ ClearDepthStencilImage,
+ CopyBuffer,
+ CopyBufferToImage,
+ CopyImage,
+ CopyImageToBuffer,
+ Dispatch,
+ Draw,
+ DrawIndexed,
+ DrawIndexedInstanced,
+ DrawInstanced,
+ EndQuery,
+ ImageBarrier,
+ MemoryBarrier,
+ PipelineBarrier,
+ PushConstants,
+ ResetEvent,
+ ResetQueryPool,
+ SetEvent,
+ WaitEvents,
+ WriteTimestamp,
};
+#define VERIFY_4_BYTE_ALIGNMENT(StructName) \
+ static_assert((sizeof(StructName) % 4) == 0, "Check StructName alignment");
+
// Structs to encapsulate parameters for different commands
// This makes it easy to know the size of params & to copy params
// TODO: Could optimize the size of some of these structs through bit-packing
// and customizing sizing based on limited parameter sets used by ANGLE
-struct BindDescriptorSetParams
+struct BindPipelineParams
+{
+ VkPipeline pipeline;
+};
+VERIFY_4_BYTE_ALIGNMENT(BindPipelineParams)
+
+struct BindGraphicsDescriptorSetParams
{
- VkPipelineBindPoint bindPoint;
VkPipelineLayout layout;
uint32_t firstSet;
uint32_t descriptorSetCount;
- const VkDescriptorSet *descriptorSets;
uint32_t dynamicOffsetCount;
- const uint32_t *dynamicOffsets;
};
+VERIFY_4_BYTE_ALIGNMENT(BindGraphicsDescriptorSetParams)
+
+struct BindComputeDescriptorSetParams
+{
+ VkPipelineLayout layout;
+};
+VERIFY_4_BYTE_ALIGNMENT(BindComputeDescriptorSetParams)
struct BindIndexBufferParams
{
@@ -76,48 +95,40 @@ struct BindIndexBufferParams
VkDeviceSize offset;
VkIndexType indexType;
};
-
-struct BindPipelineParams
-{
- VkPipelineBindPoint pipelineBindPoint;
- VkPipeline pipeline;
-};
+VERIFY_4_BYTE_ALIGNMENT(BindIndexBufferParams)
struct BindVertexBuffersParams
{
- uint32_t firstBinding;
+ // ANGLE always has firstBinding of 0 so not storing that currently
uint32_t bindingCount;
- const VkBuffer *buffers;
- const VkDeviceSize *offsets;
};
+VERIFY_4_BYTE_ALIGNMENT(BindVertexBuffersParams)
struct BlitImageParams
{
VkImage srcImage;
- VkImageLayout srcImageLayout;
VkImage dstImage;
- VkImageLayout dstImageLayout;
- uint32_t regionCount;
- const VkImageBlit *pRegions;
VkFilter filter;
+ VkImageBlit region;
};
+VERIFY_4_BYTE_ALIGNMENT(BlitImageParams)
struct CopyBufferParams
{
VkBuffer srcBuffer;
VkBuffer destBuffer;
uint32_t regionCount;
- const VkBufferCopy *regions;
};
+VERIFY_4_BYTE_ALIGNMENT(CopyBufferParams)
struct CopyBufferToImageParams
{
VkBuffer srcBuffer;
VkImage dstImage;
VkImageLayout dstImageLayout;
- uint32_t regionCount;
- const VkBufferImageCopy *regions;
+ VkBufferImageCopy region;
};
+VERIFY_4_BYTE_ALIGNMENT(CopyBufferToImageParams)
struct CopyImageParams
{
@@ -125,52 +136,43 @@ struct CopyImageParams
VkImageLayout srcImageLayout;
VkImage dstImage;
VkImageLayout dstImageLayout;
- uint32_t regionCount;
- const VkImageCopy *regions;
+ VkImageCopy region;
};
+VERIFY_4_BYTE_ALIGNMENT(CopyImageParams)
struct CopyImageToBufferParams
{
VkImage srcImage;
VkImageLayout srcImageLayout;
VkBuffer dstBuffer;
- uint32_t regionCount;
- const VkBufferImageCopy *regions;
+ VkBufferImageCopy region;
};
+VERIFY_4_BYTE_ALIGNMENT(CopyImageToBufferParams)
struct ClearAttachmentsParams
{
uint32_t attachmentCount;
- const VkClearAttachment *attachments;
- uint32_t rectCount;
- const VkClearRect *rects;
+ VkClearRect rect;
};
+VERIFY_4_BYTE_ALIGNMENT(ClearAttachmentsParams)
struct ClearColorImageParams
{
VkImage image;
VkImageLayout imageLayout;
VkClearColorValue color;
- uint32_t rangeCount;
- const VkImageSubresourceRange *ranges;
+ VkImageSubresourceRange range;
};
+VERIFY_4_BYTE_ALIGNMENT(ClearColorImageParams)
struct ClearDepthStencilImageParams
{
VkImage image;
VkImageLayout imageLayout;
VkClearDepthStencilValue depthStencil;
- uint32_t rangeCount;
- const VkImageSubresourceRange *ranges;
-};
-
-struct UpdateBufferParams
-{
- VkBuffer buffer;
- VkDeviceSize dstOffset;
- VkDeviceSize dataSize;
- const void *data;
+ VkImageSubresourceRange range;
};
+VERIFY_4_BYTE_ALIGNMENT(ClearDepthStencilImageParams)
struct PushConstantsParams
{
@@ -178,39 +180,36 @@ struct PushConstantsParams
VkShaderStageFlags flag;
uint32_t offset;
uint32_t size;
- const void *data;
};
+VERIFY_4_BYTE_ALIGNMENT(PushConstantsParams)
-struct SetViewportParams
-{
- uint32_t firstViewport;
- uint32_t viewportCount;
- const VkViewport *viewports;
-};
-
-struct SetScissorParams
+struct DrawParams
{
- uint32_t firstScissor;
- uint32_t scissorCount;
- const VkRect2D *scissors;
+ uint32_t vertexCount;
+ uint32_t firstVertex;
};
+VERIFY_4_BYTE_ALIGNMENT(DrawParams)
-struct DrawParams
+struct DrawInstancedParams
{
uint32_t vertexCount;
uint32_t instanceCount;
uint32_t firstVertex;
- uint32_t firstInstance;
};
+VERIFY_4_BYTE_ALIGNMENT(DrawInstancedParams)
struct DrawIndexedParams
{
uint32_t indexCount;
+};
+VERIFY_4_BYTE_ALIGNMENT(DrawIndexedParams)
+
+struct DrawIndexedInstancedParams
+{
+ uint32_t indexCount;
uint32_t instanceCount;
- uint32_t firstIndex;
- int32_t vertexOffset;
- uint32_t firstInstance;
};
+VERIFY_4_BYTE_ALIGNMENT(DrawIndexedInstancedParams)
struct DispatchParams
{
@@ -218,6 +217,15 @@ struct DispatchParams
uint32_t groupCountY;
uint32_t groupCountZ;
};
+VERIFY_4_BYTE_ALIGNMENT(DispatchParams)
+
+struct MemoryBarrierParams
+{
+ VkPipelineStageFlags srcStageMask;
+ VkPipelineStageFlags dstStageMask;
+ VkMemoryBarrier memoryBarrier;
+};
+VERIFY_4_BYTE_ALIGNMENT(MemoryBarrierParams)
struct PipelineBarrierParams
{
@@ -225,38 +233,43 @@ struct PipelineBarrierParams
VkPipelineStageFlags dstStageMask;
VkDependencyFlags dependencyFlags;
uint32_t memoryBarrierCount;
- const VkMemoryBarrier *memoryBarriers;
uint32_t bufferMemoryBarrierCount;
- const VkBufferMemoryBarrier *bufferMemoryBarriers;
uint32_t imageMemoryBarrierCount;
- const VkImageMemoryBarrier *imageMemoryBarriers;
};
+VERIFY_4_BYTE_ALIGNMENT(PipelineBarrierParams)
+
+struct ImageBarrierParams
+{
+ VkPipelineStageFlags srcStageMask;
+ VkPipelineStageFlags dstStageMask;
+ VkImageMemoryBarrier imageMemoryBarrier;
+};
+VERIFY_4_BYTE_ALIGNMENT(ImageBarrierParams)
struct SetEventParams
{
VkEvent event;
VkPipelineStageFlags stageMask;
};
+VERIFY_4_BYTE_ALIGNMENT(SetEventParams)
struct ResetEventParams
{
VkEvent event;
VkPipelineStageFlags stageMask;
};
+VERIFY_4_BYTE_ALIGNMENT(ResetEventParams)
struct WaitEventsParams
{
uint32_t eventCount;
- const VkEvent *events;
VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
uint32_t memoryBarrierCount;
- const VkMemoryBarrier *memoryBarriers;
uint32_t bufferMemoryBarrierCount;
- const VkBufferMemoryBarrier *bufferMemoryBarriers;
uint32_t imageMemoryBarrierCount;
- const VkImageMemoryBarrier *imageMemoryBarriers;
};
+VERIFY_4_BYTE_ALIGNMENT(WaitEventsParams)
struct ResetQueryPoolParams
{
@@ -264,6 +277,7 @@ struct ResetQueryPoolParams
uint32_t firstQuery;
uint32_t queryCount;
};
+VERIFY_4_BYTE_ALIGNMENT(ResetQueryPoolParams)
struct BeginQueryParams
{
@@ -271,12 +285,14 @@ struct BeginQueryParams
uint32_t query;
VkQueryControlFlags flags;
};
+VERIFY_4_BYTE_ALIGNMENT(BeginQueryParams)
struct EndQueryParams
{
VkQueryPool queryPool;
uint32_t query;
};
+VERIFY_4_BYTE_ALIGNMENT(EndQueryParams)
struct WriteTimestampParams
{
@@ -284,115 +300,133 @@ struct WriteTimestampParams
VkQueryPool queryPool;
uint32_t query;
};
+VERIFY_4_BYTE_ALIGNMENT(WriteTimestampParams)
// Header for every cmd in custom cmd buffer
struct CommandHeader
{
CommandID id;
- CommandHeader *next;
+ uint16_t size;
};
+static_assert(sizeof(CommandHeader) == 4, "Check CommandHeader size");
+
+template <typename DestT, typename T>
+ANGLE_INLINE DestT *Offset(T *ptr, size_t bytes)
+{
+ return reinterpret_cast<DestT *>((reinterpret_cast<uint8_t *>(ptr) + bytes));
+}
+
+template <typename DestT, typename T>
+ANGLE_INLINE const DestT *Offset(const T *ptr, size_t bytes)
+{
+ return reinterpret_cast<const DestT *>((reinterpret_cast<const uint8_t *>(ptr) + bytes));
+}
+
class SecondaryCommandBuffer final : angle::NonCopyable
{
public:
- SecondaryCommandBuffer(angle::PoolAllocator *allocator)
- : mHead(nullptr), mLast(nullptr), mAllocator(allocator)
- {}
- ~SecondaryCommandBuffer() {}
+ SecondaryCommandBuffer();
+ ~SecondaryCommandBuffer();
+
+ static bool SupportsQueries(const VkPhysicalDeviceFeatures &features) { return true; }
+
+ // SecondaryCommandBuffer replays its commands inline when executed on the primary command
+ // buffer.
+ static constexpr bool ExecutesInline() { return true; }
// Add commands
- void bindDescriptorSets(VkPipelineBindPoint bindPoint,
- VkPipelineLayout layout,
- uint32_t firstSet,
- uint32_t descriptorSetCount,
- const VkDescriptorSet *descriptorSets,
- uint32_t dynamicOffsetCount,
- const uint32_t *dynamicOffsets);
+ void beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
+
+ void bindComputeDescriptorSets(const PipelineLayout &layout,
+ const VkDescriptorSet *descriptorSets);
- void bindIndexBuffer(const VkBuffer &buffer, VkDeviceSize offset, VkIndexType indexType);
+ void bindComputePipeline(const Pipeline &pipeline);
- void bindPipeline(VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
+ void bindGraphicsDescriptorSets(const PipelineLayout &layout,
+ uint32_t firstSet,
+ uint32_t descriptorSetCount,
+ const VkDescriptorSet *descriptorSets,
+ uint32_t dynamicOffsetCount,
+ const uint32_t *dynamicOffsets);
+
+ void bindGraphicsPipeline(const Pipeline &pipeline);
+
+ void bindIndexBuffer(const Buffer &buffer, VkDeviceSize offset, VkIndexType indexType);
void bindVertexBuffers(uint32_t firstBinding,
uint32_t bindingCount,
const VkBuffer *buffers,
const VkDeviceSize *offsets);
- void blitImage(VkImage srcImage,
+ void blitImage(const Image &srcImage,
VkImageLayout srcImageLayout,
- VkImage dstImage,
+ const Image &dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkImageBlit *pRegions,
VkFilter filter);
- void copyBuffer(const VkBuffer &srcBuffer,
- const VkBuffer &destBuffer,
+ void clearAttachments(uint32_t attachmentCount,
+ const VkClearAttachment *attachments,
+ uint32_t rectCount,
+ const VkClearRect *rects);
+
+ void clearColorImage(const Image &image,
+ VkImageLayout imageLayout,
+ const VkClearColorValue &color,
+ uint32_t rangeCount,
+ const VkImageSubresourceRange *ranges);
+
+ void clearDepthStencilImage(const Image &image,
+ VkImageLayout imageLayout,
+ const VkClearDepthStencilValue &depthStencil,
+ uint32_t rangeCount,
+ const VkImageSubresourceRange *ranges);
+
+ void copyBuffer(const Buffer &srcBuffer,
+ const Buffer &destBuffer,
uint32_t regionCount,
const VkBufferCopy *regions);
void copyBufferToImage(VkBuffer srcBuffer,
- VkImage dstImage,
+ const Image &dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkBufferImageCopy *regions);
- void copyImage(VkImage srcImage,
+ void copyImage(const Image &srcImage,
VkImageLayout srcImageLayout,
- VkImage dstImage,
+ const Image &dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkImageCopy *regions);
- void copyImageToBuffer(VkImage srcImage,
+ void copyImageToBuffer(const Image &srcImage,
VkImageLayout srcImageLayout,
VkBuffer dstBuffer,
uint32_t regionCount,
const VkBufferImageCopy *regions);
- void clearAttachments(uint32_t attachmentCount,
- const VkClearAttachment *attachments,
- uint32_t rectCount,
- const VkClearRect *rects);
+ void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
- void clearColorImage(VkImage image,
- VkImageLayout imageLayout,
- const VkClearColorValue &color,
- uint32_t rangeCount,
- const VkImageSubresourceRange *ranges);
+ void draw(uint32_t vertexCount, uint32_t firstVertex);
- void clearDepthStencilImage(VkImage image,
- VkImageLayout imageLayout,
- const VkClearDepthStencilValue &depthStencil,
- uint32_t rangeCount,
- const VkImageSubresourceRange *ranges);
-
- void updateBuffer(VkBuffer buffer,
- VkDeviceSize dstOffset,
- VkDeviceSize dataSize,
- const void *data);
+ void drawIndexed(uint32_t indexCount);
- void pushConstants(VkPipelineLayout layout,
- VkShaderStageFlags flag,
- uint32_t offset,
- uint32_t size,
- const void *data);
+ void drawIndexedInstanced(uint32_t indexCount, uint32_t instanceCount);
- void setViewport(uint32_t firstViewport, uint32_t viewportCount, const VkViewport *viewports);
- void setScissor(uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *scissors);
+ void drawInstanced(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex);
- void draw(uint32_t vertexCount,
- uint32_t instanceCount,
- uint32_t firstVertex,
- uint32_t firstInstance);
+ void endQuery(VkQueryPool queryPool, uint32_t query);
- void drawIndexed(uint32_t indexCount,
- uint32_t instanceCount,
- uint32_t firstIndex,
- int32_t vertexOffset,
- uint32_t firstInstance);
+ void imageBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkImageMemoryBarrier *imageMemoryBarrier);
- void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
+ void memoryBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkMemoryBarrier *memoryBarrier);
void pipelineBarrier(VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask,
@@ -404,8 +438,18 @@ class SecondaryCommandBuffer final : angle::NonCopyable
uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier *imageMemoryBarriers);
- void setEvent(VkEvent event, VkPipelineStageFlags stageMask);
+ void pushConstants(const PipelineLayout &layout,
+ VkShaderStageFlags flag,
+ uint32_t offset,
+ uint32_t size,
+ const void *data);
+
void resetEvent(VkEvent event, VkPipelineStageFlags stageMask);
+
+ void resetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
+
+ void setEvent(VkEvent event, VkPipelineStageFlags stageMask);
+
void waitEvents(uint32_t eventCount,
const VkEvent *events,
VkPipelineStageFlags srcStageMask,
@@ -417,47 +461,530 @@ class SecondaryCommandBuffer final : angle::NonCopyable
uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier *imageMemoryBarriers);
- void resetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
- void beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
- void endQuery(VkQueryPool queryPool, uint32_t query);
void writeTimestamp(VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool,
uint32_t query);
+ // No-op for compatibility
+ VkResult end() { return VK_SUCCESS; }
// Parse the cmds in this cmd buffer into given primary cmd buffer for execution
void executeCommands(VkCommandBuffer cmdBuffer);
+ // Traverse the list of commands and build a summary for diagnostics.
+ std::string dumpCommands(const char *separator) const;
+
+ // Pool Alloc uses 16kB pages w/ 16byte header = 16368bytes. To minimize waste
+ // using a 16368/12 = 1364. Also better perf than 1024 due to fewer block allocations
+ static constexpr size_t kBlockSize = 1364;
+ // Make sure block size is 4-byte aligned to avoid Android errors
+ static_assert((kBlockSize % 4) == 0, "Check kBlockSize alignment");
+
+ // Initialize the SecondaryCommandBuffer by setting the allocator it will use
+ void initialize(angle::PoolAllocator *allocator)
+ {
+ ASSERT(allocator);
+ mAllocator = allocator;
+ allocateNewBlock();
+ // Set first command to Invalid to start
+ reinterpret_cast<CommandHeader *>(mCurrentWritePointer)->id = CommandID::Invalid;
+ }
+
+ // This will cause the SecondaryCommandBuffer to become invalid by clearing its allocator
+ void releaseHandle() { mAllocator = nullptr; }
+ // The SecondaryCommandBuffer is valid if it's been initialized
+ bool valid() const { return mAllocator != nullptr; }
+
+ bool empty() const { return mCommands.size() == 0 || mCommands[0]->id == CommandID::Invalid; }
+
private:
- // Allocate and initialize memory for given commandID & variable param size
- // returning a pointer to the start of the commands parameter data and updating
- // mPtrCmdData to just past the fixed parameter data.
template <class StructType>
- StructType *initCommand(CommandID cmdID, size_t variableSize);
+ ANGLE_INLINE StructType *commonInit(CommandID cmdID, size_t allocationSize)
+ {
+ mCurrentBytesRemaining -= allocationSize;
+
+ CommandHeader *header = reinterpret_cast<CommandHeader *>(mCurrentWritePointer);
+ header->id = cmdID;
+ header->size = static_cast<uint16_t>(allocationSize);
+ ASSERT(allocationSize <= std::numeric_limits<uint16_t>::max());
+
+ mCurrentWritePointer += allocationSize;
+ // Set next cmd header to Invalid (0) so cmd sequence will be terminated
+ reinterpret_cast<CommandHeader *>(mCurrentWritePointer)->id = CommandID::Invalid;
+ return Offset<StructType>(header, sizeof(CommandHeader));
+ }
+ ANGLE_INLINE void allocateNewBlock()
+ {
+ ASSERT(mAllocator);
+ mCurrentWritePointer = mAllocator->fastAllocate(kBlockSize);
+ mCurrentBytesRemaining = kBlockSize;
+ mCommands.push_back(reinterpret_cast<CommandHeader *>(mCurrentWritePointer));
+ }
+
+ // Allocate and initialize memory for given commandID & variable param size, setting
+ // variableDataPtr to the byte following fixed cmd data where variable-sized ptr data will
+ // be written and returning a pointer to the start of the command's parameter data
+ template <class StructType>
+ ANGLE_INLINE StructType *initCommand(CommandID cmdID,
+ size_t variableSize,
+ uint8_t **variableDataPtr)
+ {
+ constexpr size_t fixedAllocationSize = sizeof(StructType) + sizeof(CommandHeader);
+ const size_t allocationSize = fixedAllocationSize + variableSize;
+ // Make sure we have enough room to mark follow-on header "Invalid"
+ if (mCurrentBytesRemaining <= (allocationSize + sizeof(CommandHeader)))
+ {
+ allocateNewBlock();
+ }
+ *variableDataPtr = Offset<uint8_t>(mCurrentWritePointer, fixedAllocationSize);
+ return commonInit<StructType>(cmdID, allocationSize);
+ }
+
+ // Initialize a command that doesn't have variable-sized ptr data
+ template <class StructType>
+ ANGLE_INLINE StructType *initCommand(CommandID cmdID)
+ {
+ constexpr size_t allocationSize = sizeof(StructType) + sizeof(CommandHeader);
+ // Make sure we have enough room to mark follow-on header "Invalid"
+ if (mCurrentBytesRemaining <= (allocationSize + sizeof(CommandHeader)))
+ {
+ allocateNewBlock();
+ }
+ return commonInit<StructType>(cmdID, allocationSize);
+ }
+
// Return a ptr to the parameter type
template <class StructType>
- StructType *getParamPtr(CommandHeader *header)
+ const StructType *getParamPtr(const CommandHeader *header) const
{
- return reinterpret_cast<StructType *>(reinterpret_cast<char *>(header) +
- sizeof(CommandHeader));
+ return reinterpret_cast<const StructType *>(reinterpret_cast<const uint8_t *>(header) +
+ sizeof(CommandHeader));
}
- // Copy sizeInBytes data from paramData to mPtrCmdData and assign *writePtr
- // to mPtrCmdData. Then increment mPtrCmdData by sizeInBytes.
- // Precondition: initCommand() must have already been called on the given cmd
+ // Copy sizeInBytes data from paramData to writePointer & return writePointer plus sizeInBytes.
template <class PtrType>
- void storePointerParameter(const PtrType *paramData,
- const PtrType **writePtr,
- size_t sizeInBytes);
-
- // Pointer to start of cmd buffer
- CommandHeader *mHead;
- // Last command inserted in cmd buffer
- CommandHeader *mLast;
+ ANGLE_INLINE uint8_t *storePointerParameter(uint8_t *writePointer,
+ const PtrType *paramData,
+ size_t sizeInBytes)
+ {
+ memcpy(writePointer, paramData, sizeInBytes);
+ return writePointer + sizeInBytes;
+ }
+
+ std::vector<CommandHeader *> mCommands;
+
+ // Allocator used by this class. If non-null then the class is valid.
angle::PoolAllocator *mAllocator;
- // Ptr to write variable ptr data section of cmd into.
- // This is set to just past fixed parameter data when initCommand() is called
- uint8_t *mPtrCmdData;
+
+ uint8_t *mCurrentWritePointer;
+ size_t mCurrentBytesRemaining;
};
+ANGLE_INLINE SecondaryCommandBuffer::SecondaryCommandBuffer()
+ : mAllocator(nullptr), mCurrentWritePointer(nullptr), mCurrentBytesRemaining(0)
+{}
+ANGLE_INLINE SecondaryCommandBuffer::~SecondaryCommandBuffer() {}
+
+ANGLE_INLINE void SecondaryCommandBuffer::beginQuery(VkQueryPool queryPool,
+ uint32_t query,
+ VkQueryControlFlags flags)
+{
+ BeginQueryParams *paramStruct = initCommand<BeginQueryParams>(CommandID::BeginQuery);
+ paramStruct->queryPool = queryPool;
+ paramStruct->query = query;
+ paramStruct->flags = flags;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::bindComputePipeline(const Pipeline &pipeline)
+{
+ BindPipelineParams *paramStruct =
+ initCommand<BindPipelineParams>(CommandID::BindComputePipeline);
+ paramStruct->pipeline = pipeline.getHandle();
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::bindGraphicsDescriptorSets(
+ const PipelineLayout &layout,
+ uint32_t firstSet,
+ uint32_t descriptorSetCount,
+ const VkDescriptorSet *descriptorSets,
+ uint32_t dynamicOffsetCount,
+ const uint32_t *dynamicOffsets)
+{
+ size_t descSize = descriptorSetCount * sizeof(VkDescriptorSet);
+ size_t offsetSize = dynamicOffsetCount * sizeof(uint32_t);
+ uint8_t *writePtr;
+ BindGraphicsDescriptorSetParams *paramStruct = initCommand<BindGraphicsDescriptorSetParams>(
+ CommandID::BindGraphicsDescriptorSets, descSize + offsetSize, &writePtr);
+ // Copy params into memory
+ paramStruct->layout = layout.getHandle();
+ paramStruct->firstSet = firstSet;
+ paramStruct->descriptorSetCount = descriptorSetCount;
+ paramStruct->dynamicOffsetCount = dynamicOffsetCount;
+ // Copy variable sized data
+ writePtr = storePointerParameter(writePtr, descriptorSets, descSize);
+ storePointerParameter(writePtr, dynamicOffsets, offsetSize);
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::bindComputeDescriptorSets(
+ const PipelineLayout &layout,
+ const VkDescriptorSet *descriptorSets)
+{
+ uint8_t *writePtr;
+ BindComputeDescriptorSetParams *paramStruct = initCommand<BindComputeDescriptorSetParams>(
+ CommandID::BindComputeDescriptorSets, sizeof(VkDescriptorSet), &writePtr);
+ // Copy params into memory
+ paramStruct->layout = layout.getHandle();
+ // Copy variable sized data
+ storePointerParameter(writePtr, descriptorSets, sizeof(VkDescriptorSet));
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::bindGraphicsPipeline(const Pipeline &pipeline)
+{
+ BindPipelineParams *paramStruct =
+ initCommand<BindPipelineParams>(CommandID::BindGraphicsPipeline);
+ paramStruct->pipeline = pipeline.getHandle();
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::bindIndexBuffer(const Buffer &buffer,
+ VkDeviceSize offset,
+ VkIndexType indexType)
+{
+ BindIndexBufferParams *paramStruct =
+ initCommand<BindIndexBufferParams>(CommandID::BindIndexBuffer);
+ paramStruct->buffer = buffer.getHandle();
+ paramStruct->offset = offset;
+ paramStruct->indexType = indexType;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::bindVertexBuffers(uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer *buffers,
+ const VkDeviceSize *offsets)
+{
+ ASSERT(firstBinding == 0);
+ uint8_t *writePtr;
+ size_t buffersSize = bindingCount * sizeof(VkBuffer);
+ size_t offsetsSize = bindingCount * sizeof(VkDeviceSize);
+ BindVertexBuffersParams *paramStruct = initCommand<BindVertexBuffersParams>(
+ CommandID::BindVertexBuffers, buffersSize + offsetsSize, &writePtr);
+ // Copy params
+ paramStruct->bindingCount = bindingCount;
+ writePtr = storePointerParameter(writePtr, buffers, buffersSize);
+ storePointerParameter(writePtr, offsets, offsetsSize);
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::blitImage(const Image &srcImage,
+ VkImageLayout srcImageLayout,
+ const Image &dstImage,
+ VkImageLayout dstImageLayout,
+ uint32_t regionCount,
+ const VkImageBlit *pRegions,
+ VkFilter filter)
+{
+ // Currently ANGLE uses limited params so verify those assumptions and update if they change
+ ASSERT(srcImageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+ ASSERT(dstImageLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+ ASSERT(regionCount == 1);
+ BlitImageParams *paramStruct = initCommand<BlitImageParams>(CommandID::BlitImage);
+ paramStruct->srcImage = srcImage.getHandle();
+ paramStruct->dstImage = dstImage.getHandle();
+ paramStruct->filter = filter;
+ paramStruct->region = pRegions[0];
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::clearAttachments(uint32_t attachmentCount,
+ const VkClearAttachment *attachments,
+ uint32_t rectCount,
+ const VkClearRect *rects)
+{
+ ASSERT(rectCount == 1);
+ uint8_t *writePtr;
+ size_t attachSize = attachmentCount * sizeof(VkClearAttachment);
+ ClearAttachmentsParams *paramStruct =
+ initCommand<ClearAttachmentsParams>(CommandID::ClearAttachments, attachSize, &writePtr);
+ paramStruct->attachmentCount = attachmentCount;
+ paramStruct->rect = rects[0];
+ // Copy variable sized data
+ storePointerParameter(writePtr, attachments, attachSize);
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::clearColorImage(const Image &image,
+ VkImageLayout imageLayout,
+ const VkClearColorValue &color,
+ uint32_t rangeCount,
+ const VkImageSubresourceRange *ranges)
+{
+ ASSERT(rangeCount == 1);
+ ClearColorImageParams *paramStruct =
+ initCommand<ClearColorImageParams>(CommandID::ClearColorImage);
+ paramStruct->image = image.getHandle();
+ paramStruct->imageLayout = imageLayout;
+ paramStruct->color = color;
+ paramStruct->range = ranges[0];
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::clearDepthStencilImage(
+ const Image &image,
+ VkImageLayout imageLayout,
+ const VkClearDepthStencilValue &depthStencil,
+ uint32_t rangeCount,
+ const VkImageSubresourceRange *ranges)
+{
+ ASSERT(rangeCount == 1);
+ ClearDepthStencilImageParams *paramStruct =
+ initCommand<ClearDepthStencilImageParams>(CommandID::ClearDepthStencilImage);
+ paramStruct->image = image.getHandle();
+ paramStruct->imageLayout = imageLayout;
+ paramStruct->depthStencil = depthStencil;
+ paramStruct->range = ranges[0];
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::copyBuffer(const Buffer &srcBuffer,
+ const Buffer &destBuffer,
+ uint32_t regionCount,
+ const VkBufferCopy *regions)
+{
+ uint8_t *writePtr;
+ size_t regionSize = regionCount * sizeof(VkBufferCopy);
+ CopyBufferParams *paramStruct =
+ initCommand<CopyBufferParams>(CommandID::CopyBuffer, regionSize, &writePtr);
+ paramStruct->srcBuffer = srcBuffer.getHandle();
+ paramStruct->destBuffer = destBuffer.getHandle();
+ paramStruct->regionCount = regionCount;
+ // Copy variable sized data
+ storePointerParameter(writePtr, regions, regionSize);
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::copyBufferToImage(VkBuffer srcBuffer,
+ const Image &dstImage,
+ VkImageLayout dstImageLayout,
+ uint32_t regionCount,
+ const VkBufferImageCopy *regions)
+{
+ ASSERT(regionCount == 1);
+ CopyBufferToImageParams *paramStruct =
+ initCommand<CopyBufferToImageParams>(CommandID::CopyBufferToImage);
+ paramStruct->srcBuffer = srcBuffer;
+ paramStruct->dstImage = dstImage.getHandle();
+ paramStruct->dstImageLayout = dstImageLayout;
+ paramStruct->region = regions[0];
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::copyImage(const Image &srcImage,
+ VkImageLayout srcImageLayout,
+ const Image &dstImage,
+ VkImageLayout dstImageLayout,
+ uint32_t regionCount,
+ const VkImageCopy *regions)
+{
+ ASSERT(regionCount == 1);
+ CopyImageParams *paramStruct = initCommand<CopyImageParams>(CommandID::CopyImage);
+ paramStruct->srcImage = srcImage.getHandle();
+ paramStruct->srcImageLayout = srcImageLayout;
+ paramStruct->dstImage = dstImage.getHandle();
+ paramStruct->dstImageLayout = dstImageLayout;
+ paramStruct->region = regions[0];
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::copyImageToBuffer(const Image &srcImage,
+ VkImageLayout srcImageLayout,
+ VkBuffer dstBuffer,
+ uint32_t regionCount,
+ const VkBufferImageCopy *regions)
+{
+ ASSERT(regionCount == 1);
+ CopyImageToBufferParams *paramStruct =
+ initCommand<CopyImageToBufferParams>(CommandID::CopyImageToBuffer);
+ paramStruct->srcImage = srcImage.getHandle();
+ paramStruct->srcImageLayout = srcImageLayout;
+ paramStruct->dstBuffer = dstBuffer;
+ paramStruct->region = regions[0];
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::dispatch(uint32_t groupCountX,
+ uint32_t groupCountY,
+ uint32_t groupCountZ)
+{
+ DispatchParams *paramStruct = initCommand<DispatchParams>(CommandID::Dispatch);
+ paramStruct->groupCountX = groupCountX;
+ paramStruct->groupCountY = groupCountY;
+ paramStruct->groupCountZ = groupCountZ;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::draw(uint32_t vertexCount, uint32_t firstVertex)
+{
+ DrawParams *paramStruct = initCommand<DrawParams>(CommandID::Draw);
+ paramStruct->vertexCount = vertexCount;
+ paramStruct->firstVertex = firstVertex;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::drawIndexed(uint32_t indexCount)
+{
+ DrawIndexedParams *paramStruct = initCommand<DrawIndexedParams>(CommandID::DrawIndexed);
+ paramStruct->indexCount = indexCount;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::drawIndexedInstanced(uint32_t indexCount,
+ uint32_t instanceCount)
+{
+ DrawIndexedInstancedParams *paramStruct =
+ initCommand<DrawIndexedInstancedParams>(CommandID::DrawIndexedInstanced);
+ paramStruct->indexCount = indexCount;
+ paramStruct->instanceCount = instanceCount;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::drawInstanced(uint32_t vertexCount,
+ uint32_t instanceCount,
+ uint32_t firstVertex)
+{
+ DrawInstancedParams *paramStruct = initCommand<DrawInstancedParams>(CommandID::DrawInstanced);
+ paramStruct->vertexCount = vertexCount;
+ paramStruct->instanceCount = instanceCount;
+ paramStruct->firstVertex = firstVertex;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::endQuery(VkQueryPool queryPool, uint32_t query)
+{
+ EndQueryParams *paramStruct = initCommand<EndQueryParams>(CommandID::EndQuery);
+ paramStruct->queryPool = queryPool;
+ paramStruct->query = query;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::imageBarrier(
+ VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkImageMemoryBarrier *imageMemoryBarrier)
+{
+ ImageBarrierParams *paramStruct = initCommand<ImageBarrierParams>(CommandID::ImageBarrier);
+ paramStruct->srcStageMask = srcStageMask;
+ paramStruct->dstStageMask = dstStageMask;
+ paramStruct->imageMemoryBarrier = *imageMemoryBarrier;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::memoryBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkMemoryBarrier *memoryBarrier)
+{
+ MemoryBarrierParams *paramStruct = initCommand<MemoryBarrierParams>(CommandID::MemoryBarrier);
+ paramStruct->srcStageMask = srcStageMask;
+ paramStruct->dstStageMask = dstStageMask;
+ paramStruct->memoryBarrier = *memoryBarrier;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::pipelineBarrier(
+ VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ VkDependencyFlags dependencyFlags,
+ uint32_t memoryBarrierCount,
+ const VkMemoryBarrier *memoryBarriers,
+ uint32_t bufferMemoryBarrierCount,
+ const VkBufferMemoryBarrier *bufferMemoryBarriers,
+ uint32_t imageMemoryBarrierCount,
+ const VkImageMemoryBarrier *imageMemoryBarriers)
+{
+ uint8_t *writePtr;
+ size_t memBarrierSize = memoryBarrierCount * sizeof(VkMemoryBarrier);
+ size_t buffBarrierSize = bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier);
+ size_t imgBarrierSize = imageMemoryBarrierCount * sizeof(VkImageMemoryBarrier);
+ PipelineBarrierParams *paramStruct = initCommand<PipelineBarrierParams>(
+ CommandID::PipelineBarrier, memBarrierSize + buffBarrierSize + imgBarrierSize, &writePtr);
+ paramStruct->srcStageMask = srcStageMask;
+ paramStruct->dstStageMask = dstStageMask;
+ paramStruct->dependencyFlags = dependencyFlags;
+ paramStruct->memoryBarrierCount = memoryBarrierCount;
+ paramStruct->bufferMemoryBarrierCount = bufferMemoryBarrierCount;
+ paramStruct->imageMemoryBarrierCount = imageMemoryBarrierCount;
+ // Copy variable sized data
+ writePtr = storePointerParameter(writePtr, memoryBarriers, memBarrierSize);
+ writePtr = storePointerParameter(writePtr, bufferMemoryBarriers, buffBarrierSize);
+ storePointerParameter(writePtr, imageMemoryBarriers, imgBarrierSize);
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::pushConstants(const PipelineLayout &layout,
+ VkShaderStageFlags flag,
+ uint32_t offset,
+ uint32_t size,
+ const void *data)
+{
+ ASSERT(size == static_cast<size_t>(size));
+ uint8_t *writePtr;
+ PushConstantsParams *paramStruct = initCommand<PushConstantsParams>(
+ CommandID::PushConstants, static_cast<size_t>(size), &writePtr);
+ paramStruct->layout = layout.getHandle();
+ paramStruct->flag = flag;
+ paramStruct->offset = offset;
+ paramStruct->size = size;
+ // Copy variable sized data
+ storePointerParameter(writePtr, data, static_cast<size_t>(size));
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::resetEvent(VkEvent event, VkPipelineStageFlags stageMask)
+{
+ ResetEventParams *paramStruct = initCommand<ResetEventParams>(CommandID::ResetEvent);
+ paramStruct->event = event;
+ paramStruct->stageMask = stageMask;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::resetQueryPool(VkQueryPool queryPool,
+ uint32_t firstQuery,
+ uint32_t queryCount)
+{
+ ResetQueryPoolParams *paramStruct =
+ initCommand<ResetQueryPoolParams>(CommandID::ResetQueryPool);
+ paramStruct->queryPool = queryPool;
+ paramStruct->firstQuery = firstQuery;
+ paramStruct->queryCount = queryCount;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::setEvent(VkEvent event, VkPipelineStageFlags stageMask)
+{
+ SetEventParams *paramStruct = initCommand<SetEventParams>(CommandID::SetEvent);
+ paramStruct->event = event;
+ paramStruct->stageMask = stageMask;
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::waitEvents(
+ uint32_t eventCount,
+ const VkEvent *events,
+ VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ uint32_t memoryBarrierCount,
+ const VkMemoryBarrier *memoryBarriers,
+ uint32_t bufferMemoryBarrierCount,
+ const VkBufferMemoryBarrier *bufferMemoryBarriers,
+ uint32_t imageMemoryBarrierCount,
+ const VkImageMemoryBarrier *imageMemoryBarriers)
+{
+ uint8_t *writePtr;
+ size_t eventSize = eventCount * sizeof(VkEvent);
+ size_t memBarrierSize = memoryBarrierCount * sizeof(VkMemoryBarrier);
+ size_t buffBarrierSize = bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier);
+ size_t imgBarrierSize = imageMemoryBarrierCount * sizeof(VkImageMemoryBarrier);
+ WaitEventsParams *paramStruct = initCommand<WaitEventsParams>(
+ CommandID::WaitEvents, eventSize + memBarrierSize + buffBarrierSize + imgBarrierSize,
+ &writePtr);
+ paramStruct->eventCount = eventCount;
+ paramStruct->srcStageMask = srcStageMask;
+ paramStruct->dstStageMask = dstStageMask;
+ paramStruct->memoryBarrierCount = memoryBarrierCount;
+ paramStruct->bufferMemoryBarrierCount = bufferMemoryBarrierCount;
+ paramStruct->imageMemoryBarrierCount = imageMemoryBarrierCount;
+ // Copy variable sized data
+ writePtr = storePointerParameter(writePtr, events, eventSize);
+ writePtr = storePointerParameter(writePtr, memoryBarriers, memBarrierSize);
+ writePtr = storePointerParameter(writePtr, bufferMemoryBarriers, buffBarrierSize);
+ storePointerParameter(writePtr, imageMemoryBarriers, imgBarrierSize);
+}
+
+ANGLE_INLINE void SecondaryCommandBuffer::writeTimestamp(VkPipelineStageFlagBits pipelineStage,
+ VkQueryPool queryPool,
+ uint32_t query)
+{
+ WriteTimestampParams *paramStruct =
+ initCommand<WriteTimestampParams>(CommandID::WriteTimestamp);
+ paramStruct->pipelineStage = pipelineStage;
+ paramStruct->queryPool = queryPool;
+ paramStruct->query = query;
+}
+} // namespace priv
} // namespace vk
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.cpp
index 31ab8fe8e39..479571ce7bd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.cpp
@@ -21,12 +21,10 @@ ShaderVk::ShaderVk(const gl::ShaderState &data) : ShaderImpl(data) {}
ShaderVk::~ShaderVk() {}
-ShCompileOptions ShaderVk::prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string *sourcePath)
+std::shared_ptr<WaitableCompileEvent> ShaderVk::compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options)
{
- *sourceStream << mData.getSource();
-
ShCompileOptions compileOptions = SH_INITIALIZE_UNINITIALIZED_LOCALS;
ContextVk *contextVk = vk::GetImpl(context);
@@ -36,13 +34,7 @@ ShCompileOptions ShaderVk::prepareSourceAndReturnOptions(const gl::Context *cont
compileOptions |= SH_CLAMP_POINT_SIZE;
}
- return compileOptions;
-}
-
-bool ShaderVk::postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog)
-{
- // No work to do here.
- return true;
+ return compileImpl(context, compilerInstance, mData.getSource(), compileOptions | options);
}
std::string ShaderVk::getDebugInfo() const
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.h
index 599017716af..d489143d24e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/ShaderVk.h
@@ -21,12 +21,9 @@ class ShaderVk : public ShaderImpl
ShaderVk(const gl::ShaderState &data);
~ShaderVk() override;
- // Returns additional sh::Compile options.
- ShCompileOptions prepareSourceAndReturnOptions(const gl::Context *context,
- std::stringstream *sourceStream,
- std::string *sourcePath) override;
- // Returns success for compiling on the driver. Returns success.
- bool postTranslateCompile(gl::ShCompilerInstance *compiler, std::string *infoLog) override;
+ std::shared_ptr<WaitableCompileEvent> compile(const gl::Context *context,
+ gl::ShCompilerInstance *compilerInstance,
+ ShCompileOptions options) override;
std::string getDebugInfo() const override;
};
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index 682208b8915..81249a3d1c5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -92,7 +92,7 @@ angle::Result OffscreenSurfaceVk::AttachmentImage::initialize(DisplayVk *display
{
RendererVk *renderer = displayVk->getRenderer();
- const angle::Format &textureFormat = vkFormat.textureFormat();
+ const angle::Format &textureFormat = vkFormat.imageFormat();
bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
const VkImageUsageFlags usage = isDepthOrStencilFormat ? kSurfaceVKDepthStencilImageUsageFlags
: kSurfaceVKColorImageUsageFlags;
@@ -109,6 +109,9 @@ angle::Result OffscreenSurfaceVk::AttachmentImage::initialize(DisplayVk *display
ANGLE_TRY(image.initImageView(displayVk, gl::TextureType::_2D, aspect, gl::SwizzleState(),
&imageView, 0, 1));
+ // Clear the image if it has emulated channels.
+ ANGLE_TRY(image.clearIfEmulatedFormat(displayVk, gl::ImageIndex::Make2D(0), vkFormat));
+
return angle::Result::Continue;
}
@@ -256,7 +259,21 @@ angle::Result OffscreenSurfaceVk::getAttachmentRenderTarget(
angle::Result OffscreenSurfaceVk::initializeContents(const gl::Context *context,
const gl::ImageIndex &imageIndex)
{
- UNIMPLEMENTED();
+ ContextVk *contextVk = vk::GetImpl(context);
+
+ if (mColorAttachment.image.valid())
+ {
+ mColorAttachment.image.stageSubresourceRobustClear(
+ imageIndex, mColorAttachment.image.getFormat().angleFormat());
+ ANGLE_TRY(mColorAttachment.image.flushAllStagedUpdates(contextVk));
+ }
+
+ if (mDepthStencilAttachment.image.valid())
+ {
+ mDepthStencilAttachment.image.stageSubresourceRobustClear(
+ imageIndex, mDepthStencilAttachment.image.getFormat().angleFormat());
+ ANGLE_TRY(mDepthStencilAttachment.image.flushAllStagedUpdates(contextVk));
+ }
return angle::Result::Continue;
}
@@ -274,6 +291,37 @@ WindowSurfaceVk::SwapchainImage::SwapchainImage(SwapchainImage &&other)
framebuffer(std::move(other.framebuffer))
{}
+WindowSurfaceVk::SwapHistory::SwapHistory() = default;
+WindowSurfaceVk::SwapHistory::SwapHistory(SwapHistory &&other)
+{
+ *this = std::move(other);
+}
+
+WindowSurfaceVk::SwapHistory &WindowSurfaceVk::SwapHistory::operator=(SwapHistory &&other)
+{
+ std::swap(serial, other.serial);
+ std::swap(semaphores, other.semaphores);
+ std::swap(swapchain, other.swapchain);
+ return *this;
+}
+
+WindowSurfaceVk::SwapHistory::~SwapHistory() = default;
+
+void WindowSurfaceVk::SwapHistory::destroy(VkDevice device)
+{
+ if (swapchain != VK_NULL_HANDLE)
+ {
+ vkDestroySwapchainKHR(device, swapchain, nullptr);
+ swapchain = VK_NULL_HANDLE;
+ }
+
+ for (vk::Semaphore &semaphore : semaphores)
+ {
+ semaphore.destroy(device);
+ }
+ semaphores.clear();
+}
+
WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
EGLNativeWindowType window,
EGLint width,
@@ -312,17 +360,13 @@ void WindowSurfaceVk::destroy(const egl::Display *display)
// we delete the window surface.
(void)present(displayVk, nullptr, 0, swapchainOutOfDate);
// We might not need to flush the pipe here.
- (void)renderer->finish(displayVk);
+ (void)renderer->finish(displayVk, nullptr, nullptr);
releaseSwapchainImages(renderer);
for (SwapHistory &swap : mSwapHistory)
{
- if (swap.swapchain != VK_NULL_HANDLE)
- {
- vkDestroySwapchainKHR(device, swap.swapchain, nullptr);
- swap.swapchain = VK_NULL_HANDLE;
- }
+ swap.destroy(device);
}
if (mSwapchain)
@@ -336,6 +380,12 @@ void WindowSurfaceVk::destroy(const egl::Display *display)
vkDestroySurfaceKHR(instance, mSurface, nullptr);
mSurface = VK_NULL_HANDLE;
}
+
+ for (vk::Semaphore &flushSemaphore : mFlushSemaphoreChain)
+ {
+ flushSemaphore.destroy(device);
+ }
+ mFlushSemaphoreChain.clear();
}
egl::Error WindowSurfaceVk::initialize(const egl::Display *display)
@@ -414,7 +464,7 @@ angle::Result WindowSurfaceVk::initializeImpl(DisplayVk *displayVk)
surfaceFormats.data()));
const vk::Format &format = renderer->getFormat(mState.config->renderTargetFormat);
- VkFormat nativeFormat = format.vkTextureFormat;
+ VkFormat nativeFormat = format.vkImageFormat;
if (surfaceFormatCount == 1u && surfaceFormats[0].format == VK_FORMAT_UNDEFINED)
{
@@ -466,31 +516,13 @@ angle::Result WindowSurfaceVk::recreateSwapchain(DisplayVk *displayVk,
// have finished. We therefore store the handle to the swapchain being destroyed in the
// swap history (alongside the serial of the last submission) so it can be destroyed once we
// wait on that serial as part of the CPU throttling.
- //
- // TODO(syoussefi): the spec specifically allows multiple retired swapchains to exist:
- //
- // > Multiple retired swapchains can be associated with the same VkSurfaceKHR through
- // > multiple uses of oldSwapchain that outnumber calls to vkDestroySwapchainKHR.
- //
- // However, a bug in the validation layers currently forces us to limit this to one retired
- // swapchain. Once the issue is resolved, the following for loop can be removed.
- // http://anglebug.com/3095
- for (SwapHistory &swap : mSwapHistory)
- {
- if (swap.swapchain != VK_NULL_HANDLE)
- {
- ANGLE_TRY(renderer->finishToSerial(displayVk, swap.serial));
- vkDestroySwapchainKHR(renderer->getDevice(), swap.swapchain, nullptr);
- swap.swapchain = VK_NULL_HANDLE;
- }
- }
mSwapHistory[swapHistoryIndex].swapchain = oldSwapchain;
}
releaseSwapchainImages(renderer);
const vk::Format &format = renderer->getFormat(mState.config->renderTargetFormat);
- VkFormat nativeFormat = format.vkTextureFormat;
+ VkFormat nativeFormat = format.vkImageFormat;
// We need transfer src for reading back from the backbuffer.
constexpr VkImageUsageFlags kImageUsageFlags = kSurfaceVKColorImageUsageFlags;
@@ -503,18 +535,18 @@ angle::Result WindowSurfaceVk::recreateSwapchain(DisplayVk *displayVk,
swapchainInfo.imageFormat = nativeFormat;
swapchainInfo.imageColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR;
// Note: Vulkan doesn't allow 0-width/height swapchains.
- swapchainInfo.imageExtent.width = std::max(extents.width, 1);
- swapchainInfo.imageExtent.height = std::max(extents.height, 1);
- swapchainInfo.imageArrayLayers = 1;
- swapchainInfo.imageUsage = kImageUsageFlags;
- swapchainInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
- swapchainInfo.queueFamilyIndexCount = 0;
- swapchainInfo.pQueueFamilyIndices = nullptr;
- swapchainInfo.preTransform = mPreTransform;
- swapchainInfo.compositeAlpha = mCompositeAlpha;
- swapchainInfo.presentMode = mDesiredSwapchainPresentMode;
- swapchainInfo.clipped = VK_TRUE;
- swapchainInfo.oldSwapchain = oldSwapchain;
+ swapchainInfo.imageExtent.width = std::max(extents.width, 1);
+ swapchainInfo.imageExtent.height = std::max(extents.height, 1);
+ swapchainInfo.imageArrayLayers = 1;
+ swapchainInfo.imageUsage = kImageUsageFlags;
+ swapchainInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ swapchainInfo.queueFamilyIndexCount = 0;
+ swapchainInfo.pQueueFamilyIndices = nullptr;
+ swapchainInfo.preTransform = mPreTransform;
+ swapchainInfo.compositeAlpha = mCompositeAlpha;
+ swapchainInfo.presentMode = mDesiredSwapchainPresentMode;
+ swapchainInfo.clipped = VK_TRUE;
+ swapchainInfo.oldSwapchain = oldSwapchain;
// TODO(syoussefi): Once EGL_SWAP_BEHAVIOR_PRESERVED_BIT is supported, the contents of the old
// swapchain need to carry over to the new one. http://anglebug.com/2942
@@ -529,14 +561,7 @@ angle::Result WindowSurfaceVk::recreateSwapchain(DisplayVk *displayVk,
ANGLE_VK_TRY(displayVk,
vkGetSwapchainImagesKHR(device, mSwapchain, &imageCount, swapchainImages.data()));
- VkClearColorValue transparentBlack = {};
- transparentBlack.float32[0] = 0.0f;
- transparentBlack.float32[1] = 0.0f;
- transparentBlack.float32[2] = 0.0f;
- transparentBlack.float32[3] = 0.0f;
-
mSwapchainImages.resize(imageCount);
- ANGLE_TRY(resizeSwapHistory(displayVk, imageCount));
for (uint32_t imageIndex = 0; imageIndex < imageCount; ++imageIndex)
{
@@ -547,12 +572,8 @@ angle::Result WindowSurfaceVk::recreateSwapchain(DisplayVk *displayVk,
VK_IMAGE_ASPECT_COLOR_BIT, gl::SwizzleState(),
&member.imageView, 0, 1));
- // Allocate a command buffer for clearing our images to black.
- vk::CommandBuffer *commandBuffer = nullptr;
- ANGLE_TRY(member.image.recordCommands(displayVk, &commandBuffer));
-
- // Set transfer dest layout, and clear the image to black.
- member.image.clearColor(transparentBlack, 0, 1, commandBuffer);
+ // Clear the image if it has emulated channels.
+ ANGLE_TRY(member.image.clearIfEmulatedFormat(displayVk, gl::ImageIndex::Make2D(0), format));
}
// Initialize depth/stencil if requested.
@@ -567,19 +588,16 @@ angle::Result WindowSurfaceVk::recreateSwapchain(DisplayVk *displayVk,
ANGLE_TRY(mDepthStencilImage.initMemory(displayVk, renderer->getMemoryProperties(),
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
- const VkImageAspectFlags aspect = vk::GetDepthStencilAspectFlags(dsFormat.textureFormat());
- VkClearDepthStencilValue depthStencilClearValue = {1.0f, 0};
-
- // Clear the image.
- vk::CommandBuffer *commandBuffer = nullptr;
- ANGLE_TRY(mDepthStencilImage.recordCommands(displayVk, &commandBuffer));
- mDepthStencilImage.clearDepthStencil(aspect, aspect, depthStencilClearValue, commandBuffer);
-
+ const VkImageAspectFlags aspect = vk::GetDepthStencilAspectFlags(dsFormat.imageFormat());
ANGLE_TRY(mDepthStencilImage.initImageView(displayVk, gl::TextureType::_2D, aspect,
gl::SwizzleState(), &mDepthStencilImageView, 0,
1));
// We will need to pass depth/stencil image views to the RenderTargetVk in the future.
+
+ // Clear the image if it has emulated channels.
+ ANGLE_TRY(mDepthStencilImage.clearIfEmulatedFormat(displayVk, gl::ImageIndex::Make2D(0),
+ dsFormat));
}
return angle::Result::Continue;
@@ -673,14 +691,14 @@ egl::Error WindowSurfaceVk::swapWithDamage(const gl::Context *context,
EGLint *rects,
EGLint n_rects)
{
- DisplayVk *displayVk = vk::GetImpl(context->getCurrentDisplay());
+ DisplayVk *displayVk = vk::GetImpl(context->getDisplay());
angle::Result result = swapImpl(displayVk, rects, n_rects);
return angle::ToEGL(result, displayVk, EGL_BAD_SURFACE);
}
egl::Error WindowSurfaceVk::swap(const gl::Context *context)
{
- DisplayVk *displayVk = vk::GetImpl(context->getCurrentDisplay());
+ DisplayVk *displayVk = vk::GetImpl(context->getDisplay());
angle::Result result = swapImpl(displayVk, nullptr, 0);
return angle::ToEGL(result, displayVk, EGL_BAD_SURFACE);
}
@@ -693,15 +711,11 @@ angle::Result WindowSurfaceVk::present(DisplayVk *displayVk,
RendererVk *renderer = displayVk->getRenderer();
// Throttle the submissions to avoid getting too far ahead of the GPU.
+ SwapHistory &swap = mSwapHistory[mCurrentSwapHistoryIndex];
{
TRACE_EVENT0("gpu.angle", "WindowSurfaceVk::present: Throttle CPU");
- SwapHistory &swap = mSwapHistory[mCurrentSwapHistoryIndex];
ANGLE_TRY(renderer->finishToSerial(displayVk, swap.serial));
- if (swap.swapchain != VK_NULL_HANDLE)
- {
- vkDestroySwapchainKHR(renderer->getDevice(), swap.swapchain, nullptr);
- swap.swapchain = VK_NULL_HANDLE;
- }
+ swap.destroy(renderer->getDevice());
}
SwapchainImage &image = mSwapchainImages[mCurrentSwapchainImageIndex];
@@ -711,45 +725,51 @@ angle::Result WindowSurfaceVk::present(DisplayVk *displayVk,
image.image.changeLayout(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::Present, swapCommands);
- ANGLE_TRY(renderer->flush(displayVk));
+ const vk::Semaphore *waitSemaphore = nullptr;
+ const vk::Semaphore *signalSemaphore = nullptr;
+ if (!renderer->getCommandGraph()->empty())
+ {
+ ANGLE_TRY(generateSemaphoresForFlush(displayVk, &waitSemaphore, &signalSemaphore));
+ }
- // Remember the serial of the last submission.
- mSwapHistory[mCurrentSwapHistoryIndex].serial = renderer->getLastSubmittedQueueSerial();
- ++mCurrentSwapHistoryIndex;
- mCurrentSwapHistoryIndex =
- mCurrentSwapHistoryIndex == mSwapHistory.size() ? 0 : mCurrentSwapHistoryIndex;
+ ANGLE_TRY(renderer->flush(displayVk, waitSemaphore, signalSemaphore));
- // Ask the renderer what semaphore it signaled in the last flush.
- const vk::Semaphore *commandsCompleteSemaphore =
- renderer->getSubmitLastSignaledSemaphore(displayVk);
+ // The semaphore chain must at least have the semaphore returned by vkAquireImage in it. It will
+ // likely have more based on how much work was flushed this frame.
+ ASSERT(!mFlushSemaphoreChain.empty());
VkPresentInfoKHR presentInfo = {};
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
- presentInfo.waitSemaphoreCount = commandsCompleteSemaphore ? 1 : 0;
- presentInfo.pWaitSemaphores =
- commandsCompleteSemaphore ? commandsCompleteSemaphore->ptr() : nullptr;
- presentInfo.swapchainCount = 1;
- presentInfo.pSwapchains = &mSwapchain;
- presentInfo.pImageIndices = &mCurrentSwapchainImageIndex;
- presentInfo.pResults = nullptr;
+ presentInfo.waitSemaphoreCount = 1;
+ presentInfo.pWaitSemaphores = mFlushSemaphoreChain.back().ptr();
+ presentInfo.swapchainCount = 1;
+ presentInfo.pSwapchains = &mSwapchain;
+ presentInfo.pImageIndices = &mCurrentSwapchainImageIndex;
+ presentInfo.pResults = nullptr;
VkPresentRegionKHR presentRegion = {};
VkPresentRegionsKHR presentRegions = {};
- std::vector<VkRectLayerKHR> vk_rects;
+ std::vector<VkRectLayerKHR> vkRects;
if (renderer->getFeatures().supportsIncrementalPresent && (n_rects > 0))
{
- EGLint *egl_rects = rects;
+ EGLint width = getWidth();
+ EGLint height = getHeight();
+
+ EGLint *eglRects = rects;
presentRegion.rectangleCount = n_rects;
- vk_rects.resize(n_rects);
- for (EGLint rect = 0; rect < n_rects; rect++)
+ vkRects.resize(n_rects);
+ for (EGLint i = 0; i < n_rects; i++)
{
- vk_rects[rect].offset.x = *egl_rects++;
- vk_rects[rect].offset.y = *egl_rects++;
- vk_rects[rect].extent.width = *egl_rects++;
- vk_rects[rect].extent.height = *egl_rects++;
- vk_rects[rect].layer = 0;
+ VkRectLayerKHR &rect = vkRects[i];
+
+ // Make sure the damage rects are within swapchain bounds.
+ rect.offset.x = gl::clamp(*eglRects++, 0, width);
+ rect.offset.y = gl::clamp(*eglRects++, 0, height);
+ rect.extent.width = gl::clamp(*eglRects++, 0, width - rect.offset.x);
+ rect.extent.height = gl::clamp(*eglRects++, 0, height - rect.offset.y);
+ rect.layer = 0;
}
- presentRegion.pRectangles = vk_rects.data();
+ presentRegion.pRectangles = vkRects.data();
presentRegions.sType = VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR;
presentRegions.pNext = nullptr;
@@ -759,6 +779,13 @@ angle::Result WindowSurfaceVk::present(DisplayVk *displayVk,
presentInfo.pNext = &presentRegions;
}
+ // Update the swap history for this presentation
+ swap.serial = renderer->getLastSubmittedQueueSerial();
+ swap.semaphores = std::move(mFlushSemaphoreChain);
+ ++mCurrentSwapHistoryIndex;
+ mCurrentSwapHistoryIndex =
+ mCurrentSwapHistoryIndex == mSwapHistory.size() ? 0 : mCurrentSwapHistoryIndex;
+
VkResult result = vkQueuePresentKHR(renderer->getQueue(), &presentInfo);
// If SUBOPTIMAL/OUT_OF_DATE is returned, it's ok, we just need to recreate the swapchain before
@@ -798,15 +825,19 @@ angle::Result WindowSurfaceVk::swapImpl(DisplayVk *displayVk, EGLint *rects, EGL
angle::Result WindowSurfaceVk::nextSwapchainImage(DisplayVk *displayVk)
{
- VkDevice device = displayVk->getDevice();
- RendererVk *renderer = displayVk->getRenderer();
+ VkDevice device = displayVk->getDevice();
- const vk::Semaphore *acquireNextImageSemaphore = nullptr;
- ANGLE_TRY(renderer->allocateSubmitWaitSemaphore(displayVk, &acquireNextImageSemaphore));
+ vk::Semaphore aquireImageSemaphore;
+ ANGLE_VK_TRY(displayVk, aquireImageSemaphore.init(device));
ANGLE_VK_TRY(displayVk, vkAcquireNextImageKHR(device, mSwapchain, UINT64_MAX,
- acquireNextImageSemaphore->getHandle(),
- VK_NULL_HANDLE, &mCurrentSwapchainImageIndex));
+ aquireImageSemaphore.getHandle(), VK_NULL_HANDLE,
+ &mCurrentSwapchainImageIndex));
+
+ // After presenting, the flush semaphore chain is cleared. The semaphore returned by
+ // vkAcquireNextImage will start a new chain.
+ ASSERT(mFlushSemaphoreChain.empty());
+ mFlushSemaphoreChain.push_back(std::move(aquireImageSemaphore));
SwapchainImage &image = mSwapchainImages[mCurrentSwapchainImageIndex];
@@ -816,82 +847,6 @@ angle::Result WindowSurfaceVk::nextSwapchainImage(DisplayVk *displayVk)
return angle::Result::Continue;
}
-angle::Result WindowSurfaceVk::resizeSwapHistory(DisplayVk *displayVk, size_t imageCount)
-{
- // The number of swapchain images can change if the present mode is changed. If that number is
- // increased, we need to rearrange the history (which is a circular buffer) so it remains
- // continuous. If it shrinks, we have to additionally make sure we clean up any old swapchains
- // that can no longer fit in the history.
- //
- // Assume the following history buffer identified with serials:
- //
- // mCurrentSwapHistoryIndex
- // V
- // +----+----+----+
- // | 11 | 9 | 10 |
- // +----+----+----+
- //
- // When shrinking to size 2, we want to clean up 9, and rearrange to the following:
- //
- // mCurrentSwapHistoryIndex
- // V
- // +----+----+
- // | 10 | 11 |
- // +----+----+
- //
- // When expanding back to 3, we want to rearrange to the following:
- //
- // mCurrentSwapHistoryIndex
- // V
- // +----+----+----+
- // | 0 | 10 | 11 |
- // +----+----+----+
-
- if (mSwapHistory.size() == imageCount)
- {
- return angle::Result::Continue;
- }
-
- RendererVk *renderer = displayVk->getRenderer();
-
- // First, clean up anything that won't fit in the resized history.
- if (imageCount < mSwapHistory.size())
- {
- size_t toClean = mSwapHistory.size() - imageCount;
- for (size_t i = 0; i < toClean; ++i)
- {
- size_t historyIndex = (mCurrentSwapHistoryIndex + i) % mSwapHistory.size();
- SwapHistory &swap = mSwapHistory[historyIndex];
-
- ANGLE_TRY(renderer->finishToSerial(displayVk, swap.serial));
- if (swap.swapchain != VK_NULL_HANDLE)
- {
- vkDestroySwapchainKHR(renderer->getDevice(), swap.swapchain, nullptr);
- swap.swapchain = VK_NULL_HANDLE;
- }
- }
- }
-
- // Now, move the history, from most recent to oldest (as much as fits), into a new vector.
- std::vector<SwapHistory> resizedHistory(imageCount);
-
- size_t toCopy = std::min(imageCount, mSwapHistory.size());
- for (size_t i = 0; i < toCopy; ++i)
- {
- size_t historyIndex =
- (mCurrentSwapHistoryIndex + mSwapHistory.size() - i - 1) % mSwapHistory.size();
- size_t resizedHistoryIndex = imageCount - i - 1;
- resizedHistory[resizedHistoryIndex] = mSwapHistory[historyIndex];
- }
-
- // Set this as the new history. Note that after rearranging in either case, the oldest history
- // is at index 0.
- mSwapHistory = std::move(resizedHistory);
- mCurrentSwapHistoryIndex = 0;
-
- return angle::Result::Continue;
-}
-
egl::Error WindowSurfaceVk::postSubBuffer(const gl::Context *context,
EGLint x,
EGLint y,
@@ -970,12 +925,12 @@ void WindowSurfaceVk::setSwapInterval(EGLint interval)
EGLint WindowSurfaceVk::getWidth() const
{
- return static_cast<EGLint>(mColorRenderTarget.getImageExtents().width);
+ return static_cast<EGLint>(mColorRenderTarget.getExtents().width);
}
EGLint WindowSurfaceVk::getHeight() const
{
- return static_cast<EGLint>(mColorRenderTarget.getImageExtents().height);
+ return static_cast<EGLint>(mColorRenderTarget.getExtents().height);
}
EGLint WindowSurfaceVk::isPostSubBufferSupported() const
@@ -1023,7 +978,7 @@ angle::Result WindowSurfaceVk::getCurrentFramebuffer(vk::Context *context,
VkFramebufferCreateInfo framebufferInfo = {};
- const gl::Extents &extents = mColorRenderTarget.getImageExtents();
+ const gl::Extents extents = mColorRenderTarget.getExtents();
std::array<VkImageView, 2> imageViews = {{VK_NULL_HANDLE, mDepthStencilImageView.getHandle()}};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
@@ -1047,10 +1002,44 @@ angle::Result WindowSurfaceVk::getCurrentFramebuffer(vk::Context *context,
return angle::Result::Continue;
}
+angle::Result WindowSurfaceVk::generateSemaphoresForFlush(vk::Context *context,
+ const vk::Semaphore **outWaitSemaphore,
+ const vk::Semaphore **outSignalSempahore)
+{
+ // The flush semaphore chain should always start with a semaphore in it, created by the
+ // vkAquireImage call. This semaphore must be waited on before any rendering to the swap chain
+ // image can occur.
+ ASSERT(!mFlushSemaphoreChain.empty());
+
+ vk::Semaphore nextSemaphore;
+ ANGLE_VK_TRY(context, nextSemaphore.init(context->getDevice()));
+ mFlushSemaphoreChain.push_back(std::move(nextSemaphore));
+
+ *outWaitSemaphore = &mFlushSemaphoreChain[mFlushSemaphoreChain.size() - 2];
+ *outSignalSempahore = &mFlushSemaphoreChain[mFlushSemaphoreChain.size() - 1];
+
+ return angle::Result::Continue;
+}
+
angle::Result WindowSurfaceVk::initializeContents(const gl::Context *context,
const gl::ImageIndex &imageIndex)
{
- UNIMPLEMENTED();
+ ContextVk *contextVk = vk::GetImpl(context);
+
+ ASSERT(mSwapchainImages.size() > 0);
+ ASSERT(mCurrentSwapchainImageIndex < mSwapchainImages.size());
+
+ vk::ImageHelper *image = &mSwapchainImages[mCurrentSwapchainImageIndex].image;
+ image->stageSubresourceRobustClear(imageIndex, image->getFormat().angleFormat());
+ ANGLE_TRY(image->flushAllStagedUpdates(contextVk));
+
+ if (mDepthStencilImage.valid())
+ {
+ mDepthStencilImage.stageSubresourceRobustClear(
+ gl::ImageIndex::Make2D(0), mDepthStencilImage.getFormat().angleFormat());
+ ANGLE_TRY(mDepthStencilImage.flushAllStagedUpdates(contextVk));
+ }
+
return angle::Result::Continue;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h
index 6038b69a3f5..886e9024f4f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SurfaceVk.h
@@ -136,6 +136,10 @@ class WindowSurfaceVk : public SurfaceImpl
const vk::RenderPass &compatibleRenderPass,
vk::Framebuffer **framebufferOut);
+ angle::Result generateSemaphoresForFlush(vk::Context *context,
+ const vk::Semaphore **outWaitSemaphore,
+ const vk::Semaphore **outSignalSempahore);
+
protected:
EGLNativeWindowType mNativeWindowType;
VkSurfaceKHR mSurface;
@@ -159,7 +163,6 @@ class WindowSurfaceVk : public SurfaceImpl
EGLint n_rects,
bool &swapchainOutOfDate);
angle::Result swapImpl(DisplayVk *displayVk, EGLint *rects, EGLint n_rects);
- angle::Result resizeSwapHistory(DisplayVk *displayVk, size_t imageCount);
VkSurfaceCapabilitiesKHR mSurfaceCaps;
std::vector<VkPresentModeKHR> mPresentModes;
@@ -190,15 +193,42 @@ class WindowSurfaceVk : public SurfaceImpl
std::vector<SwapchainImage> mSwapchainImages;
- // A circular buffer, with the same size as mSwapchainImages (N), that stores the serial of the
- // renderer on every swap. The CPU is throttled by waiting for the Nth previous serial to
- // finish. Old swapchains are scheduled to be destroyed at the same time.
- struct SwapHistory
+ // Each time vkPresent is called, a wait semaphore is needed to know when the work to render the
+ // frame is done. For ANGLE to know when that is, it needs to add a signal semaphore to each
+ // flush. Conversely, before being able to use a swap chain image, ANGLE needs to wait on the
+ // semaphore returned by vkAcquireNextImage.
+ //
+ // We build a chain of semaphores starting with the semaphore returned by vkAcquireNextImageKHR
+ // and ending with the semaphore provided to vkPresent. Each time generateSemaphoresForFlush is
+ // called, a new semaphore is created and appended to mFlushSemaphoreChain. The second last
+ // semaphore is used as a wait semaphore and the last one is used as a signal semaphore for the
+ // flush.
+ //
+ // The semaphore chain is cleared after every call to present and a new one is started once
+ // vkAquireImage is called.
+ //
+ // We don't need a semaphore chain for offscreen surfaces or surfaceless rendering because the
+ // results cannot affect the images in a swap chain.
+ std::vector<vk::Semaphore> mFlushSemaphoreChain;
+
+ // A circular buffer that stores the serial of the renderer on every swap. The CPU is
+ // throttled by waiting for the 2nd previous serial to finish. Old swapchains are scheduled to
+ // be destroyed at the same time.
+ struct SwapHistory : angle::NonCopyable
{
+ SwapHistory();
+ SwapHistory(SwapHistory &&other);
+ SwapHistory &operator=(SwapHistory &&other);
+ ~SwapHistory();
+
+ void destroy(VkDevice device);
+
Serial serial;
+ std::vector<vk::Semaphore> semaphores;
VkSwapchainKHR swapchain = VK_NULL_HANDLE;
};
- std::vector<SwapHistory> mSwapHistory;
+ static constexpr size_t kSwapHistorySize = 2;
+ std::array<SwapHistory, kSwapHistorySize> mSwapHistory;
size_t mCurrentSwapHistoryIndex;
vk::ImageHelper mDepthStencilImage;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.cpp
index b248ffbcb6e..ae2b3cd1cef 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.cpp
@@ -31,11 +31,11 @@ void FenceSyncVk::onDestroy(RendererVk *renderer)
mFence.reset(renderer->getDevice());
}
-angle::Result FenceSyncVk::initialize(vk::Context *context)
+angle::Result FenceSyncVk::initialize(ContextVk *contextVk)
{
ASSERT(!mEvent.valid());
- RendererVk *renderer = context->getRenderer();
+ RendererVk *renderer = contextVk->getRenderer();
VkDevice device = renderer->getDevice();
VkEventCreateInfo eventCreateInfo = {};
@@ -43,9 +43,9 @@ angle::Result FenceSyncVk::initialize(vk::Context *context)
eventCreateInfo.flags = 0;
vk::Scoped<vk::Event> event(device);
- ANGLE_VK_TRY(context, event.get().init(device, eventCreateInfo));
+ ANGLE_VK_TRY(contextVk, event.get().init(device, eventCreateInfo));
- ANGLE_TRY(renderer->getSubmitFence(context, &mFence));
+ ANGLE_TRY(renderer->getSubmitFence(contextVk, &mFence));
mEvent = event.release();
@@ -54,6 +54,7 @@ angle::Result FenceSyncVk::initialize(vk::Context *context)
}
angle::Result FenceSyncVk::clientWait(vk::Context *context,
+ ContextVk *contextVk,
bool flushCommands,
uint64_t timeout,
VkResult *outResult)
@@ -76,9 +77,9 @@ angle::Result FenceSyncVk::clientWait(vk::Context *context,
return angle::Result::Continue;
}
- if (flushCommands)
+ if (flushCommands && contextVk)
{
- ANGLE_TRY(renderer->flush(context));
+ ANGLE_TRY(contextVk->flushImpl());
}
// Wait on the fence that's expected to be signaled on the first vkQueueSubmit after
@@ -95,7 +96,7 @@ angle::Result FenceSyncVk::clientWait(vk::Context *context,
return angle::Result::Continue;
}
-angle::Result FenceSyncVk::serverWait(vk::Context *context)
+angle::Result FenceSyncVk::serverWait(vk::Context *context, ContextVk *contextVk)
{
context->getRenderer()->getCommandGraph()->waitFenceSync(mEvent);
return angle::Result::Continue;
@@ -141,7 +142,8 @@ angle::Result SyncVk::clientWait(const gl::Context *context,
bool flush = (flags & GL_SYNC_FLUSH_COMMANDS_BIT) != 0;
VkResult result;
- ANGLE_TRY(mFenceSync.clientWait(contextVk, flush, static_cast<uint64_t>(timeout), &result));
+ ANGLE_TRY(mFenceSync.clientWait(contextVk, contextVk, flush, static_cast<uint64_t>(timeout),
+ &result));
switch (result)
{
@@ -169,7 +171,8 @@ angle::Result SyncVk::serverWait(const gl::Context *context, GLbitfield flags, G
ASSERT(flags == 0);
ASSERT(timeout == GL_TIMEOUT_IGNORED);
- return mFenceSync.serverWait(vk::GetImpl(context));
+ ContextVk *contextVk = vk::GetImpl(context);
+ return mFenceSync.serverWait(contextVk, contextVk);
}
angle::Result SyncVk::getStatus(const gl::Context *context, GLint *outResult)
@@ -193,11 +196,14 @@ void EGLSyncVk::onDestroy(const egl::Display *display)
mFenceSync.onDestroy(vk::GetImpl(display)->getRenderer());
}
-egl::Error EGLSyncVk::initialize(const egl::Display *display, EGLenum type)
+egl::Error EGLSyncVk::initialize(const egl::Display *display,
+ const gl::Context *context,
+ EGLenum type)
{
ASSERT(type == EGL_SYNC_FENCE_KHR);
+ ASSERT(context != nullptr);
- if (mFenceSync.initialize(vk::GetImpl(display)) == angle::Result::Stop)
+ if (mFenceSync.initialize(vk::GetImpl(context)) == angle::Result::Stop)
{
return egl::Error(EGL_BAD_ALLOC, "eglCreateSyncKHR failed to create sync object");
}
@@ -206,6 +212,7 @@ egl::Error EGLSyncVk::initialize(const egl::Display *display, EGLenum type)
}
egl::Error EGLSyncVk::clientWait(const egl::Display *display,
+ const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult)
@@ -215,8 +222,9 @@ egl::Error EGLSyncVk::clientWait(const egl::Display *display,
bool flush = (flags & EGL_SYNC_FLUSH_COMMANDS_BIT_KHR) != 0;
VkResult result;
- if (mFenceSync.clientWait(vk::GetImpl(display), flush, static_cast<uint64_t>(timeout),
- &result) == angle::Result::Stop)
+ ContextVk *contextVk = context ? vk::GetImpl(context) : nullptr;
+ if (mFenceSync.clientWait(vk::GetImpl(display), contextVk, flush,
+ static_cast<uint64_t>(timeout), &result) == angle::Result::Stop)
{
return egl::Error(EGL_BAD_ALLOC);
}
@@ -241,10 +249,13 @@ egl::Error EGLSyncVk::clientWait(const egl::Display *display,
}
}
-egl::Error EGLSyncVk::serverWait(const egl::Display *display, EGLint flags)
+egl::Error EGLSyncVk::serverWait(const egl::Display *display,
+ const gl::Context *context,
+ EGLint flags)
{
ASSERT(flags == 0);
- if (mFenceSync.serverWait(vk::GetImpl(display)) == angle::Result::Stop)
+ ContextVk *contextVk = context ? vk::GetImpl(context) : nullptr;
+ if (mFenceSync.serverWait(vk::GetImpl(display), contextVk) == angle::Result::Stop)
{
return egl::Error(EGL_BAD_ALLOC);
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.h
index 79ff9bd1b63..24f3e13763c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/SyncVk.h
@@ -32,12 +32,13 @@ class FenceSyncVk
void onDestroy(RendererVk *renderer);
- angle::Result initialize(vk::Context *context);
+ angle::Result initialize(ContextVk *contextVk);
angle::Result clientWait(vk::Context *context,
+ ContextVk *contextVk,
bool flushCommands,
uint64_t timeout,
VkResult *outResult);
- angle::Result serverWait(vk::Context *context);
+ angle::Result serverWait(vk::Context *context, ContextVk *contextVk);
angle::Result getStatus(vk::Context *context, bool *signaled);
private:
@@ -79,12 +80,17 @@ class EGLSyncVk final : public EGLSyncImpl
void onDestroy(const egl::Display *display) override;
- egl::Error initialize(const egl::Display *display, EGLenum type) override;
+ egl::Error initialize(const egl::Display *display,
+ const gl::Context *context,
+ EGLenum type) override;
egl::Error clientWait(const egl::Display *display,
+ const gl::Context *context,
EGLint flags,
EGLTime timeout,
EGLint *outResult) override;
- egl::Error serverWait(const egl::Display *display, EGLint flags) override;
+ egl::Error serverWait(const egl::Display *display,
+ const gl::Context *context,
+ EGLint flags) override;
egl::Error getStatus(const egl::Display *display, EGLint *outStatus) override;
private:
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp
index 329ce9df8fd..7e31a06aa7d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -14,10 +14,12 @@
#include "libANGLE/Config.h"
#include "libANGLE/Context.h"
#include "libANGLE/Image.h"
+#include "libANGLE/MemoryObject.h"
#include "libANGLE/Surface.h"
#include "libANGLE/renderer/vulkan/ContextVk.h"
#include "libANGLE/renderer/vulkan/FramebufferVk.h"
#include "libANGLE/renderer/vulkan/ImageVk.h"
+#include "libANGLE/renderer/vulkan/MemoryObjectVk.h"
#include "libANGLE/renderer/vulkan/RendererVk.h"
#include "libANGLE/renderer/vulkan/SurfaceVk.h"
#include "libANGLE/renderer/vulkan/vk_format_utils.h"
@@ -43,20 +45,20 @@ bool CanCopyWithTransfer(RendererVk *renderer,
// NOTE(syoussefi): technically, you can transfer between formats as long as they have the same
// size and are compatible, but for now, let's just support same-format copies with transfer.
return srcFormat.internalFormat == destFormat.internalFormat &&
- renderer->hasTextureFormatFeatureBits(srcFormat.vkTextureFormat,
- VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) &&
- renderer->hasTextureFormatFeatureBits(destFormat.vkTextureFormat,
- VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+ renderer->hasImageFormatFeatureBits(srcFormat.vkImageFormat,
+ VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) &&
+ renderer->hasImageFormatFeatureBits(destFormat.vkImageFormat,
+ VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
}
bool CanCopyWithDraw(RendererVk *renderer,
const vk::Format &srcFormat,
const vk::Format &destFormat)
{
- return renderer->hasTextureFormatFeatureBits(srcFormat.vkTextureFormat,
- VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) &&
- renderer->hasTextureFormatFeatureBits(destFormat.vkTextureFormat,
- VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
+ return renderer->hasImageFormatFeatureBits(srcFormat.vkImageFormat,
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) &&
+ renderer->hasImageFormatFeatureBits(destFormat.vkImageFormat,
+ VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
}
bool ForceCpuPathForCopy(RendererVk *renderer, vk::ImageHelper *image)
@@ -179,8 +181,12 @@ angle::Result TextureVk::setSubImage(const gl::Context *context,
const uint8_t *pixels)
{
const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format, type);
+ ContextVk *contextVk = vk::GetImpl(context);
+ const gl::ImageDesc &levelDesc = mState.getImageDesc(index);
+ const vk::Format &vkFormat =
+ contextVk->getRenderer()->getFormat(levelDesc.format.info->sizedInternalFormat);
- return setSubImageImpl(context, index, area, formatInfo, type, unpack, pixels);
+ return setSubImageImpl(context, index, area, formatInfo, type, unpack, pixels, vkFormat);
}
angle::Result TextureVk::setCompressedImage(const gl::Context *context,
@@ -206,8 +212,13 @@ angle::Result TextureVk::setCompressedSubImage(const gl::Context *context,
{
const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format, GL_UNSIGNED_BYTE);
+ ContextVk *contextVk = vk::GetImpl(context);
+ const gl::ImageDesc &levelDesc = mState.getImageDesc(index);
+ const vk::Format &vkFormat =
+ contextVk->getRenderer()->getFormat(levelDesc.format.info->sizedInternalFormat);
- return setSubImageImpl(context, index, area, formatInfo, GL_UNSIGNED_BYTE, unpack, pixels);
+ return setSubImageImpl(context, index, area, formatInfo, GL_UNSIGNED_BYTE, unpack, pixels,
+ vkFormat);
}
angle::Result TextureVk::setImageImpl(const gl::Context *context,
@@ -232,7 +243,7 @@ angle::Result TextureVk::setImageImpl(const gl::Context *context,
}
return setSubImageImpl(context, index, gl::Box(0, 0, 0, size.width, size.height, size.depth),
- formatInfo, type, unpack, pixels);
+ formatInfo, type, unpack, pixels, vkFormat);
}
angle::Result TextureVk::setSubImageImpl(const gl::Context *context,
@@ -241,7 +252,8 @@ angle::Result TextureVk::setSubImageImpl(const gl::Context *context,
const gl::InternalFormat &formatInfo,
GLenum type,
const gl::PixelUnpackState &unpack,
- const uint8_t *pixels)
+ const uint8_t *pixels,
+ const vk::Format &vkFormat)
{
ContextVk *contextVk = vk::GetImpl(context);
@@ -249,7 +261,7 @@ 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, type, pixels));
+ gl::Offset(area.x, area.y, area.z), formatInfo, unpack, type, pixels, vkFormat));
// Create a new graph node to store image initialization commands.
mImage->finishCurrentCommands(contextVk->getRenderer());
@@ -282,7 +294,7 @@ angle::Result TextureVk::copySubImage(const gl::Context *context,
const gl::Rectangle &sourceArea,
gl::Framebuffer *source)
{
- const gl::InternalFormat &currentFormat = *mState.getBaseLevelDesc().format.info;
+ const gl::InternalFormat &currentFormat = *mState.getImageDesc(index).format.info;
return copySubImageImpl(context, index, destOffset, sourceArea, currentFormat, source);
}
@@ -372,17 +384,28 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
return angle::Result::Continue;
}
- gl::Rectangle destArea(destOffset.x, destOffset.y, clippedSourceArea.width,
- clippedSourceArea.height);
-
ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer();
FramebufferVk *framebufferVk = vk::GetImpl(source);
const gl::ImageIndex offsetImageIndex = getNativeImageIndex(index);
- const gl::Offset modifiedDestOffset(destOffset.x, destOffset.y, 0);
- const vk::Format &srcFormat = framebufferVk->getColorReadRenderTarget()->getImageFormat();
+ // If negative offsets are given, clippedSourceArea ensures we don't read from those offsets.
+ // However, that changes the sourceOffset->destOffset mapping. Here, destOffset is shifted by
+ // the same amount as clipped to correct the error.
+ //
+ // TODO(syoussefi): a bug here is that we need to clip the extents to make sure the copy
+ // region does not overflow the image size. For example, if an FBO of size 16x16 is used as
+ // source and glCopyTexImage2D(..., -8, -8, 16, 16, ...) is used, then we will be copying to
+ // the region expanding from (8, 8) through (23, 23), while the image is only 16x16.
+ // http://anglebug.com/3355
+ const gl::Offset modifiedDestOffset(destOffset.x + clippedSourceArea.x - sourceArea.x,
+ destOffset.y + clippedSourceArea.y - sourceArea.y, 0);
+
+ RenderTargetVk *colorReadRT = framebufferVk->getColorReadRenderTarget();
+ ANGLE_TRY(colorReadRT->ensureImageInitialized(contextVk));
+
+ const vk::Format &srcFormat = colorReadRT->getImageFormat();
const vk::Format &destFormat = renderer->getFormat(internalFormat.sizedInternalFormat);
bool isViewportFlipY = contextVk->isViewportFlipEnabledForDrawFBO();
@@ -390,8 +413,6 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
// If it's possible to perform the copy with a transfer, that's the best option.
if (!isViewportFlipY && CanCopyWithTransfer(renderer, srcFormat, destFormat))
{
- RenderTargetVk *colorReadRT = framebufferVk->getColorReadRenderTarget();
-
return copySubImageImplWithTransfer(contextVk, offsetImageIndex, modifiedDestOffset,
destFormat, 0, clippedSourceArea,
&colorReadRT->getImage());
@@ -402,13 +423,12 @@ angle::Result TextureVk::copySubImageImpl(const gl::Context *context,
// If it's possible to perform the copy with a draw call, do that.
if (CanCopyWithDraw(renderer, srcFormat, destFormat) && !forceCpuPath)
{
- RenderTargetVk *colorReadRT = framebufferVk->getColorReadRenderTarget();
-
// Layer count can only be 1 as the source is a framebuffer.
ASSERT(offsetImageIndex.getLayerCount() == 1);
return copySubImageImplWithDraw(contextVk, offsetImageIndex, modifiedDestOffset, destFormat,
- 0, clippedSourceArea, isViewportFlipY, false, false, false,
+ 0, colorReadRT->getLayerIndex(), clippedSourceArea,
+ isViewportFlipY, false, false, false,
&colorReadRT->getImage(), colorReadRT->getReadImageView());
}
@@ -457,7 +477,7 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk,
if (CanCopyWithDraw(renderer, sourceVkFormat, destVkFormat) && !forceCpuPath)
{
return copySubImageImplWithDraw(contextVk, offsetImageIndex, destOffset, destVkFormat,
- sourceLevel, sourceArea, false, unpackFlipY,
+ sourceLevel, 0, sourceArea, false, unpackFlipY,
unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
&source->getImage(), &source->getReadImageView());
}
@@ -472,8 +492,8 @@ angle::Result TextureVk::copySubTextureImpl(ContextVk *contextVk,
uint8_t *sourceData = nullptr;
ANGLE_TRY(source->copyImageDataToBuffer(contextVk, sourceLevel, 1, sourceArea, &sourceData));
- const angle::Format &sourceTextureFormat = sourceVkFormat.textureFormat();
- const angle::Format &destTextureFormat = destVkFormat.textureFormat();
+ const angle::Format &sourceTextureFormat = sourceVkFormat.imageFormat();
+ const angle::Format &destTextureFormat = destVkFormat.imageFormat();
size_t destinationAllocationSize =
sourceArea.width * sourceArea.height * destTextureFormat.pixelBytes;
@@ -607,6 +627,7 @@ angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk,
const gl::Offset &destOffset,
const vk::Format &destFormat,
size_t sourceLevel,
+ size_t sourceLayer,
const gl::Rectangle &sourceArea,
bool isSrcFlipY,
bool unpackFlipY,
@@ -637,6 +658,33 @@ angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk,
uint32_t baseLayer = index.hasLayer() ? index.getLayerIndex() : 0;
uint32_t layerCount = index.getLayerCount();
+ // If the source image is a cube map, the view is of VK_IMAGE_VIEW_TYPE_CUBE type. However,
+ // GLSL's texelFetch cannot take a textureCube. We need to create a 2D_ARRAY type view to be
+ // able to perform the copy.
+ //
+ // Note(syoussefi): Array textures are not yet supported in Vulkan. Once they are, the if below
+ // should be changed to detect cube maps only.
+ vk::ImageView cubeAs2DArrayView;
+ if (srcImage->getLayerCount() % 6 == 0)
+ {
+ // TODO(syoussefi): If the cube map is LUMA, we need swizzle. http://anglebug.com/2911
+ // This can't happen when copying from framebuffers, so only source of concern would be
+ // copy[Sub]Texture copying from a LUMA cube map.
+ ASSERT(!srcImage->getFormat().imageFormat().isLUMA());
+
+ gl::TextureType arrayTextureType =
+ Get2DTextureType(srcImage->getLayerCount(), srcImage->getSamples());
+ ANGLE_TRY(srcImage->initImageView(contextVk, arrayTextureType, VK_IMAGE_ASPECT_COLOR_BIT,
+ gl::SwizzleState(), &cubeAs2DArrayView, 0,
+ srcImage->getLevelCount()));
+ srcView = &cubeAs2DArrayView;
+ }
+ else
+ {
+ // Source layer is otherwise baked into the view
+ sourceLayer = 0;
+ }
+
// If destination is valid, copy the source directly into it.
if (mImage->valid())
{
@@ -645,7 +693,7 @@ angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk,
for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex)
{
- params.srcLayer = layerIndex;
+ params.srcLayer = sourceLayer + layerIndex;
vk::ImageView *destView;
ANGLE_TRY(
@@ -673,7 +721,7 @@ angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk,
for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex)
{
- params.srcLayer = layerIndex;
+ params.srcLayer = sourceLayer + layerIndex;
// Create a temporary view for this layer.
vk::ImageView stagingView;
@@ -695,6 +743,11 @@ angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk,
gl::Extents(sourceArea.width, sourceArea.height, 1));
}
+ if (cubeAs2DArrayView.valid())
+ {
+ renderer->releaseObject(currentQueueSerial, &cubeAs2DArrayView);
+ }
+
return angle::Result::Continue;
}
@@ -727,6 +780,44 @@ angle::Result TextureVk::setStorage(const gl::Context *context,
return angle::Result::Continue;
}
+angle::Result TextureVk::setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset)
+{
+ ContextVk *contextVk = vk::GetImpl(context);
+ RendererVk *renderer = contextVk->getRenderer();
+ MemoryObjectVk *memoryObjectVk = vk::GetImpl(memoryObject);
+
+ releaseAndDeleteImage(context, renderer);
+
+ const vk::Format &format = renderer->getFormat(internalFormat);
+
+ setImageHelper(renderer, new vk::ImageHelper(), mState.getType(), format, 0, 0, true);
+
+ ANGLE_TRY(
+ memoryObjectVk->createImage(context, type, levels, internalFormat, size, offset, mImage));
+
+ ANGLE_TRY(initImageViews(contextVk, format, levels));
+
+ // TODO(spang): This needs to be reworked when semaphores are added.
+ // http://anglebug.com/3289
+ uint32_t rendererQueueFamilyIndex = renderer->getQueueFamilyIndex();
+ if (mImage->isQueueChangeNeccesary(rendererQueueFamilyIndex))
+ {
+ vk::CommandBuffer *commandBuffer = nullptr;
+ ANGLE_TRY(mImage->recordCommands(contextVk, &commandBuffer));
+ mImage->changeLayoutAndQueue(VK_IMAGE_ASPECT_COLOR_BIT,
+ vk::ImageLayout::FragmentShaderReadOnly,
+ rendererQueueFamilyIndex, commandBuffer);
+ }
+
+ return angle::Result::Continue;
+}
+
angle::Result TextureVk::setEGLImageTarget(const gl::Context *context,
gl::TextureType type,
egl::Image *image)
@@ -900,7 +991,7 @@ angle::Result TextureVk::copyImageDataToBuffer(ContextVk *contextVk,
// Make sure the source is initialized and it's images are flushed.
ANGLE_TRY(ensureImageInitialized(contextVk));
- const angle::Format &imageFormat = getImage().getFormat().textureFormat();
+ const angle::Format &imageFormat = getImage().getFormat().imageFormat();
size_t sourceCopyAllocationSize =
sourceArea.width * sourceArea.height * imageFormat.pixelBytes * layerCount;
@@ -936,7 +1027,7 @@ angle::Result TextureVk::copyImageDataToBuffer(ContextVk *contextVk,
copyBufferHandle, 1, &region);
// Explicitly finish. If new use cases arise where we don't want to block we can change this.
- ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
+ ANGLE_TRY(contextVk->finishImpl());
return angle::Result::Continue;
}
@@ -953,7 +1044,7 @@ angle::Result TextureVk::generateMipmapsWithCPU(const gl::Context *context)
ANGLE_TRY(copyImageDataToBuffer(contextVk, mState.getEffectiveBaseLevel(), imageLayerCount,
imageArea, &imageData));
- const angle::Format &angleFormat = mImage->getFormat().textureFormat();
+ const angle::Format &angleFormat = mImage->getFormat().imageFormat();
GLuint sourceRowPitch = baseLevelExtents.width * angleFormat.pixelBytes;
size_t baseLevelAllocationSize = sourceRowPitch * baseLevelExtents.height;
@@ -970,9 +1061,10 @@ angle::Result TextureVk::generateMipmapsWithCPU(const gl::Context *context)
sourceRowPitch, imageData + bufferOffset));
}
- vk::CommandBuffer *commandBuffer;
+ vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mImage->recordCommands(contextVk, &commandBuffer));
- return mImage->flushStagedUpdates(contextVk, getNativeImageLevel(0), getLevelCount(),
+ return mImage->flushStagedUpdates(contextVk, getNativeImageLevel(0), mImage->getLevelCount(),
+ getNativeImageLayer(0), mImage->getLayerCount(),
commandBuffer);
}
@@ -983,7 +1075,7 @@ angle::Result TextureVk::generateMipmap(const gl::Context *context)
// Some data is pending, or the image has not been defined at all yet
if (!mImage->valid())
{
- // lets initialize the image so we can generate the next levels.
+ // Let's initialize the image so we can generate the next levels.
if (mImage->hasStagedUpdates())
{
ANGLE_TRY(ensureImageInitialized(contextVk));
@@ -1000,8 +1092,7 @@ angle::Result TextureVk::generateMipmap(const gl::Context *context)
// Check if the image supports blit. If it does, we can do the mipmap generation on the gpu
// only.
- if (renderer->hasTextureFormatFeatureBits(mImage->getFormat().vkTextureFormat,
- kBlitFeatureFlags))
+ if (renderer->hasImageFormatFeatureBits(mImage->getFormat().vkImageFormat, kBlitFeatureFlags))
{
ANGLE_TRY(ensureImageInitialized(contextVk));
ANGLE_TRY(mImage->generateMipmapsWithBlit(contextVk, mState.getMipmapMaxLevel()));
@@ -1098,6 +1189,7 @@ angle::Result TextureVk::ensureImageInitializedImpl(ContextVk *contextVk,
{
return angle::Result::Continue;
}
+
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mImage->recordCommands(contextVk, &commandBuffer));
@@ -1106,7 +1198,9 @@ angle::Result TextureVk::ensureImageInitializedImpl(ContextVk *contextVk,
ANGLE_TRY(initImage(contextVk, format, baseLevelExtents, levelCount, commandBuffer));
}
- return mImage->flushStagedUpdates(contextVk, getNativeImageLevel(0), levelCount, commandBuffer);
+ return mImage->flushStagedUpdates(contextVk, getNativeImageLevel(0), mImage->getLevelCount(),
+ getNativeImageLayer(0), mImage->getLayerCount(),
+ commandBuffer);
}
angle::Result TextureVk::initCubeMapRenderTargets(ContextVk *contextVk)
@@ -1185,7 +1279,12 @@ angle::Result TextureVk::setStorageMultisample(const gl::Context *context,
angle::Result TextureVk::initializeContents(const gl::Context *context,
const gl::ImageIndex &imageIndex)
{
- UNIMPLEMENTED();
+ const gl::ImageDesc &desc = mState.getImageDesc(imageIndex);
+ const vk::Format &format =
+ vk::GetImpl(context)->getRenderer()->getFormat(desc.format.info->sizedInternalFormat);
+
+ mImage->stageSubresourceRobustClear(imageIndex, format.angleFormat());
+
return angle::Result::Continue;
}
@@ -1217,7 +1316,7 @@ angle::Result TextureVk::getLayerLevelDrawImageView(vk::Context *context,
vk::ImageView **imageViewOut)
{
ASSERT(mImage->valid());
- ASSERT(!mImage->getFormat().textureFormat().isBlock);
+ ASSERT(!mImage->getFormat().imageFormat().isBlock);
// Lazily allocate the storage for image views
if (mLayerLevelDrawImageViews.empty())
@@ -1258,14 +1357,14 @@ angle::Result TextureVk::initImage(ContextVk *contextVk,
const uint32_t levelCount,
vk::CommandBuffer *commandBuffer)
{
- const RendererVk *renderer = contextVk->getRenderer();
- const angle::Format &angleFormat = format.textureFormat();
+ const RendererVk *renderer = contextVk->getRenderer();
+ const angle::Format &textureFormat = format.imageFormat();
VkImageUsageFlags imageUsageFlags = VK_IMAGE_USAGE_TRANSFER_DST_BIT |
VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
VK_IMAGE_USAGE_SAMPLED_BIT;
- if (!angleFormat.isBlock)
+ if (!textureFormat.isBlock)
{
imageUsageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
}
@@ -1280,13 +1379,20 @@ angle::Result TextureVk::initImage(ContextVk *contextVk,
ANGLE_TRY(initImageViews(contextVk, format, levelCount));
- if (!angleFormat.isBlock)
+ // If the image has an emulated channel, always clear it. These channels will be masked out in
+ // future writes, and shouldn't contain uninitialized values.
+ if (format.hasEmulatedImageChannels())
{
- // TODO(jmadill): Fold this into the RenderPass load/store ops if possible, or defer to
- // first use. This is only necessary if robustness is required. http://anglebug.com/2361
- VkClearColorValue black = {{0, 0, 0, 1.0f}};
- mImage->clearColor(black, 0, levelCount, commandBuffer);
+ uint32_t levelCount = mImage->getLevelCount();
+ uint32_t layerCount = mImage->getLayerCount();
+
+ for (uint32_t level = 0; level < levelCount; ++level)
+ {
+ gl::ImageIndex index = gl::ImageIndex::Make2DArrayRange(level, 0, layerCount);
+ mImage->stageSubresourceEmulatedClear(index, format.angleFormat());
+ }
}
+
return angle::Result::Continue;
}
@@ -1311,7 +1417,7 @@ angle::Result TextureVk::initImageViews(ContextVk *contextVk,
ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), VK_IMAGE_ASPECT_COLOR_BIT,
mappedSwizzle, &mReadBaseLevelImageView, baseLevel, 1,
baseLayer, layerCount));
- if (!format.textureFormat().isBlock)
+ if (!format.imageFormat().isBlock)
{
ANGLE_TRY(mImage->initLayerImageView(contextVk, mState.getType(), VK_IMAGE_ASPECT_COLOR_BIT,
gl::SwizzleState(), &mDrawBaseLevelImageView,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h
index 33a1057e67a..21b6192ae26 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.h
@@ -96,6 +96,14 @@ class TextureVk : public TextureImpl
GLenum internalFormat,
const gl::Extents &size) override;
+ angle::Result setStorageExternalMemory(const gl::Context *context,
+ gl::TextureType type,
+ size_t levels,
+ GLenum internalFormat,
+ const gl::Extents &size,
+ gl::MemoryObject *memoryObject,
+ GLuint64 offset) override;
+
angle::Result setEGLImageTarget(const gl::Context *context,
gl::TextureType type,
egl::Image *image) override;
@@ -189,7 +197,8 @@ class TextureVk : public TextureImpl
const gl::InternalFormat &formatInfo,
GLenum type,
const gl::PixelUnpackState &unpack,
- const uint8_t *pixels);
+ const uint8_t *pixels,
+ const vk::Format &vkFormat);
angle::Result copyImageDataToBuffer(ContextVk *contextVk,
size_t sourceLevel,
@@ -240,6 +249,7 @@ class TextureVk : public TextureImpl
const gl::Offset &destOffset,
const vk::Format &destFormat,
size_t sourceLevel,
+ size_t sourceLayer,
const gl::Rectangle &sourceArea,
bool isSrcFlipY,
bool unpackFlipY,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.cpp
index a290eb1c895..18e1754f98b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.cpp
@@ -18,6 +18,7 @@ namespace rx
namespace BufferUtils_comp = vk::InternalShader::BufferUtils_comp;
namespace ConvertVertex_comp = vk::InternalShader::ConvertVertex_comp;
+namespace ImageClear_frag = vk::InternalShader::ImageClear_frag;
namespace ImageCopy_frag = vk::InternalShader::ImageCopy_frag;
namespace
@@ -117,6 +118,25 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
return flags;
}
+uint32_t GetImageClearFlags(const angle::Format &format, uint32_t attachmentIndex)
+{
+ constexpr uint32_t kAttachmentFlagStep =
+ ImageClear_frag::kAttachment1 - ImageClear_frag::kAttachment0;
+
+ static_assert(gl::IMPLEMENTATION_MAX_DRAW_BUFFERS == 8,
+ "ImageClear shader assumes maximum 8 draw buffers");
+ static_assert(
+ ImageClear_frag::kAttachment0 + 7 * kAttachmentFlagStep == ImageClear_frag::kAttachment7,
+ "ImageClear AttachmentN flag calculation needs correction");
+
+ uint32_t flags = ImageClear_frag::kAttachment0 + attachmentIndex * kAttachmentFlagStep;
+
+ flags |= format.isInt()
+ ? ImageClear_frag::kIsInt
+ : format.isUint() ? ImageClear_frag::kIsUint : ImageClear_frag::kIsFloat;
+
+ return flags;
+}
uint32_t GetImageCopyFlags(const vk::Format &srcFormat, const vk::Format &destFormat)
{
const angle::Format &srcAngleFormat = srcFormat.angleFormat();
@@ -139,7 +159,7 @@ uint32_t GetFormatDefaultChannelMask(const vk::Format &format)
uint32_t mask = 0;
const angle::Format &angleFormat = format.angleFormat();
- const angle::Format &textureFormat = format.textureFormat();
+ const angle::Format &textureFormat = format.imageFormat();
// Red can never be introduced due to format emulation (except for luma which is handled
// especially)
@@ -180,7 +200,11 @@ void UtilsVk::destroy(VkDevice device)
{
program.destroy(device);
}
- mImageClearProgram.destroy(device);
+ mImageClearProgramVSOnly.destroy(device);
+ for (vk::ShaderProgramHelper &program : mImageClearProgram)
+ {
+ program.destroy(device);
+ }
for (vk::ShaderProgramHelper &program : mImageCopyPrograms)
{
program.destroy(device);
@@ -316,8 +340,6 @@ angle::Result UtilsVk::setupProgram(vk::Context *context,
RendererVk *renderer = context->getRenderer();
bool isCompute = function >= Function::ComputeStartIndex;
- VkPipelineBindPoint bindPoint =
- isCompute ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS;
VkShaderStageFlags pushConstantsShaderStage =
isCompute ? VK_SHADER_STAGE_COMPUTE_BIT : VK_SHADER_STAGE_FRAGMENT_BIT;
@@ -335,12 +357,19 @@ angle::Result UtilsVk::setupProgram(vk::Context *context,
program->setShader(gl::ShaderType::Compute, fsCsShader);
ANGLE_TRY(program->getComputePipeline(context, pipelineLayout.get(), &pipelineAndSerial));
pipelineAndSerial->updateSerial(serial);
- commandBuffer->bindPipeline(bindPoint, pipelineAndSerial->get());
+ commandBuffer->bindComputePipeline(pipelineAndSerial->get());
+ if (descriptorSet != VK_NULL_HANDLE)
+ {
+ commandBuffer->bindComputeDescriptorSets(pipelineLayout.get(), &descriptorSet);
+ }
}
else
{
program->setShader(gl::ShaderType::Vertex, vsShader);
- program->setShader(gl::ShaderType::Fragment, fsCsShader);
+ if (fsCsShader)
+ {
+ program->setShader(gl::ShaderType::Fragment, fsCsShader);
+ }
// This value is not used but is passed to getGraphicsPipeline to avoid a nullptr check.
const vk::GraphicsPipelineDesc *descPtr;
@@ -350,13 +379,12 @@ angle::Result UtilsVk::setupProgram(vk::Context *context,
context, &renderer->getRenderPassCache(), renderer->getPipelineCache(), serial,
pipelineLayout.get(), *pipelineDesc, gl::AttributesMask(), &descPtr, &helper));
helper->updateSerial(serial);
- commandBuffer->bindPipeline(bindPoint, helper->getPipeline());
- }
-
- if (descriptorSet != VK_NULL_HANDLE)
- {
- commandBuffer->bindDescriptorSets(bindPoint, pipelineLayout.get(), 0, 1, &descriptorSet, 0,
- nullptr);
+ commandBuffer->bindGraphicsPipeline(helper->getPipeline());
+ if (descriptorSet != VK_NULL_HANDLE)
+ {
+ commandBuffer->bindGraphicsDescriptorSets(pipelineLayout.get(), 0, 1, &descriptorSet, 0,
+ nullptr);
+ }
}
commandBuffer->pushConstants(pipelineLayout.get(), pushConstantsShaderStage, 0,
@@ -580,14 +608,15 @@ angle::Result UtilsVk::startRenderPass(ContextVk *contextVk,
{
RendererVk *renderer = contextVk->getRenderer();
- vk::RenderPass *renderPass = nullptr;
- ANGLE_TRY(renderer->getCompatibleRenderPass(contextVk, renderPassDesc, &renderPass));
+ vk::RenderPass *compatibleRenderPass = nullptr;
+ ANGLE_TRY(renderer->getCompatibleRenderPass(contextVk, renderPassDesc, &compatibleRenderPass));
VkFramebufferCreateInfo framebufferInfo = {};
+ // Minimize the framebuffer coverage to only cover up to the render area.
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.flags = 0;
- framebufferInfo.renderPass = renderPass->getHandle();
+ framebufferInfo.renderPass = compatibleRenderPass->getHandle();
framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = imageView->ptr();
framebufferInfo.width = renderArea.x + renderArea.width;
@@ -597,69 +626,93 @@ angle::Result UtilsVk::startRenderPass(ContextVk *contextVk,
vk::Framebuffer framebuffer;
ANGLE_VK_TRY(contextVk, framebuffer.init(contextVk->getDevice(), framebufferInfo));
- // TODO(jmadill): Proper clear value implementation. http://anglebug.com/2361
+ vk::AttachmentOpsArray renderPassAttachmentOps;
std::vector<VkClearValue> clearValues = {{}};
ASSERT(clearValues.size() == 1);
+ renderPassAttachmentOps.initWithLoadStore(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
+
ANGLE_TRY(image->beginRenderPass(contextVk, framebuffer, renderArea, renderPassDesc,
- clearValues, commandBufferOut));
+ renderPassAttachmentOps, clearValues, commandBufferOut));
renderer->releaseObject(renderer->getCurrentQueueSerial(), &framebuffer);
return angle::Result::Continue;
}
-angle::Result UtilsVk::clearImage(ContextVk *contextVk,
- FramebufferVk *framebuffer,
- const ClearImageParameters &params)
+angle::Result UtilsVk::clearFramebuffer(ContextVk *contextVk,
+ FramebufferVk *framebuffer,
+ const ClearFramebufferParameters &params)
{
RendererVk *renderer = contextVk->getRenderer();
ANGLE_TRY(ensureImageClearResourcesInitialized(contextVk));
+ const gl::Rectangle &scissoredRenderArea = params.clearArea;
+
vk::CommandBuffer *commandBuffer;
- if (!framebuffer->appendToStartedRenderPass(renderer->getCurrentQueueSerial(), &commandBuffer))
+ if (!framebuffer->appendToStartedRenderPass(renderer->getCurrentQueueSerial(),
+ scissoredRenderArea, &commandBuffer))
{
- ANGLE_TRY(framebuffer->startNewRenderPass(contextVk, &commandBuffer));
+ ANGLE_TRY(framebuffer->startNewRenderPass(contextVk, scissoredRenderArea, &commandBuffer));
}
ImageClearShaderParams shaderParams;
- shaderParams.clearValue = params.clearValue;
+ shaderParams.clearValue = params.colorClearValue;
vk::GraphicsPipelineDesc pipelineDesc;
pipelineDesc.initDefaults();
- pipelineDesc.setColorWriteMask(params.colorMaskFlags, *params.alphaMask);
+ pipelineDesc.setColorWriteMask(0, gl::DrawBufferMask());
+ pipelineDesc.setSingleColorWriteMask(params.colorAttachmentIndex, params.colorMaskFlags);
pipelineDesc.setRenderPassDesc(*params.renderPassDesc);
+ // Note: depth test is disabled by default so this should be unnecessary, but works around an
+ // Intel bug on windows. http://anglebug.com/3348
+ pipelineDesc.setDepthWriteEnabled(false);
- const gl::Rectangle &renderArea = framebuffer->getFramebuffer()->getRenderPassRenderArea();
- bool invertViewport = contextVk->isViewportFlipEnabledForDrawFBO();
+ // Clear stencil by enabling stencil write with the right mask.
+ if (params.clearStencil)
+ {
+ const uint8_t compareMask = 0xFF;
+ const uint8_t clearStencilValue = params.stencilClearValue;
+
+ pipelineDesc.setStencilTestEnabled(true);
+ pipelineDesc.setStencilFrontFuncs(clearStencilValue, VK_COMPARE_OP_ALWAYS, compareMask);
+ pipelineDesc.setStencilBackFuncs(clearStencilValue, VK_COMPARE_OP_ALWAYS, compareMask);
+ pipelineDesc.setStencilFrontOps(VK_STENCIL_OP_REPLACE, VK_STENCIL_OP_REPLACE,
+ VK_STENCIL_OP_REPLACE);
+ pipelineDesc.setStencilBackOps(VK_STENCIL_OP_REPLACE, VK_STENCIL_OP_REPLACE,
+ VK_STENCIL_OP_REPLACE);
+ pipelineDesc.setStencilFrontWriteMask(params.stencilMask);
+ pipelineDesc.setStencilBackWriteMask(params.stencilMask);
+ }
VkViewport viewport;
- gl_vk::GetViewport(renderArea, 0.0f, 1.0f, invertViewport, params.renderAreaHeight, &viewport);
+ gl::Rectangle completeRenderArea = framebuffer->getCompleteRenderArea();
+ bool invertViewport = contextVk->isViewportFlipEnabledForDrawFBO();
+ gl_vk::GetViewport(completeRenderArea, 0.0f, 1.0f, invertViewport, params.renderAreaHeight,
+ &viewport);
pipelineDesc.setViewport(viewport);
- VkRect2D scissor;
- const gl::State &glState = contextVk->getState();
- gl_vk::GetScissor(glState, invertViewport, renderArea, &scissor);
- // TODO(courtneygo): workaround for scissor issue on some devices. http://anglebug.com/3114
- if ((scissor.extent.width == 0) || (scissor.extent.height == 0))
- {
- return angle::Result::Continue;
- }
- pipelineDesc.setScissor(scissor);
+ pipelineDesc.setScissor(gl_vk::GetRect(params.clearArea));
vk::ShaderLibrary &shaderLibrary = renderer->getShaderLibrary();
vk::RefCounted<vk::ShaderAndSerial> *vertexShader = nullptr;
vk::RefCounted<vk::ShaderAndSerial> *fragmentShader = nullptr;
+ vk::ShaderProgramHelper *imageClearProgram = &mImageClearProgramVSOnly;
+
ANGLE_TRY(shaderLibrary.getFullScreenQuad_vert(contextVk, 0, &vertexShader));
- ANGLE_TRY(shaderLibrary.getImageClear_frag(contextVk, 0, &fragmentShader));
+ if (params.clearColor)
+ {
+ uint32_t flags = GetImageClearFlags(*params.colorFormat, params.colorAttachmentIndex);
+ ANGLE_TRY(shaderLibrary.getImageClear_frag(contextVk, flags, &fragmentShader));
+ imageClearProgram = &mImageClearProgram[flags];
+ }
ANGLE_TRY(setupProgram(contextVk, Function::ImageClear, fragmentShader, vertexShader,
- &mImageClearProgram, &pipelineDesc, VK_NULL_HANDLE, &shaderParams,
+ imageClearProgram, &pipelineDesc, VK_NULL_HANDLE, &shaderParams,
sizeof(shaderParams), commandBuffer));
-
- commandBuffer->draw(6, 1, 0, 0);
-
+ commandBuffer->draw(6, 0);
return angle::Result::Continue;
}
@@ -783,12 +836,23 @@ angle::Result UtilsVk::copyImage(ContextVk *contextVk,
ANGLE_TRY(setupProgram(contextVk, Function::ImageCopy, fragmentShader, vertexShader,
&mImageCopyPrograms[flags], &pipelineDesc, descriptorSet, &shaderParams,
sizeof(shaderParams), commandBuffer));
-
- commandBuffer->draw(6, 1, 0, 0);
-
+ commandBuffer->draw(6, 0);
descriptorPoolBinding.reset();
return angle::Result::Continue;
}
+UtilsVk::ClearFramebufferParameters::ClearFramebufferParameters()
+ : renderPassDesc(nullptr),
+ renderAreaHeight(0),
+ clearColor(false),
+ clearStencil(false),
+ stencilMask(0),
+ colorMaskFlags(0),
+ colorAttachmentIndex(0),
+ colorFormat(nullptr),
+ colorClearValue{},
+ stencilClearValue(0)
+{}
+
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.h
index 574b4683137..9ccf5c14c06 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/UtilsVk.h
@@ -59,13 +59,27 @@ class UtilsVk : angle::NonCopyable
size_t destOffset;
};
- struct ClearImageParameters
+ struct ClearFramebufferParameters
{
- VkClearColorValue clearValue;
- VkColorComponentFlags colorMaskFlags;
- GLint renderAreaHeight;
- const gl::DrawBufferMask *alphaMask;
+ // Satisfy chromium-style with a constructor that does what = {} was already doing in a
+ // safer way.
+ ClearFramebufferParameters();
+
const vk::RenderPassDesc *renderPassDesc;
+ GLint renderAreaHeight;
+ gl::Rectangle clearArea;
+
+ // Note that depth clear is never needed to be done with a draw call.
+ bool clearColor;
+ bool clearStencil;
+
+ uint8_t stencilMask;
+ VkColorComponentFlags colorMaskFlags;
+ uint32_t colorAttachmentIndex;
+ const angle::Format *colorFormat;
+
+ VkClearColorValue colorClearValue;
+ uint8_t stencilClearValue;
};
struct CopyImageParameters
@@ -94,12 +108,9 @@ class UtilsVk : angle::NonCopyable
vk::BufferHelper *src,
const ConvertVertexParameters &params);
- // Note: this function takes a FramebufferVk instead of ImageHelper, as that's the only user,
- // which avoids recreating a framebuffer. An overload taking ImageHelper can be added when
- // necessary.
- angle::Result clearImage(ContextVk *contextVk,
- FramebufferVk *framebuffer,
- const ClearImageParameters &params);
+ angle::Result clearFramebuffer(ContextVk *contextVk,
+ FramebufferVk *framebuffer,
+ const ClearFramebufferParameters &params);
angle::Result copyImage(ContextVk *contextVk,
vk::ImageHelper *dest,
@@ -231,7 +242,10 @@ class UtilsVk : angle::NonCopyable
vk::ShaderProgramHelper
mConvertVertexPrograms[vk::InternalShader::ConvertVertex_comp::kFlagsMask |
vk::InternalShader::ConvertVertex_comp::kConversionMask];
- vk::ShaderProgramHelper mImageClearProgram;
+ vk::ShaderProgramHelper mImageClearProgramVSOnly;
+ vk::ShaderProgramHelper
+ mImageClearProgram[vk::InternalShader::ImageClear_frag::kAttachmentIndexMask |
+ vk::InternalShader::ImageClear_frag::kFormatMask];
vk::ShaderProgramHelper mImageCopyPrograms[vk::InternalShader::ImageCopy_frag::kFlagsMask |
vk::InternalShader::ImageCopy_frag::kSrcFormatMask |
vk::InternalShader::ImageCopy_frag::kDestFormatMask];
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index 03f96b38260..f5acd68efd1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -138,7 +138,7 @@ VertexArrayVk::VertexArrayVk(ContextVk *contextVk, const gl::VertexArrayState &s
mCurrentArrayBufferHandles.fill(mTheNullBuffer.getBuffer().getHandle());
mCurrentArrayBufferOffsets.fill(0);
- mCurrentArrayBuffers.fill(nullptr);
+ mCurrentArrayBuffers.fill(&mTheNullBuffer);
for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
{
@@ -264,7 +264,7 @@ angle::Result VertexArrayVk::convertVertexBufferCpu(ContextVk *contextVk,
{
TRACE_EVENT0("gpu.angle", "VertexArrayVk::convertVertexBufferCpu");
// Needed before reading buffer or we could get stale data.
- ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
+ ANGLE_TRY(contextVk->finishImpl());
unsigned srcFormatSize = vertexFormat.angleFormat().pixelBytes;
unsigned dstFormatSize = vertexFormat.bufferFormat().pixelBytes;
@@ -438,7 +438,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
{
if (bufferVk->getSize() == 0)
{
- mCurrentArrayBuffers[attribIndex] = nullptr;
+ mCurrentArrayBuffers[attribIndex] = &mTheNullBuffer;
mCurrentArrayBufferHandles[attribIndex] =
mTheNullBuffer.getBuffer().getHandle();
mCurrentArrayBufferOffsets[attribIndex] = 0;
@@ -458,7 +458,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
}
else
{
- mCurrentArrayBuffers[attribIndex] = nullptr;
+ mCurrentArrayBuffers[attribIndex] = &mTheNullBuffer;
mCurrentArrayBufferHandles[attribIndex] = mTheNullBuffer.getBuffer().getHandle();
mCurrentArrayBufferOffsets[attribIndex] = 0;
stride = vertexFormat.bufferFormat().pixelBytes;
@@ -473,7 +473,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
contextVk->invalidateDefaultAttribute(attribIndex);
// These will be filled out by the ContextVk.
- mCurrentArrayBuffers[attribIndex] = nullptr;
+ mCurrentArrayBuffers[attribIndex] = &mTheNullBuffer;
mCurrentArrayBufferHandles[attribIndex] = mTheNullBuffer.getBuffer().getHandle();
mCurrentArrayBufferOffsets[attribIndex] = 0;
@@ -483,7 +483,7 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
if (anyVertexBufferConvertedOnGpu && renderer->getFeatures().flushAfterVertexConversion)
{
- ANGLE_TRY(renderer->flush(contextVk));
+ ANGLE_TRY(contextVk->flushImpl());
}
return angle::Result::Continue;
@@ -678,7 +678,7 @@ angle::Result VertexArrayVk::updateIndexTranslation(ContextVk *contextVk,
TRACE_EVENT0("gpu.angle", "VertexArrayVk::updateIndexTranslation");
// Needed before reading buffer or we could get stale data.
- ANGLE_TRY(renderer->finish(contextVk));
+ ANGLE_TRY(contextVk->finishImpl());
ASSERT(type == gl::DrawElementsType::UnsignedByte);
// Unsigned bytes don't have direct support in Vulkan so we have to expand the
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
index a60f12cf6d0..94bb4b1b4dd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/android/HardwareBufferImageSiblingVkAndroid.cpp
@@ -98,13 +98,13 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk
ANGLE_VK_TRY(displayVk, vkGetAndroidHardwareBufferPropertiesANDROID(device, hardwareBuffer,
&bufferProperties));
- const vk::Format &vkFormat = renderer->getFormat(internalFormat);
- const angle::Format &textureFormat = vkFormat.textureFormat();
- bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
+ const vk::Format &vkFormat = renderer->getFormat(internalFormat);
+ const angle::Format &imageFormat = vkFormat.imageFormat();
+ bool isDepthOrStencilFormat = imageFormat.depthBits > 0 || imageFormat.stencilBits > 0;
const VkImageUsageFlags usage =
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
VK_IMAGE_USAGE_SAMPLED_BIT |
- (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
+ (imageFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
(isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
VkExternalFormatANDROID externalFormat = {};
@@ -149,15 +149,15 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk
constexpr uint32_t kColorRenderableRequiredBits = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
constexpr uint32_t kDepthStencilRenderableRequiredBits = VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
- mRenderable = renderer->hasTextureFormatFeatureBits(vkFormat.vkTextureFormat,
- kColorRenderableRequiredBits) ||
- renderer->hasTextureFormatFeatureBits(vkFormat.vkTextureFormat,
- kDepthStencilRenderableRequiredBits);
+ mRenderable =
+ renderer->hasImageFormatFeatureBits(vkFormat.vkImageFormat, kColorRenderableRequiredBits) ||
+ renderer->hasImageFormatFeatureBits(vkFormat.vkImageFormat,
+ kDepthStencilRenderableRequiredBits);
constexpr uint32_t kTextureableRequiredBits =
VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
mTextureable =
- renderer->hasTextureFormatFeatureBits(vkFormat.vkTextureFormat, kTextureableRequiredBits);
+ renderer->hasImageFormatFeatureBits(vkFormat.vkImageFormat, kTextureableRequiredBits);
return angle::Result::Continue;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterComparison.gif b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterComparison.gif
new file mode 100644
index 00000000000..38b03c89ee0
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterComparison.gif
Binary files differ
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterPixelExample.png b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterPixelExample.png
new file mode 100644
index 00000000000..29923fb0031
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/LineRasterPixelExample.png
Binary files differ
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/VulkanShaderTranslation.svg b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/VulkanShaderTranslation.svg
new file mode 100644
index 00000000000..49658c60b74
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/doc/img/VulkanShaderTranslation.svg
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"><svg xmlns="http://www.w3.org/2000/svg" width="1185" height="1229" xmlns:xlink="http://www.w3.org/1999/xlink"><source><![CDATA[participant App
+participant "ANGLE Front-end"
+participant "Vulkan Back-end"
+participant "ANGLE Translator"
+participant "GlslangWrapper"
+participant "Glslang"
+
+App->"ANGLE Front-end": glCompileShader (VS)
+"ANGLE Front-end"->"Vulkan Back-end": ShaderVk::compile
+"Vulkan Back-end"->"ANGLE Translator": sh::Compile
+"ANGLE Translator"-->"ANGLE Front-end": return Vulkan-compatible GLSL
+
+Note right of "ANGLE Front-end": Source is templated\nwith markers to be\nfilled at link time.
+
+Note right of App: Same for FS, GS, etc...
+
+App->"ANGLE Front-end": glCreateProgram (...)
+App->"ANGLE Front-end": glAttachShader (...)
+App->"ANGLE Front-end": glLinkProgram
+"ANGLE Front-end"->"Vulkan Back-end": ProgramVk::link
+
+Note right of "Vulkan Back-end": ProgramVk inits uniforms,\nlayouts, and descriptors.
+
+"Vulkan Back-end"->GlslangWrapper: GlslangWrapper::GetShaderSource
+GlslangWrapper-->"Vulkan Back-end": return filled-in sources
+
+Note right of "Vulkan Back-end": Source is templated with\ndefines to be resolved at\ndraw time.
+
+"Vulkan Back-end"-->"ANGLE Front-end": return success
+
+Note right of App: App execution continues...
+
+App->"ANGLE Front-end": glDrawArrays (any draw)
+"ANGLE Front-end"->"Vulkan Back-end": ContextVk::drawArrays
+
+"Vulkan Back-end"->GlslangWrapper: GlslangWrapper::GetShaderCode (with defines)
+GlslangWrapper->Glslang: GlslangToSpv
+Glslang-->"Vulkan Back-end": Return SPIR-V
+
+Note right of "Vulkan Back-end": We init VkShaderModules\nand VkPipeline then\nrecord the draw.
+
+"Vulkan Back-end"-->"ANGLE Front-end": return success
+]]></source><desc></desc><defs><marker viewBox="0 0 5 5" markerWidth="5" markerHeight="5" orient="auto" refX="5" refY="2.5" id="markerArrowBlock"><path d="M 0 0 L 5 2.5 L 0 5 z"></path></marker><marker viewBox="0 0 9.6 16" markerWidth="4" markerHeight="16" orient="auto" refX="9.6" refY="8" id="markerArrowOpen"><path d="M 9.6,8 1.92,16 0,13.7 5.76,8 0,2.286 1.92,0 9.6,8 z"></path></marker></defs><g class="title"></g><g class="actor"><rect x="10" y="20" width="47.59375" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="21" y="45" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="20">App</tspan></text></g><g class="actor"><rect x="10" y="1170.359375" width="47.59375" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="21" y="1195.359375" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="20">App</tspan></text></g><line x1="33.796875" x2="33.796875" y1="59" y2="1170.359375" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="237.0390625" y="20" width="152.953125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="248.0390625" y="45" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="247.0390625">ANGLE Front-end</tspan></text></g><g class="actor"><rect x="237.0390625" y="1170.359375" width="152.953125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="248.0390625" y="1195.359375" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="247.0390625">ANGLE Front-end</tspan></text></g><line x1="313.515625" x2="313.515625" y1="59" y2="1170.359375" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="462.9765625" y="20" width="152.953125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="473.9765625" y="45" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="472.9765625">Vulkan Back-end</tspan></text></g><g class="actor"><rect x="462.9765625" y="1170.359375" width="152.953125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="473.9765625" y="1195.359375" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="472.9765625">Vulkan Back-end</tspan></text></g><line x1="539.453125" x2="539.453125" y1="59" y2="1170.359375" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="728.3984375" y="20" width="161.953125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="739.3984375" y="45" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="738.3984375">ANGLE Translator</tspan></text></g><g class="actor"><rect x="728.3984375" y="1170.359375" width="161.953125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="739.3984375" y="1195.359375" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="738.3984375">ANGLE Translator</tspan></text></g><line x1="809.375" x2="809.375" y1="59" y2="1170.359375" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="910.3515625" y="20" width="143.359375" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="920.3515625" y="45" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="920.3515625">GlslangWrapper</tspan></text></g><g class="actor"><rect x="910.3515625" y="1170.359375" width="143.359375" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="920.3515625" y="1195.359375" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="920.3515625">GlslangWrapper</tspan></text></g><line x1="982.03125" x2="982.03125" y1="59" y2="1170.359375" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="actor"><rect x="1073.7109375" y="20" width="81.78125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="1083.7109375" y="45" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="1083.7109375">Glslang</tspan></text></g><g class="actor"><rect x="1073.7109375" y="1170.359375" width="81.78125" height="39" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="1083.7109375" y="1195.359375" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="1083.7109375">Glslang</tspan></text></g><line x1="1114.6015625" x2="1114.6015625" y1="59" y2="1170.359375" stroke="#000000" fill="none" style="stroke-width: 2;"></line><g class="signal"><text x="85.6875" y="89.5" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="85.6875">glCompileShader (VS)</tspan></text><line x1="33.796875" x2="313.515625" y1="98" y2="98" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="351.609375" y="128.5" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="351.609375">ShaderVk::compile</tspan></text><line x1="313.515625" x2="539.453125" y1="137" y2="137" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="625.9296875" y="167.5" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="625.9296875">sh::Compile</tspan></text><line x1="539.453125" x2="809.375" y1="176" y2="176" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="433.890625" y="206.5" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="433.890625">return Vulkan-compatible GLSL</tspan></text><line x1="809.375" x2="313.515625" y1="215" y2="215" stroke="#000000" fill="none" style="stroke-width: 2; stroke-dasharray: 6, 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="note"><rect x="333.515625" y="235" width="185.9375" height="67.390625" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="338.515625" y="255" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="338.515625">Source is templated</tspan><tspan dy="1.2em" x="338.515625">with markers to be</tspan><tspan dy="1.2em" x="338.515625">filled at link time.</tspan></text></g><g class="note"><rect x="53.796875" y="322.390625" width="212.328125" height="29" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="58.796875" y="342.390625" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="58.796875">Same for FS, GS, etc...</tspan></text></g><g class="signal"><text x="81.2890625" y="381.890625" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="81.2890625">glCreateProgram (...)</tspan></text><line x1="33.796875" x2="313.515625" y1="390.390625" y2="390.390625" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="85.6875" y="420.890625" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="85.6875">glAttachShader (...)</tspan></text><line x1="33.796875" x2="313.515625" y1="429.390625" y2="429.390625" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="116.375" y="459.890625" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="116.375">glLinkProgram</tspan></text><line x1="33.796875" x2="313.515625" y1="468.390625" y2="468.390625" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="360.40625" y="498.890625" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="360.40625">ProgramVk::link</tspan></text><line x1="313.515625" x2="539.453125" y1="507.390625" y2="507.390625" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="note"><rect x="559.453125" y="527.390625" width="229.921875" height="48.1875" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="564.453125" y="547.390625" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="564.453125">ProgramVk inits uniforms,</tspan><tspan dy="1.2em" x="564.453125">layouts, and descriptors.</tspan></text></g><g class="signal"><text x="624.2890625" y="606.078125" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="624.2890625">GlslangWrapper::GetShaderSource</tspan></text><line x1="539.453125" x2="982.03125" y1="614.578125" y2="614.578125" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="655.1796875" y="645.078125" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="655.1796875">return filled-in sources</tspan></text><line x1="982.03125" x2="539.453125" y1="653.578125" y2="653.578125" stroke="#000000" fill="none" style="stroke-width: 2; stroke-dasharray: 6, 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="note"><rect x="559.453125" y="673.578125" width="229.921875" height="67.390625" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="564.453125" y="693.578125" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="564.453125">Source is templated with</tspan><tspan dy="1.2em" x="564.453125">defines to be resolved at</tspan><tspan dy="1.2em" x="564.453125">draw time.</tspan></text></g><g class="signal"><text x="364.90625" y="771.46875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="364.90625">return success</tspan></text><line x1="539.453125" x2="313.515625" y1="779.96875" y2="779.96875" stroke="#000000" fill="none" style="stroke-width: 2; stroke-dasharray: 6, 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="note"><rect x="53.796875" y="799.96875" width="239.71875" height="29" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="59.796875" y="819.96875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="58.796875">App execution continues...</tspan></text></g><g class="signal"><text x="72.4921875" y="859.46875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="72.4921875">glDrawArrays (any draw)</tspan></text><line x1="33.796875" x2="313.515625" y1="867.96875" y2="867.96875" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="334.1171875" y="898.46875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="334.1171875">ContextVk::drawArrays</tspan></text><line x1="313.515625" x2="539.453125" y1="906.96875" y2="906.96875" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="567.2109375" y="937.46875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="567.2109375">GlslangWrapper::GetShaderCode (with defines)</tspan></text><line x1="539.453125" x2="982.03125" y1="945.96875" y2="945.96875" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="995.43359375" y="976.46875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="995.43359375">GlslangToSpv</tspan></text><line x1="982.03125" x2="1114.6015625" y1="984.96875" y2="984.96875" stroke="#000000" fill="none" style="stroke-width: 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="signal"><text x="769.24609375" y="1015.46875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="769.24609375">Return SPIR-V</tspan></text><line x1="1114.6015625" x2="539.453125" y1="1023.96875" y2="1023.96875" stroke="#000000" fill="none" style="stroke-width: 2; stroke-dasharray: 6, 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g><g class="note"><rect x="559.453125" y="1043.96875" width="212.328125" height="67.390625" stroke="#000000" fill="#ffffff" style="stroke-width: 2;"></rect><text x="564.453125" y="1063.96875" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="564.453125">We init VkShaderModules</tspan><tspan dy="1.2em" x="564.453125">and VkPipeline then</tspan><tspan dy="1.2em" x="564.453125">record the draw.</tspan></text></g><g class="signal"><text x="364.90625" y="1141.859375" style="font-size: 16px; font-family: &quot;Andale Mono&quot;, monospace;"><tspan x="364.90625">return success</tspan></text><line x1="539.453125" x2="313.515625" y1="1150.359375" y2="1150.359375" stroke="#000000" fill="none" style="stroke-width: 2; stroke-dasharray: 6, 2; marker-end: url(&quot;#markerArrowBlock&quot;);"></line></g></svg> \ No newline at end of file
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_format_table.py b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_format_table.py
index 2129a7180d3..7ddef0ed774 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_format_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_format_table.py
@@ -5,6 +5,7 @@
#
# gen_vk_format_table.py:
# Code generation for vk format map. See vk_format_map.json for data source.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
import json
@@ -65,20 +66,20 @@ break;
format_entry_template = """case angle::FormatID::{format_id}:
internalFormat = {internal_format};
-{texture_template}
+{image_template}
{buffer_template}
break;
"""
-texture_basic_template = """textureFormatID = {texture};
-vkTextureFormat = {vk_texture_format};
-textureInitializerFunction = {texture_initializer};"""
+image_basic_template = """imageFormatID = {image};
+vkImageFormat = {vk_image_format};
+imageInitializerFunction = {image_initializer};"""
-texture_struct_template="{{{texture}, {vk_texture_format}, {texture_initializer}}}"
+image_struct_template="{{{image}, {vk_image_format}, {image_initializer}}}"
-texture_fallback_template = """{{
-static constexpr TextureFormatInitInfo kInfo[] = {{{texture_list}}};
-initTextureFallback(renderer, kInfo, ArraySize(kInfo));
+image_fallback_template = """{{
+static constexpr ImageFormatInitInfo kInfo[] = {{{image_list}}};
+initImageFallback(renderer, kInfo, ArraySize(kInfo));
}}"""
buffer_basic_template = """bufferFormatID = {buffer};
@@ -95,89 +96,115 @@ static constexpr BufferFormatInitInfo kInfo[] = {{{buffer_list}}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}}"""
+
def is_packed(format_id):
- return "true" if "_PACK" in format_id else "false"
+ return "true" if "_PACK" in format_id else "false"
def gen_format_case(angle, internal_format, vk_json_data):
- vk_map = vk_json_data["map"]
- vk_overrides = vk_json_data["overrides"]
- vk_fallbacks = vk_json_data["fallbacks"]
- args = dict(
- format_id=angle,
- internal_format=internal_format,
- texture_template="",
- buffer_template="")
-
- if ((angle not in vk_map) and (angle not in vk_overrides) and
- (angle not in vk_fallbacks)) or angle == 'NONE':
- return empty_format_entry_template.format(**args)
-
- def get_formats(format, type):
- format = vk_overrides.get(format, {}).get(type, format)
- if format not in vk_map:
- return []
- fallbacks = vk_fallbacks.get(format, {}).get(type, [])
- if not isinstance(fallbacks, list):
- fallbacks = [fallbacks]
- return [format] + fallbacks
-
- def texture_args(format):
- return dict(
- texture="angle::FormatID::" + format,
- vk_texture_format=vk_map[format],
- texture_initializer=angle_format.get_internal_format_initializer(
- internal_format, format))
-
- def buffer_args(format):
- return dict(
- buffer="angle::FormatID::" + format,
- vk_buffer_format=vk_map[format],
- vk_buffer_format_is_packed=is_packed(vk_map[format]),
- vertex_load_function=angle_format.get_vertex_copy_function(
- angle, format),
- vertex_load_converts='false' if angle == format else 'true',
- )
-
- textures = get_formats(angle, "texture")
- if len(textures) == 1:
- args.update(texture_template=texture_basic_template)
- args.update(texture_args(textures[0]))
- elif len(textures) > 1:
- args.update(
- texture_template=texture_fallback_template,
- texture_list=", ".join(
- texture_struct_template.format(**texture_args(i))
- for i in textures))
-
- buffers = get_formats(angle, "buffer")
- if len(buffers) == 1:
- args.update(buffer_template=buffer_basic_template)
- args.update(buffer_args(buffers[0]))
- elif len(buffers) > 1:
- args.update(
- buffer_template=buffer_fallback_template,
- buffer_list=", ".join(
- buffer_struct_template.format(**buffer_args(i)) for i in buffers))
-
- return format_entry_template.format(**args).format(**args)
-
-
-input_file_name = 'vk_format_map.json'
-out_file_name = 'vk_format_table'
-
-angle_to_gl = angle_format.load_inverse_table(os.path.join('..', 'angle_format_map.json'))
-vk_json_data = angle_format.load_json(input_file_name)
-vk_cases = [gen_format_case(angle, gl, vk_json_data)
- for angle, gl in sorted(angle_to_gl.iteritems())]
-
-output_cpp = template_table_autogen_cpp.format(
- copyright_year = date.today().year,
- format_case_data = "\n".join(vk_cases),
- script_name = __file__,
- out_file_name = out_file_name,
- input_file_name = input_file_name)
-
-with open(out_file_name + '_autogen.cpp', 'wt') as out_file:
- out_file.write(output_cpp)
- out_file.close()
+ vk_map = vk_json_data["map"]
+ vk_overrides = vk_json_data["overrides"]
+ vk_fallbacks = vk_json_data["fallbacks"]
+ args = dict(
+ format_id=angle,
+ internal_format=internal_format,
+ image_template="",
+ buffer_template="")
+
+ if ((angle not in vk_map) and (angle not in vk_overrides) and
+ (angle not in vk_fallbacks)) or angle == 'NONE':
+ return empty_format_entry_template.format(**args)
+
+ def get_formats(format, type):
+ format = vk_overrides.get(format, {}).get(type, format)
+ if format not in vk_map:
+ return []
+ fallbacks = vk_fallbacks.get(format, {}).get(type, [])
+ if not isinstance(fallbacks, list):
+ fallbacks = [fallbacks]
+ return [format] + fallbacks
+
+ def image_args(format):
+ return dict(
+ image="angle::FormatID::" + format,
+ vk_image_format=vk_map[format],
+ image_initializer=angle_format.get_internal_format_initializer(
+ internal_format, format))
+
+ def buffer_args(format):
+ return dict(
+ buffer="angle::FormatID::" + format,
+ vk_buffer_format=vk_map[format],
+ vk_buffer_format_is_packed=is_packed(vk_map[format]),
+ vertex_load_function=angle_format.get_vertex_copy_function(
+ angle, format),
+ vertex_load_converts='false' if angle == format else 'true',
+ )
+
+ images = get_formats(angle, "image")
+ if len(images) == 1:
+ args.update(image_template=image_basic_template)
+ args.update(image_args(images[0]))
+ elif len(images) > 1:
+ args.update(
+ image_template=image_fallback_template,
+ image_list=", ".join(
+ image_struct_template.format(**image_args(i))
+ for i in images))
+
+ buffers = get_formats(angle, "buffer")
+ if len(buffers) == 1:
+ args.update(buffer_template=buffer_basic_template)
+ args.update(buffer_args(buffers[0]))
+ elif len(buffers) > 1:
+ args.update(
+ buffer_template=buffer_fallback_template,
+ buffer_list=", ".join(
+ buffer_struct_template.format(**buffer_args(i)) for i in buffers))
+
+ return format_entry_template.format(**args).format(**args)
+
+
+def main():
+
+ input_file_name = 'vk_format_map.json'
+ out_file_name = 'vk_format_table_autogen.cpp'
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [
+ '../angle_format.py',
+ '../angle_format_map.json',
+ input_file_name
+ ]
+ outputs = [out_file_name]
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ angle_to_gl = angle_format.load_inverse_table(os.path.join('..', 'angle_format_map.json'))
+ vk_json_data = angle_format.load_json(input_file_name)
+ vk_cases = [gen_format_case(angle, gl, vk_json_data)
+ for angle, gl in sorted(angle_to_gl.iteritems())]
+
+ output_cpp = template_table_autogen_cpp.format(
+ copyright_year = date.today().year,
+ format_case_data = "\n".join(vk_cases),
+ script_name = __file__,
+ out_file_name = out_file_name,
+ input_file_name = input_file_name)
+
+ with open(out_file_name, 'wt') as out_file:
+ out_file.write(output_cpp)
+ out_file.close()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py
index a788a98904a..089395c00ee 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py
@@ -6,10 +6,15 @@
# gen_vk_internal_shaders.py:
# Code generation for internal Vulkan shaders. Should be run when an internal
# shader program is changed, added or removed.
+# Because this script can be slow direct invocation is supported. But before
+# code upload please run scripts/run_code_generation.py.
from datetime import date
+import io
import json
+import multiprocessing
import os
+import platform
import re
import subprocess
import sys
@@ -18,8 +23,11 @@ out_file_cpp = 'vk_internal_shaders_autogen.cpp'
out_file_h = 'vk_internal_shaders_autogen.h'
out_file_gni = 'vk_internal_shaders_autogen.gni'
+is_windows = platform.system() == 'Windows'
+is_linux = platform.system() == 'Linux'
+
# Templates for the generated files:
-template_shader_library_cpp = """// GENERATED FILE - DO NOT EDIT.
+template_shader_library_cpp = u"""// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {input_file_name}
//
// Copyright {copyright_year} The ANGLE Project Authors. All rights reserved.
@@ -91,7 +99,7 @@ void ShaderLibrary::destroy(VkDevice device)
}} // namespace rx
"""
-template_shader_library_h = """// GENERATED FILE - DO NOT EDIT.
+template_shader_library_h = u"""// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {input_file_name}
//
// Copyright {copyright_year} The ANGLE Project Authors. All rights reserved.
@@ -134,7 +142,7 @@ class ShaderLibrary final : angle::NonCopyable
#endif // LIBANGLE_RENDERER_VULKAN_VK_INTERNAL_SHADERS_AUTOGEN_H_
"""
-template_shader_includes_gni = """# GENERATED FILE - DO NOT EDIT.
+template_shader_includes_gni = u"""# GENERATED FILE - DO NOT EDIT.
# Generated by {script_name} using data from {input_file_name}
#
# Copyright {copyright_year} The ANGLE Project Authors. All rights reserved.
@@ -171,21 +179,18 @@ def get_output_path(name):
return os.path.join('shaders', 'gen', name + ".inc")
# Finds a path to GN's out directory
-def find_build_path(path):
- out = os.path.join(path, "out")
- if (os.path.isdir(out)):
- for o in os.listdir(out):
- subdir = os.path.join(out, o)
- if os.path.isdir(subdir):
- argsgn = os.path.join(subdir, "args.gn")
- if os.path.isfile(argsgn):
- return subdir
- else:
- parent = os.path.join(path, "..")
- if (os.path.isdir(parent)):
- return find_build_path(parent)
- else:
- raise Exception("Could not find GN out directory")
+def get_linux_glslang_exe_path():
+ return '../../../../tools/glslang/glslang_validator'
+
+def get_win_glslang_exe_path():
+ return get_linux_glslang_exe_path() + '.exe'
+
+def get_glslang_exe_path():
+ glslang_exe = get_win_glslang_exe_path() if is_windows else get_linux_glslang_exe_path()
+ if not os.path.isfile(glslang_exe):
+ raise Exception('Could not find %s' % glslang_exe)
+ return glslang_exe
+
# Generates the code for a shader blob array entry.
def gen_shader_blob_entry(shader):
@@ -248,48 +253,117 @@ compact_newlines_regex = re.compile(r"\n\s*\n", re.MULTILINE)
def cleanup_preprocessed_shader(shader_text):
return compact_newlines_regex.sub('\n\n', shader_text.strip())
-# STEP 0: Handle inputs/outputs for run_code_generation.py's auto_script
-shaders_dir = os.path.join('shaders', 'src')
-if not os.path.isdir(shaders_dir):
- raise Exception("Could not find shaders directory")
-
-print_inputs = len(sys.argv) == 2 and sys.argv[1] == 'inputs'
-print_outputs = len(sys.argv) == 2 and sys.argv[1] == 'outputs'
-# If an argument X is given that's not inputs or outputs, compile shaders that match *X*.
-# This is useful in development to build only the shader of interest.
-shader_files_to_compile = os.listdir(shaders_dir)
-if not (print_inputs or print_outputs or len(sys.argv) < 2):
- shader_files_to_compile = [f for f in shader_files_to_compile if f.find(sys.argv[1]) != -1]
-
-valid_extensions = ['.vert', '.frag', '.comp']
-input_shaders = sorted([os.path.join(shaders_dir, shader)
- for shader in os.listdir(shaders_dir)
- if any([os.path.splitext(shader)[1] == ext for ext in valid_extensions])])
-if print_inputs:
- print(",".join(input_shaders))
- sys.exit(0)
-
-# STEP 1: Call glslang to generate the internal shaders into small .inc files.
-
-# a) Get the path to the glslang binary from the script directory.
-build_path = find_build_path(".")
-print("Using glslang_validator from '" + build_path + "'")
-result = subprocess.call(['ninja', '-C', build_path, 'glslang_validator'])
-if result != 0:
- raise Exception("Error building glslang_validator")
-
-glslang_binary = 'glslang_validator'
-if os.name == 'nt':
- glslang_binary += '.exe'
-glslang_path = os.path.join(build_path, glslang_binary)
-if not os.path.isfile(glslang_path):
- raise Exception("Could not find " + glslang_binary)
-
-# b) Iterate over the shaders and call glslang with the right arguments.
-output_shaders = []
-
-def compile_variation(shader_file, shader_basename, flags, enums,
- flags_active, enum_indices, flags_bits, enum_bits, do_compile):
+class CompileQueue:
+ class AppendPreprocessorOutput:
+ def __init__(self, shader_file, preprocessor_args, output_path):
+ # Asynchronously launch the preprocessor job.
+ self.process = subprocess.Popen(preprocessor_args,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ # Store the file name for output to be appended to.
+ self.output_path = output_path
+ # Store info for error description.
+ self.shader_file = shader_file
+
+ def wait(self, queue):
+ (out, err) = self.process.communicate()
+ if self.process.returncode == 0:
+ # Append preprocessor output to the output file.
+ with open(self.output_path, 'ab') as incfile:
+ incfile.write('\n\n#if 0 // Generated from:\n')
+ incfile.write(cleanup_preprocessed_shader(out.replace('\r\n', '\n')))
+ incfile.write('\n#endif // Preprocessed code\n')
+ out = None
+ return (out, err, self.process.returncode, None,
+ "Error running preprocessor on " + self.shader_file)
+
+ class CompileToSPIRV:
+ def __init__(self, shader_file, shader_basename, variation_string, output_path,
+ compile_args, preprocessor_args):
+ # Asynchronously launch the compile job.
+ self.process = subprocess.Popen(compile_args,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ # Store info for launching the preprocessor.
+ self.preprocessor_args = preprocessor_args
+ self.output_path = output_path
+ # Store info for job and error description.
+ self.shader_file = shader_file
+ self.shader_basename = shader_basename
+ self.variation_string = variation_string
+
+ def wait(self, queue):
+ (out, err) = self.process.communicate()
+ if self.process.returncode == 0:
+ # Insert the preprocessor job in the queue.
+ queue.append(CompileQueue.AppendPreprocessorOutput(self.shader_file,
+ self.preprocessor_args,
+ self.output_path))
+ # If all the output says is the source file name, don't bother printing it.
+ if out.strip() == self.shader_file:
+ out = None
+ description = self.output_path + ': ' + self.shader_basename + self.variation_string
+ return (out, err, self.process.returncode, description,
+ "Error compiling " + self.shader_file)
+
+ def __init__(self):
+ # Compile with as many CPU threads are detected. Once a shader is compiled, another job is
+ # automatically added to the queue to append the preprocessor output to the generated file.
+ self.queue = []
+ self.thread_count = multiprocessing.cpu_count()
+
+ def _wait_first(self, ignore_output=False):
+ (out, err, returncode, description, exception_description) = self.queue[0].wait(self.queue)
+ self.queue.pop(0)
+ if not ignore_output:
+ if description:
+ print description
+ if out and out.strip():
+ print out.strip()
+ if err and err.strip():
+ print err
+ if returncode != 0:
+ return exception_description
+ return None
+
+ # Wait for all pending tasks. If called after error is detected, ignore_output can be used to
+ # make sure errors in later jobs are suppressed to avoid cluttering the output. This is
+ # because the same compile error is likely present in other variations of the same shader and
+ # outputting the same error multiple times is not useful.
+ def _wait_all(self, ignore_output=False):
+ exception_description = None
+ while len(self.queue) > 0:
+ this_job_exception = self._wait_first(ignore_output)
+ # If encountered an error, keep it to be raised, ignoring errors from following jobs.
+ if this_job_exception and not ignore_output:
+ exception_description = this_job_exception
+ ignore_output = True
+
+ return exception_description
+
+ def add_job(self, shader_file, shader_basename, variation_string, output_path,
+ compile_args, preprocessor_args):
+ # If the queue is full, wait until there is at least one slot available.
+ while len(self.queue) >= self.thread_count:
+ exception = self._wait_first(False)
+ # If encountered an exception, cleanup following jobs and raise it.
+ if exception:
+ self._wait_all(True)
+ raise Exception(exception)
+
+ # Add a compile job
+ self.queue.append(CompileQueue.CompileToSPIRV(shader_file, shader_basename,
+ variation_string, output_path,
+ compile_args, preprocessor_args))
+
+ def finish(self):
+ exception = self._wait_all(False)
+ # If encountered an exception, cleanup following jobs and raise it.
+ if exception is not None:
+ raise Exception(exception)
+
+def compile_variation(glslang_path, compile_queue, shader_file, shader_basename, flags, enums,
+ flags_active, enum_indices, flags_bits, enum_bits, output_shaders):
glslang_args = [glslang_path]
@@ -322,7 +396,7 @@ def compile_variation(shader_file, shader_basename, flags, enums,
output_path = get_output_path(output_name)
output_shaders.append(output_path)
- if do_compile:
+ if glslang_path is not None:
glslang_preprocessor_output_args = glslang_args + ['-E']
glslang_preprocessor_output_args.append(shader_file) # Input GLSL shader
@@ -331,17 +405,8 @@ def compile_variation(shader_file, shader_basename, flags, enums,
glslang_args += ['-o', output_path] # Output file
glslang_args.append(shader_file) # Input GLSL shader
- print output_path + ': ' + shader_basename + variation_string
- result = subprocess.call(glslang_args)
- if result != 0:
- raise Exception("Error compiling " + shader_file)
-
- with open(output_path, 'ab') as incfile:
- shader_text = subprocess.check_output(glslang_preprocessor_output_args)
-
- incfile.write('\n\n#if 0 // Generated from:\n')
- incfile.write(cleanup_preprocessed_shader(shader_text))
- incfile.write('\n#endif // Preprocessed code\n')
+ compile_queue.add_job(shader_file, shader_basename, variation_string, output_path,
+ glslang_args, glslang_preprocessor_output_args)
class ShaderAndVariations:
def __init__(self, shader_file):
@@ -350,40 +415,7 @@ class ShaderAndVariations:
get_variation_bits(self.flags, self.enums)
(self.flags_bits, self.enum_bits) = get_variation_bits(self.flags, self.enums)
-input_shaders_and_variations = [ShaderAndVariations(shader_file) for shader_file in input_shaders]
-
-for shader_and_variation in input_shaders_and_variations:
- shader_file = shader_and_variation.shader_file
- flags = shader_and_variation.flags
- enums = shader_and_variation.enums
- flags_bits = shader_and_variation.flags_bits
- enum_bits = shader_and_variation.enum_bits
-
- # an array where each element i is in [0, len(enums[i])),
- # telling which enum is currently selected
- enum_indices = [0] * len(enums)
-
- output_name = os.path.basename(shader_file)
- while True:
- do_compile = not print_outputs and output_name in shader_files_to_compile
- # a number where each bit says whether a flag is active or not,
- # with values in [0, 2^len(flags))
- for flags_active in range(1 << len(flags)):
- compile_variation(shader_file, output_name, flags, enums,
- flags_active, enum_indices, flags_bits, enum_bits, do_compile)
-
- if not next_enum_variation(enums, enum_indices):
- break
-
-output_shaders = sorted(output_shaders)
-outputs = output_shaders + [out_file_cpp, out_file_h]
-
-if print_outputs:
- print("\n".join(outputs))
- sys.exit(0)
-
-# STEP 2: Consolidate the .inc files into an auto-generated cpp/h library.
def get_variation_definition(shader_and_variation):
shader_file = shader_and_variation.shader_file
flags = shader_and_variation.flags
@@ -516,52 +548,130 @@ def get_destroy_call(shader_and_variation):
destroy += '{\nshader.get().destroy(device);\n}'
return destroy
-with open(out_file_cpp, 'w') as outfile:
- includes = "\n".join([gen_shader_include(shader) for shader in output_shaders])
- shader_tables_cpp = '\n'.join([get_shader_table_cpp(s)
- for s in input_shaders_and_variations])
- shader_destroy_calls = '\n'.join([get_destroy_call(s)
- for s in input_shaders_and_variations])
- shader_get_functions_cpp = '\n'.join([get_get_function_cpp(s)
- for s in input_shaders_and_variations])
-
- outcode = template_shader_library_cpp.format(
- script_name = __file__,
- copyright_year = date.today().year,
- out_file_name = out_file_cpp,
- input_file_name = 'shaders/src/*',
- internal_shader_includes = includes,
- shader_tables_cpp = shader_tables_cpp,
- shader_destroy_calls = shader_destroy_calls,
- shader_get_functions_cpp = shader_get_functions_cpp)
- outfile.write(outcode)
- outfile.close()
-
-with open(out_file_h, 'w') as outfile:
- shader_variation_definitions = '\n'.join([get_variation_definition(s)
- for s in input_shaders_and_variations])
- shader_get_functions_h = '\n'.join([get_get_function_h(s)
- for s in input_shaders_and_variations])
- shader_tables_h = '\n'.join([get_shader_table_h(s)
- for s in input_shaders_and_variations])
- outcode = template_shader_library_h.format(
- script_name = __file__,
- copyright_year = date.today().year,
- out_file_name = out_file_h,
- input_file_name = 'shaders/src/*',
- shader_variation_definitions = shader_variation_definitions,
- shader_get_functions_h = shader_get_functions_h,
- shader_tables_h = shader_tables_h)
- outfile.write(outcode)
- outfile.close()
-
-# STEP 3: Create a gni file with the generated files.
-with open(out_file_gni, 'w') as outfile:
- outcode = template_shader_includes_gni.format(
- script_name = __file__,
- copyright_year = date.today().year,
- out_file_name = out_file_gni,
- input_file_name = 'shaders/src/*',
- shaders_list = ',\n'.join([' "' + slash(shader) + '"' for shader in output_shaders]))
- outfile.write(outcode)
- outfile.close()
+
+def main():
+ # STEP 0: Handle inputs/outputs for run_code_generation.py's auto_script
+ shaders_dir = os.path.join('shaders', 'src')
+ if not os.path.isdir(shaders_dir):
+ raise Exception("Could not find shaders directory")
+
+ print_inputs = len(sys.argv) == 2 and sys.argv[1] == 'inputs'
+ print_outputs = len(sys.argv) == 2 and sys.argv[1] == 'outputs'
+ # If an argument X is given that's not inputs or outputs, compile shaders that match *X*.
+ # This is useful in development to build only the shader of interest.
+ shader_files_to_compile = os.listdir(shaders_dir)
+ if not (print_inputs or print_outputs or len(sys.argv) < 2):
+ shader_files_to_compile = [f for f in shader_files_to_compile if f.find(sys.argv[1]) != -1]
+
+ valid_extensions = ['.vert', '.frag', '.comp']
+ input_shaders = sorted([os.path.join(shaders_dir, shader)
+ for shader in os.listdir(shaders_dir)
+ if any([os.path.splitext(shader)[1] == ext for ext in valid_extensions])])
+ if print_inputs:
+ glslang_binaries = [get_linux_glslang_exe_path(), get_win_glslang_exe_path()]
+ glslang_binary_hashes = [path + '.sha1' for path in glslang_binaries]
+ print(",".join(input_shaders + glslang_binary_hashes))
+ return 0
+
+ # STEP 1: Call glslang to generate the internal shaders into small .inc files.
+ # Iterates over the shaders and call glslang with the right arguments.
+
+ glslang_path = None
+ if not print_outputs:
+ glslang_path = get_glslang_exe_path()
+
+ output_shaders = []
+
+ input_shaders_and_variations = [ShaderAndVariations(shader_file) for shader_file in input_shaders]
+
+ compile_queue = CompileQueue()
+
+ for shader_and_variation in input_shaders_and_variations:
+ shader_file = shader_and_variation.shader_file
+ flags = shader_and_variation.flags
+ enums = shader_and_variation.enums
+ flags_bits = shader_and_variation.flags_bits
+ enum_bits = shader_and_variation.enum_bits
+
+ # an array where each element i is in [0, len(enums[i])),
+ # telling which enum is currently selected
+ enum_indices = [0] * len(enums)
+
+ output_name = os.path.basename(shader_file)
+
+ while True:
+ do_compile = not print_outputs and output_name in shader_files_to_compile
+ # a number where each bit says whether a flag is active or not,
+ # with values in [0, 2^len(flags))
+ for flags_active in range(1 << len(flags)):
+ compile_variation(glslang_path, compile_queue, shader_file, output_name, flags,
+ enums, flags_active, enum_indices, flags_bits, enum_bits, output_shaders)
+
+ if not next_enum_variation(enums, enum_indices):
+ break
+
+ output_shaders = sorted(output_shaders)
+ outputs = output_shaders + [out_file_cpp, out_file_h]
+
+ if print_outputs:
+ print(','.join(outputs))
+ return 0
+
+ compile_queue.finish()
+
+ # STEP 2: Consolidate the .inc files into an auto-generated cpp/h library.
+ with open(out_file_cpp, 'w') as outfile:
+ includes = "\n".join([gen_shader_include(shader) for shader in output_shaders])
+ shader_tables_cpp = '\n'.join([get_shader_table_cpp(s)
+ for s in input_shaders_and_variations])
+ shader_destroy_calls = '\n'.join([get_destroy_call(s)
+ for s in input_shaders_and_variations])
+ shader_get_functions_cpp = '\n'.join([get_get_function_cpp(s)
+ for s in input_shaders_and_variations])
+
+ outcode = template_shader_library_cpp.format(
+ script_name = __file__,
+ copyright_year = date.today().year,
+ out_file_name = out_file_cpp,
+ input_file_name = 'shaders/src/*',
+ internal_shader_includes = includes,
+ shader_tables_cpp = shader_tables_cpp,
+ shader_destroy_calls = shader_destroy_calls,
+ shader_get_functions_cpp = shader_get_functions_cpp)
+ outfile.write(outcode)
+ outfile.close()
+
+ with open(out_file_h, 'w') as outfile:
+ shader_variation_definitions = '\n'.join([get_variation_definition(s)
+ for s in input_shaders_and_variations])
+ shader_get_functions_h = '\n'.join([get_get_function_h(s)
+ for s in input_shaders_and_variations])
+ shader_tables_h = '\n'.join([get_shader_table_h(s)
+ for s in input_shaders_and_variations])
+ outcode = template_shader_library_h.format(
+ script_name = __file__,
+ copyright_year = date.today().year,
+ out_file_name = out_file_h,
+ input_file_name = 'shaders/src/*',
+ shader_variation_definitions = shader_variation_definitions,
+ shader_get_functions_h = shader_get_functions_h,
+ shader_tables_h = shader_tables_h)
+ outfile.write(outcode)
+ outfile.close()
+
+ # STEP 3: Create a gni file with the generated files.
+ with io.open(out_file_gni, 'w', newline='\n') as outfile:
+ outcode = template_shader_includes_gni.format(
+ script_name = __file__,
+ copyright_year = date.today().year,
+ out_file_name = out_file_gni,
+ input_file_name = 'shaders/src/*',
+ shaders_list = ',\n'.join([' "' + slash(shader) + '"' for shader in output_shaders]))
+ outfile.write(outcode)
+ outfile.close()
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py
index bdf08e4c251..6a8953bf22a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py
@@ -5,6 +5,7 @@
#
# gen_vk_mandatory_format_support_table.py:
# Code generation for mandatory formats supported by Vulkan.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
from datetime import date
import sys
@@ -85,30 +86,56 @@ def gen_format_case(index, vk_to_index_to_format_map, vk_map):
buffer_features = buffer_features_str)
-input_file_name = 'vk_mandatory_format_support_data.json'
-out_file_name = 'vk_mandatory_format_support_table'
-
-tree = etree.parse(script_relative('../../../../third_party/vulkan-headers/src/registry/vk.xml'))
-root = tree.getroot()
-vk_format_enums = root.findall(".//enums[@name='VkFormat']/enum")
-vk_format_name_to_index_map = {}
-num_formats = len(vk_format_enums)
-for format_enum in vk_format_enums:
- index = int(format_enum.attrib['value'])
- vk_format = format_enum.attrib['name']
- vk_format_name_to_index_map[index] = vk_format
-
-vk_map = angle_format.load_json(input_file_name)
-vk_cases = [gen_format_case(index, vk_format_name_to_index_map, vk_map) for index in vk_format_name_to_index_map]
-
-output_cpp = template_table_autogen_cpp.format(
- copyright_year = date.today().year,
- num_formats = num_formats,
- format_case_data = "\n,".join(vk_cases),
- script_name = __file__,
- out_file_name = out_file_name,
- input_file_name = input_file_name)
-
-with open(out_file_name + '_autogen.cpp', 'wt') as out_file:
- out_file.write(output_cpp)
- out_file.close()
+def main():
+
+ input_file_name = 'vk_mandatory_format_support_data.json'
+ out_file_name = 'vk_mandatory_format_support_table_autogen.cpp'
+ vk_xml_file = '../../../../third_party/vulkan-headers/src/registry/vk.xml'
+
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [
+ '../angle_format.py',
+ input_file_name,
+ vk_xml_file,
+ ]
+ outputs = [out_file_name]
+
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
+ else:
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ tree = etree.parse(script_relative(vk_xml_file))
+ root = tree.getroot()
+ vk_format_enums = root.findall(".//enums[@name='VkFormat']/enum")
+ vk_format_name_to_index_map = {}
+ num_formats = len(vk_format_enums)
+ for format_enum in vk_format_enums:
+ index = int(format_enum.attrib['value'])
+ vk_format = format_enum.attrib['name']
+ vk_format_name_to_index_map[index] = vk_format
+
+ vk_map = angle_format.load_json(input_file_name)
+ vk_cases = [gen_format_case(index, vk_format_name_to_index_map, vk_map) for index in vk_format_name_to_index_map]
+
+ output_cpp = template_table_autogen_cpp.format(
+ copyright_year = date.today().year,
+ num_formats = num_formats,
+ format_case_data = "\n,".join(vk_cases),
+ script_name = __file__,
+ out_file_name = out_file_name,
+ input_file_name = input_file_name)
+
+ with open(out_file_name, 'wt') as out_file:
+ out_file.write(output_cpp)
+ out_file.close()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc
index 26e88991710..339e587cc91 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000000[] = {
0x07230203,0x00010000,0x00080007,0x0000003d,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc
index 5dc1bc16ca7..2c8fb027f63 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000001[] = {
0x07230203,0x00010000,0x00080007,0x00000033,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc
index 4352b12248b..c43d610ace9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000002[] = {
0x07230203,0x00010000,0x00080007,0x00000041,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc
index 25398d01a2b..d58ee720169 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000003[] = {
0x07230203,0x00010000,0x00080007,0x00000037,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc
index 1cb9be17e1d..ce2723af6ee 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000004[] = {
0x07230203,0x00010000,0x00080007,0x0000003c,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc
index c0b1c08cb6b..3c7603beedd 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000005[] = {
0x07230203,0x00010000,0x00080007,0x00000032,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc
index 46ba12c18ae..c5a57e68725 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000006[] = {
0x07230203,0x00010000,0x00080007,0x00000040,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc
index e7198c6935f..233a778c26e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000007[] = {
0x07230203,0x00010000,0x00080007,0x00000036,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc
index b7d5016f4f1..f95764427f0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000008[] = {
0x07230203,0x00010000,0x00080007,0x0000003c,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc
index ff0dfac67c1..0c4a9339e27 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_00000009[] = {
0x07230203,0x00010000,0x00080007,0x00000032,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc
index 9fd54b99473..8188a49e36a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_0000000A[] = {
0x07230203,0x00010000,0x00080007,0x00000040,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc
index 1cd217b941c..860360f0833 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kBufferUtils_comp_0000000B[] = {
0x07230203,0x00010000,0x00080007,0x00000036,0x00000000,0x00020011,0x00000001,0x00020011,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc
index 673d9985d58..8412d75f19e 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000000[] = {
0x07230203,0x00010000,0x00080007,0x00000134,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc
index 9bd7b23d708..1d4d83f73ed 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000001[] = {
0x07230203,0x00010000,0x00080007,0x00000125,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc
index a26780091ba..7dcdb1cf9c0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000002[] = {
0x07230203,0x00010000,0x00080007,0x0000011d,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc
index ca363e347ec..beefdfa5641 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000003[] = {
0x07230203,0x00010000,0x00080007,0x0000010e,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc
index 1b55c6dcd87..3528b0e38bf 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000004[] = {
0x07230203,0x00010000,0x00080007,0x000000f4,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc
index 6ca238ccecc..8eb07456ae7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000005[] = {
0x07230203,0x00010000,0x00080007,0x000000e5,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc
index 921d21a405b..f0911cf9c4a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000006[] = {
0x07230203,0x00010000,0x00080007,0x000000e0,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc
index e3100fa75e3..ecfa2c9f878 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000007[] = {
0x07230203,0x00010000,0x00080007,0x000000d1,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc
index b91eefc5f43..95348d36ef9 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000008[] = {
0x07230203,0x00010000,0x00080007,0x000000fe,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc
index 6383a9c8089..30631b9b38c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_00000009[] = {
0x07230203,0x00010000,0x00080007,0x000000ef,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc
index 94c98d067c0..b7025792f35 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_0000000A[] = {
0x07230203,0x00010000,0x00080007,0x000000e6,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc
index b59d9af70b8..7ec92b1e428 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_0000000B[] = {
0x07230203,0x00010000,0x00080007,0x000000d7,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc
index 42951252b02..2ae28d63954 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_0000000C[] = {
0x07230203,0x00010000,0x00080007,0x000000de,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc
index 1a05c75a80e..9d0ed4e11b5 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_0000000D[] = {
0x07230203,0x00010000,0x00080007,0x000000cf,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc
index c0334680958..20ccfc9d167 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_0000000E[] = {
0x07230203,0x00010000,0x00080007,0x000000d9,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc
index 6a332fa8d4f..774bc795d83 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kConvertVertex_comp_0000000F[] = {
0x07230203,0x00010000,0x00080007,0x000000ca,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc
index 941a5ef07c8..7338fb2763d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc
@@ -1,7 +1,7 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kFullScreenQuad_vert_00000000[] = {
- 0x07230203,0x00010000,0x00080007,0x00000024,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x07230203,0x00010000,0x00080007,0x00000028,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000001b,0x00030003,
0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00060005,0x0000000b,
@@ -19,37 +19,39 @@ const uint32_t kFullScreenQuad_vert_00000000[] = {
0x0004002b,0x00000008,0x00000009,0x00000001,0x0004001c,0x0000000a,0x00000006,0x00000009,
0x0006001e,0x0000000b,0x00000007,0x00000006,0x0000000a,0x0000000a,0x00040020,0x0000000c,
0x00000003,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000003,0x00040015,0x0000000e,
- 0x00000020,0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x0004002b,0x00000008,
- 0x00000010,0x00000006,0x0004001c,0x00000011,0x00000007,0x00000010,0x0004002b,0x00000006,
- 0x00000012,0xbf800000,0x0004002b,0x00000006,0x00000013,0x3f800000,0x0004002b,0x00000006,
- 0x00000014,0x00000000,0x0007002c,0x00000007,0x00000015,0x00000012,0x00000013,0x00000014,
- 0x00000013,0x0007002c,0x00000007,0x00000016,0x00000012,0x00000012,0x00000014,0x00000013,
- 0x0007002c,0x00000007,0x00000017,0x00000013,0x00000012,0x00000014,0x00000013,0x0007002c,
- 0x00000007,0x00000018,0x00000013,0x00000013,0x00000014,0x00000013,0x0009002c,0x00000011,
+ 0x00000020,0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040017,0x00000010,
+ 0x00000006,0x00000002,0x0004002b,0x00000008,0x00000011,0x00000006,0x0004001c,0x00000012,
+ 0x00000010,0x00000011,0x0004002b,0x00000006,0x00000013,0xbf800000,0x0004002b,0x00000006,
+ 0x00000014,0x3f800000,0x0005002c,0x00000010,0x00000015,0x00000013,0x00000014,0x0005002c,
+ 0x00000010,0x00000016,0x00000013,0x00000013,0x0005002c,0x00000010,0x00000017,0x00000014,
+ 0x00000013,0x0005002c,0x00000010,0x00000018,0x00000014,0x00000014,0x0009002c,0x00000012,
0x00000019,0x00000015,0x00000016,0x00000017,0x00000015,0x00000017,0x00000018,0x00040020,
0x0000001a,0x00000001,0x0000000e,0x0004003b,0x0000001a,0x0000001b,0x00000001,0x00040020,
- 0x0000001d,0x00000007,0x00000011,0x00040020,0x0000001f,0x00000007,0x00000007,0x00040020,
- 0x00000022,0x00000003,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,
- 0x000200f8,0x00000005,0x0004003b,0x0000001d,0x0000001e,0x00000007,0x0004003d,0x0000000e,
- 0x0000001c,0x0000001b,0x0003003e,0x0000001e,0x00000019,0x00050041,0x0000001f,0x00000020,
- 0x0000001e,0x0000001c,0x0004003d,0x00000007,0x00000021,0x00000020,0x00050041,0x00000022,
- 0x00000023,0x0000000d,0x0000000f,0x0003003e,0x00000023,0x00000021,0x000100fd,0x00010038
+ 0x0000001d,0x00000007,0x00000012,0x00040020,0x0000001f,0x00000007,0x00000010,0x0004002b,
+ 0x00000006,0x00000022,0x00000000,0x00040020,0x00000026,0x00000003,0x00000007,0x00050036,
+ 0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x0000001d,
+ 0x0000001e,0x00000007,0x0004003d,0x0000000e,0x0000001c,0x0000001b,0x0003003e,0x0000001e,
+ 0x00000019,0x00050041,0x0000001f,0x00000020,0x0000001e,0x0000001c,0x0004003d,0x00000010,
+ 0x00000021,0x00000020,0x00050051,0x00000006,0x00000023,0x00000021,0x00000000,0x00050051,
+ 0x00000006,0x00000024,0x00000021,0x00000001,0x00070050,0x00000007,0x00000025,0x00000023,
+ 0x00000024,0x00000022,0x00000014,0x00050041,0x00000026,0x00000027,0x0000000d,0x0000000f,
+ 0x0003003e,0x00000027,0x00000025,0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
-const vec4 kQuadVertices[]= {
- vec4(- 1, 1, 0, 1),
- vec4(- 1, - 1, 0, 1),
- vec4(1, - 1, 0, 1),
- vec4(- 1, 1, 0, 1),
- vec4(1, - 1, 0, 1),
- vec4(1, 1, 0, 1),
+const vec2 kQuadVertices[]= {
+ vec2(- 1, 1),
+ vec2(- 1, - 1),
+ vec2(1, - 1),
+ vec2(- 1, 1),
+ vec2(1, - 1),
+ vec2(1, 1),
};
void main()
{
- gl_Position = kQuadVertices[gl_VertexIndex];
+ gl_Position = vec4(kQuadVertices[gl_VertexIndex], 0, 1);
}
#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc
index 40a3c04e2d5..6dd932b19e2 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageClear_frag_00000000[] = {
0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
@@ -24,7 +24,7 @@ const uint32_t kImageClear_frag_00000000[] = {
#version 450 core
layout(push_constant)uniform PushConstants {
- vec4 clearColor;
+ vec4 clearColor;
} params;
layout(location = 0)out vec4 colorOut;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc
new file mode 100644
index 00000000000..5188be90135
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000001[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000001,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
+ 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
+ 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,0x00000007,
+ 0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000009,
+ 0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,0x00000000,
+ 0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,
+ 0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,0x0000000e,
+ 0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,0x000100fd,
+ 0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ vec4 clearColor;
+} params;
+
+layout(location = 1)out vec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc
new file mode 100644
index 00000000000..cefdd551b44
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000002[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000002,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
+ 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
+ 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,0x00000007,
+ 0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000009,
+ 0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,0x00000000,
+ 0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,
+ 0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,0x0000000e,
+ 0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,0x000100fd,
+ 0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ vec4 clearColor;
+} params;
+
+layout(location = 2)out vec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc
new file mode 100644
index 00000000000..e936055abf8
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000003[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000003,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
+ 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
+ 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,0x00000007,
+ 0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000009,
+ 0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,0x00000000,
+ 0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,
+ 0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,0x0000000e,
+ 0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,0x000100fd,
+ 0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ vec4 clearColor;
+} params;
+
+layout(location = 3)out vec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc
new file mode 100644
index 00000000000..a77e9bfa80e
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000004[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000004,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
+ 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
+ 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,0x00000007,
+ 0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000009,
+ 0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,0x00000000,
+ 0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,
+ 0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,0x0000000e,
+ 0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,0x000100fd,
+ 0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ vec4 clearColor;
+} params;
+
+layout(location = 4)out vec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc
new file mode 100644
index 00000000000..1aae4816275
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000005[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000005,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
+ 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
+ 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,0x00000007,
+ 0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000009,
+ 0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,0x00000000,
+ 0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,
+ 0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,0x0000000e,
+ 0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,0x000100fd,
+ 0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ vec4 clearColor;
+} params;
+
+layout(location = 5)out vec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc
new file mode 100644
index 00000000000..bd1e5d24a3f
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000006[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000006,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
+ 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
+ 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,0x00000007,
+ 0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000009,
+ 0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,0x00000000,
+ 0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,
+ 0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,0x0000000e,
+ 0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,0x000100fd,
+ 0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ vec4 clearColor;
+} params;
+
+layout(location = 6)out vec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc
new file mode 100644
index 00000000000..b5f34b10aea
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000007[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000007,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
+ 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003,
+ 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,0x00000007,
+ 0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,0x00000009,
+ 0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,0x00000000,
+ 0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,
+ 0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,0x0000000e,
+ 0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,0x000100fd,
+ 0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ vec4 clearColor;
+} params;
+
+layout(location = 7)out vec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc
new file mode 100644
index 00000000000..4da1be756a8
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000008[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000000,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 0)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc
new file mode 100644
index 00000000000..d8a7135a081
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000009[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000001,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 1)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc
new file mode 100644
index 00000000000..41d23578438
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_0000000A[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000002,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 2)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc
new file mode 100644
index 00000000000..f0a17ab1f26
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_0000000B[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000003,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 3)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc
new file mode 100644
index 00000000000..06c8fefa3b1
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_0000000C[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000004,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 4)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc
new file mode 100644
index 00000000000..84c5706413f
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_0000000D[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000005,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 5)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc
new file mode 100644
index 00000000000..e1402d2ecdf
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_0000000E[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000006,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 6)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc
new file mode 100644
index 00000000000..c866f6fa2e6
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc
@@ -0,0 +1,35 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_0000000F[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000011,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000007,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x0004002b,0x00000006,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000009,
+ 0x00000007,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
+ 0x00050041,0x0000000e,0x0000000f,0x0000000c,0x0000000d,0x0004003d,0x00000007,0x00000010,
+ 0x0000000f,0x0003003e,0x00000009,0x00000010,0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ ivec4 clearColor;
+} params;
+
+layout(location = 7)out ivec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc
new file mode 100644
index 00000000000..7a5192219a7
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000010[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000000,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 0)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc
new file mode 100644
index 00000000000..8b4df0eba65
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000011[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000001,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 1)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc
new file mode 100644
index 00000000000..2f04fb4f532
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000012[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000002,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 2)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc
new file mode 100644
index 00000000000..513bbc5094b
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000013[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000003,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 3)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc
new file mode 100644
index 00000000000..53ab0813664
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000014[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000004,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 4)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc
new file mode 100644
index 00000000000..f8157cd06fc
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000015[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000005,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 5)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc
new file mode 100644
index 00000000000..f6fd93bb7e2
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000016[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000006,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 6)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc
new file mode 100644
index 00000000000..5d57bba79c8
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc
@@ -0,0 +1,36 @@
+ // 7.11.3188
+ #pragma once
+const uint32_t kImageClear_frag_00000017[] = {
+ 0x07230203,0x00010000,0x00080007,0x00000012,0x00000000,0x00020011,0x00000001,0x0006000b,
+ 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
+ 0x0006000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x00030010,0x00000004,
+ 0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,
+ 0x00050005,0x00000009,0x6f6c6f63,0x74754f72,0x00000000,0x00060005,0x0000000a,0x68737550,
+ 0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000a,0x00000000,0x61656c63,0x6c6f4372,
+ 0x0000726f,0x00040005,0x0000000c,0x61726170,0x0000736d,0x00040047,0x00000009,0x0000001e,
+ 0x00000007,0x00050048,0x0000000a,0x00000000,0x00000023,0x00000000,0x00030047,0x0000000a,
+ 0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
+ 0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,
+ 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x0003001e,0x0000000a,
+ 0x00000007,0x00040020,0x0000000b,0x00000009,0x0000000a,0x0004003b,0x0000000b,0x0000000c,
+ 0x00000009,0x00040015,0x0000000d,0x00000020,0x00000001,0x0004002b,0x0000000d,0x0000000e,
+ 0x00000000,0x00040020,0x0000000f,0x00000009,0x00000007,0x00050036,0x00000002,0x00000004,
+ 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x0000000f,0x00000010,0x0000000c,
+ 0x0000000e,0x0004003d,0x00000007,0x00000011,0x00000010,0x0003003e,0x00000009,0x00000011,
+ 0x000100fd,0x00010038
+};
+
+#if 0 // Generated from:
+#version 450 core
+
+layout(push_constant)uniform PushConstants {
+ uvec4 clearColor;
+} params;
+
+layout(location = 7)out uvec4 colorOut;
+
+void main()
+{
+ colorOut = params . clearColor;
+}
+#endif // Preprocessed code
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc
index 964ad0dd9d8..2219c1e0bfa 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000000[] = {
0x07230203,0x00010000,0x00080007,0x00000099,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc
index 17e15d9874f..a6dfa752a24 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000001[] = {
0x07230203,0x00010000,0x00080007,0x000000a0,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc
index 714a94982bf..e4200ae3e50 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000002[] = {
0x07230203,0x00010000,0x00080007,0x00000098,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc
index d41942a988e..6acc4d019bc 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000003.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000003[] = {
0x07230203,0x00010000,0x00080007,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc
index 5a09703744c..1e03fe67916 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000004[] = {
0x07230203,0x00010000,0x00080007,0x00000099,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc
index 5218612ada1..e1ce83d2eb3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000005[] = {
0x07230203,0x00010000,0x00080007,0x000000a0,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc
index 66546cd862c..0bfe24898ff 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000008[] = {
0x07230203,0x00010000,0x00080007,0x00000096,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc
index f5ef88c17b2..9a093090d5a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000009[] = {
0x07230203,0x00010000,0x00080007,0x0000009d,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc
index a55e00bcfcf..ced6bb3ee21 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_0000000A[] = {
0x07230203,0x00010000,0x00080007,0x00000098,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc
index e15667c0f8f..65422bb6791 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000B.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_0000000B[] = {
0x07230203,0x00010000,0x00080007,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc
index 20ad3035f04..6bfeb07b3c0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_0000000C[] = {
0x07230203,0x00010000,0x00080007,0x00000097,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc
index 1479479cd5c..eecb097eb06 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_0000000D[] = {
0x07230203,0x00010000,0x00080007,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc
index 95592aab558..de27e5a028c 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000010[] = {
0x07230203,0x00010000,0x00080007,0x00000098,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc
index ceb273476a6..c8b4b2191a7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000011[] = {
0x07230203,0x00010000,0x00080007,0x0000009f,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc
index 4fa47179717..a18a5c7c422 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000012[] = {
0x07230203,0x00010000,0x00080007,0x00000098,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc
index 2ef84907c76..24c4efdbff0 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000013[] = {
0x07230203,0x00010000,0x00080007,0x0000009e,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc
index b54694e6770..3f2e0fb8a12 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000014[] = {
0x07230203,0x00010000,0x00080007,0x0000009a,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc
index 0dba87ac202..0ff3b118b84 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc
@@ -1,4 +1,4 @@
- // 7.11.3009
+ // 7.11.3188
#pragma once
const uint32_t kImageCopy_frag_00000015[] = {
0x07230203,0x00010000,0x00080007,0x000000a1,0x00000000,0x00020011,0x00000001,0x0006000b,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert
index 33faa6e7a7b..dec63e95625 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert
@@ -7,16 +7,16 @@
#version 450 core
-const vec4 kQuadVertices[] = {
- vec4(-1, 1, 0, 1),
- vec4(-1, -1, 0, 1),
- vec4(1, -1, 0, 1),
- vec4(-1, 1, 0, 1),
- vec4(1, -1, 0, 1),
- vec4(1, 1, 0, 1),
+const vec2 kQuadVertices[] = {
+ vec2(-1, 1),
+ vec2(-1, -1),
+ vec2(1, -1),
+ vec2(-1, 1),
+ vec2(1, -1),
+ vec2(1, 1),
};
void main()
{
- gl_Position = kQuadVertices[gl_VertexIndex];
+ gl_Position = vec4(kQuadVertices[gl_VertexIndex], 0, 1);
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag
index 347f1826cb7..cba0ef4316f 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag
@@ -1,5 +1,5 @@
//
-// Copyright 2018 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.
//
@@ -7,11 +7,41 @@
#version 450 core
+#if IsFloat
+#define Type vec4
+#elif IsInt
+#define Type ivec4
+#elif IsUint
+#define Type uvec4
+#else
+#error "Not all formats are accounted for"
+#endif
+
+#if Attachment0
+#define ATTACHMENT 0
+#elif Attachment1
+#define ATTACHMENT 1
+#elif Attachment2
+#define ATTACHMENT 2
+#elif Attachment3
+#define ATTACHMENT 3
+#elif Attachment4
+#define ATTACHMENT 4
+#elif Attachment5
+#define ATTACHMENT 5
+#elif Attachment6
+#define ATTACHMENT 6
+#elif Attachment7
+#define ATTACHMENT 7
+#else
+#error "Not all attachment index possibilities are accounted for"
+#endif
+
layout(push_constant) uniform PushConstants {
- vec4 clearColor;
+ Type clearColor;
} params;
-layout(location = 0) out vec4 colorOut;
+layout(location = ATTACHMENT) out Type colorOut;
void main()
{
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag.json b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag.json
new file mode 100644
index 00000000000..94238b85042
--- /dev/null
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag.json
@@ -0,0 +1,24 @@
+{
+ "Description": [
+ "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.",
+ "",
+ "ImageClear.frag.json: Build parameters for ImageClear.frag."
+ ],
+ "AttachmentIndex": [
+ "Attachment0",
+ "Attachment1",
+ "Attachment2",
+ "Attachment3",
+ "Attachment4",
+ "Attachment5",
+ "Attachment6",
+ "Attachment7"
+ ],
+ "Format": [
+ "IsFloat",
+ "IsInt",
+ "IsUint"
+ ]
+}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag
index f77c82e15a2..41212ba7fc6 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag
@@ -37,7 +37,7 @@
#elif DestIsUint
#define DestType uvec4
#else
-#error "Not all destinatoin formats are accounted for"
+#error "Not all destination formats are accounted for"
#endif
layout(set = 0, binding = 0) uniform SRC_RESOURCE(SRC_RESOURCE_NAME) src;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
index cc3055a640c..92bc6ecfd90 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.cpp
@@ -85,7 +85,7 @@ uint8_t PackGLBlendFactor(GLenum blendFactor)
}
}
-uint8_t PackGLStencilOp(GLenum compareOp)
+VkStencilOp PackGLStencilOp(GLenum compareOp)
{
switch (compareOp)
{
@@ -107,11 +107,11 @@ uint8_t PackGLStencilOp(GLenum compareOp)
return VK_STENCIL_OP_INVERT;
default:
UNREACHABLE();
- return 0;
+ return VK_STENCIL_OP_KEEP;
}
}
-uint8_t PackGLCompareFunc(GLenum compareFunc)
+VkCompareOp PackGLCompareFunc(GLenum compareFunc)
{
switch (compareFunc)
{
@@ -133,7 +133,7 @@ uint8_t PackGLCompareFunc(GLenum compareFunc)
return VK_COMPARE_OP_NOT_EQUAL;
default:
UNREACHABLE();
- return 0;
+ return VK_COMPARE_OP_NEVER;
}
}
@@ -144,7 +144,7 @@ void UnpackAttachmentDesc(VkAttachmentDescription *desc,
{
// We would only need this flag for duplicated attachments. Apply it conservatively.
desc->flags = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT;
- desc->format = format.vkTextureFormat;
+ desc->format = format.vkImageFormat;
desc->samples = gl_vk::GetSamples(samples);
desc->loadOp = static_cast<VkAttachmentLoadOp>(ops.loadOp);
desc->storeOp = static_cast<VkAttachmentStoreOp>(ops.storeOp);
@@ -187,7 +187,7 @@ angle::Result InitializeRenderPassFromDesc(vk::Context *context,
// Unpack the packed and split representation into the format required by Vulkan.
gl::DrawBuffersVector<VkAttachmentReference> colorAttachmentRefs;
- VkAttachmentReference depthStencilAttachmentRef = {};
+ VkAttachmentReference depthStencilAttachmentRef = {VK_ATTACHMENT_UNUSED};
gl::AttachmentArray<VkAttachmentDescription> attachmentDescs;
for (uint32_t attachmentIndex = 0; attachmentIndex < attachmentCount; ++attachmentIndex)
{
@@ -205,7 +205,7 @@ angle::Result InitializeRenderPassFromDesc(vk::Context *context,
}
else
{
- ASSERT(depthStencilAttachmentRef.attachment == 0);
+ ASSERT(depthStencilAttachmentRef.attachment == VK_ATTACHMENT_UNUSED);
depthStencilAttachmentRef.attachment = attachmentIndex;
depthStencilAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
}
@@ -224,7 +224,8 @@ angle::Result InitializeRenderPassFromDesc(vk::Context *context,
subpassDesc.pColorAttachments = colorAttachmentRefs.data();
subpassDesc.pResolveAttachments = nullptr;
subpassDesc.pDepthStencilAttachment =
- (depthStencilAttachmentRef.attachment > 0 ? &depthStencilAttachmentRef : nullptr);
+ (depthStencilAttachmentRef.attachment != VK_ATTACHMENT_UNUSED ? &depthStencilAttachmentRef
+ : nullptr);
subpassDesc.preserveAttachmentCount = 0;
subpassDesc.pPreserveAttachments = nullptr;
@@ -493,11 +494,11 @@ angle::Result GraphicsPipelineDesc::initializePipeline(
const RenderPass &compatibleRenderPass,
const PipelineLayout &pipelineLayout,
const gl::AttributesMask &activeAttribLocationsMask,
- const ShaderModule &vertexModule,
- const ShaderModule &fragmentModule,
+ const ShaderModule *vertexModule,
+ const ShaderModule *fragmentModule,
Pipeline *pipelineOut) const
{
- VkPipelineShaderStageCreateInfo shaderStages[2] = {};
+ angle::FixedVector<VkPipelineShaderStageCreateInfo, 2> shaderStages;
VkPipelineVertexInputStateCreateInfo vertexInputState = {};
VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = {};
VkPipelineViewportStateCreateInfo viewportState = {};
@@ -509,19 +510,29 @@ angle::Result GraphicsPipelineDesc::initializePipeline(
VkPipelineColorBlendStateCreateInfo blendState = {};
VkGraphicsPipelineCreateInfo createInfo = {};
- shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- shaderStages[0].flags = 0;
- shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
- shaderStages[0].module = vertexModule.getHandle();
- shaderStages[0].pName = "main";
- shaderStages[0].pSpecializationInfo = nullptr;
-
- shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- shaderStages[1].flags = 0;
- shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
- shaderStages[1].module = fragmentModule.getHandle();
- shaderStages[1].pName = "main";
- shaderStages[1].pSpecializationInfo = nullptr;
+ // Vertex shader is always expected to be present.
+ ASSERT(vertexModule != nullptr);
+ VkPipelineShaderStageCreateInfo vertexStage = {};
+ vertexStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ vertexStage.flags = 0;
+ vertexStage.stage = VK_SHADER_STAGE_VERTEX_BIT;
+ vertexStage.module = vertexModule->getHandle();
+ vertexStage.pName = "main";
+ vertexStage.pSpecializationInfo = nullptr;
+ shaderStages.push_back(vertexStage);
+
+ // Fragment shader is optional.
+ if (fragmentModule)
+ {
+ VkPipelineShaderStageCreateInfo fragmentStage = {};
+ fragmentStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ fragmentStage.flags = 0;
+ fragmentStage.stage = VK_SHADER_STAGE_FRAGMENT_BIT;
+ fragmentStage.module = fragmentModule->getHandle();
+ fragmentStage.pName = "main";
+ fragmentStage.pSpecializationInfo = nullptr;
+ shaderStages.push_back(fragmentStage);
+ }
// TODO(jmadill): Possibly use different path for ES 3.1 split bindings/attribs.
gl::AttribArray<VkVertexInputBindingDescription> bindingDescs;
@@ -549,8 +560,8 @@ angle::Result GraphicsPipelineDesc::initializePipeline(
VkVertexInputAttributeDescription &attribDesc = attributeDescs[vertexAttribCount];
const PackedAttribDesc &packedAttrib = mVertexInputAttribs.attribs[attribIndex];
- bindingDesc.binding = attribIndex;
- bindingDesc.stride = static_cast<uint32_t>(packedAttrib.stride);
+ bindingDesc.binding = attribIndex;
+ bindingDesc.stride = static_cast<uint32_t>(packedAttrib.stride);
if (packedAttrib.divisor != 0)
{
bindingDesc.inputRate = static_cast<VkVertexInputRate>(VK_VERTEX_INPUT_RATE_INSTANCE);
@@ -682,8 +693,8 @@ angle::Result GraphicsPipelineDesc::initializePipeline(
createInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
createInfo.flags = 0;
- createInfo.stageCount = 2;
- createInfo.pStages = shaderStages;
+ createInfo.stageCount = shaderStages.size();
+ createInfo.pStages = shaderStages.data();
createInfo.pVertexInputState = &vertexInputState;
createInfo.pInputAssemblyState = &inputAssemblyState;
createInfo.pTessellationState = nullptr;
@@ -847,6 +858,14 @@ void GraphicsPipelineDesc::setColorWriteMask(VkColorComponentFlags colorComponen
}
}
+void GraphicsPipelineDesc::setSingleColorWriteMask(uint32_t colorIndex,
+ VkColorComponentFlags colorComponentFlags)
+{
+ PackedInputAssemblyAndColorBlendStateInfo &inputAndBlend = mInputAssemblyAndColorBlendStateInfo;
+ uint8_t colorMask = static_cast<uint8_t>(colorComponentFlags);
+ Int4Array_Set(inputAndBlend.colorWriteMaskBits, colorIndex, colorMask);
+}
+
void GraphicsPipelineDesc::updateColorWriteMask(GraphicsPipelineTransitionBits *transition,
VkColorComponentFlags colorComponentFlags,
const gl::DrawBufferMask &alphaMask)
@@ -860,21 +879,86 @@ void GraphicsPipelineDesc::updateColorWriteMask(GraphicsPipelineTransitionBits *
}
}
+void GraphicsPipelineDesc::setDepthTestEnabled(bool enabled)
+{
+ mDepthStencilStateInfo.enable.depthTest = enabled;
+}
+
+void GraphicsPipelineDesc::setDepthWriteEnabled(bool enabled)
+{
+ mDepthStencilStateInfo.enable.depthWrite = enabled;
+}
+
+void GraphicsPipelineDesc::setDepthFunc(VkCompareOp op)
+{
+ SetBitField(mDepthStencilStateInfo.depthCompareOp, op);
+}
+
+void GraphicsPipelineDesc::setStencilTestEnabled(bool enabled)
+{
+ mDepthStencilStateInfo.enable.stencilTest = enabled;
+}
+
+void GraphicsPipelineDesc::setStencilFrontFuncs(uint8_t reference,
+ VkCompareOp compareOp,
+ uint8_t compareMask)
+{
+ mDepthStencilStateInfo.frontStencilReference = reference;
+ mDepthStencilStateInfo.front.compareMask = compareMask;
+ SetBitField(mDepthStencilStateInfo.front.ops.compare, compareOp);
+}
+
+void GraphicsPipelineDesc::setStencilBackFuncs(uint8_t reference,
+ VkCompareOp compareOp,
+ uint8_t compareMask)
+{
+ mDepthStencilStateInfo.backStencilReference = reference;
+ mDepthStencilStateInfo.back.compareMask = compareMask;
+ SetBitField(mDepthStencilStateInfo.back.ops.compare, compareOp);
+}
+
+void GraphicsPipelineDesc::setStencilFrontOps(VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp)
+{
+ SetBitField(mDepthStencilStateInfo.front.ops.fail, failOp);
+ SetBitField(mDepthStencilStateInfo.front.ops.pass, passOp);
+ SetBitField(mDepthStencilStateInfo.front.ops.depthFail, depthFailOp);
+}
+
+void GraphicsPipelineDesc::setStencilBackOps(VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp)
+{
+ SetBitField(mDepthStencilStateInfo.back.ops.fail, failOp);
+ SetBitField(mDepthStencilStateInfo.back.ops.pass, passOp);
+ SetBitField(mDepthStencilStateInfo.back.ops.depthFail, depthFailOp);
+}
+
+void GraphicsPipelineDesc::setStencilFrontWriteMask(uint8_t mask)
+{
+ mDepthStencilStateInfo.front.writeMask = mask;
+}
+
+void GraphicsPipelineDesc::setStencilBackWriteMask(uint8_t mask)
+{
+ mDepthStencilStateInfo.back.writeMask = mask;
+}
+
void GraphicsPipelineDesc::updateDepthTestEnabled(GraphicsPipelineTransitionBits *transition,
const gl::DepthStencilState &depthStencilState,
const gl::Framebuffer *drawFramebuffer)
{
// Only enable the depth test if the draw framebuffer has a depth buffer. It's possible that
// we're emulating a stencil-only buffer with a depth-stencil buffer
- mDepthStencilStateInfo.enable.depthTest =
- static_cast<uint8_t>(depthStencilState.depthTest && drawFramebuffer->hasDepth());
+ setDepthTestEnabled(depthStencilState.depthTest && drawFramebuffer->hasDepth());
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, enable));
}
void GraphicsPipelineDesc::updateDepthFunc(GraphicsPipelineTransitionBits *transition,
const gl::DepthStencilState &depthStencilState)
{
- mDepthStencilStateInfo.depthCompareOp = PackGLCompareFunc(depthStencilState.depthFunc);
+ setDepthFunc(PackGLCompareFunc(depthStencilState.depthFunc));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, depthCompareOp));
}
@@ -883,8 +967,7 @@ void GraphicsPipelineDesc::updateDepthWriteEnabled(GraphicsPipelineTransitionBit
const gl::Framebuffer *drawFramebuffer)
{
// Don't write to depth buffers that should not exist
- mDepthStencilStateInfo.enable.depthWrite =
- static_cast<uint8_t>(drawFramebuffer->hasDepth() ? depthStencilState.depthMask : 0);
+ setDepthWriteEnabled(drawFramebuffer->hasDepth() ? depthStencilState.depthMask : false);
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, enable));
}
@@ -894,8 +977,7 @@ void GraphicsPipelineDesc::updateStencilTestEnabled(GraphicsPipelineTransitionBi
{
// Only enable the stencil test if the draw framebuffer has a stencil buffer. It's possible
// that we're emulating a depth-only buffer with a depth-stencil buffer
- mDepthStencilStateInfo.enable.stencilTest =
- static_cast<uint8_t>(depthStencilState.stencilTest && drawFramebuffer->hasStencil());
+ setStencilTestEnabled(depthStencilState.stencilTest && drawFramebuffer->hasStencil());
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, enable));
}
@@ -903,9 +985,9 @@ void GraphicsPipelineDesc::updateStencilFrontFuncs(GraphicsPipelineTransitionBit
GLint ref,
const gl::DepthStencilState &depthStencilState)
{
- mDepthStencilStateInfo.frontStencilReference = static_cast<uint8_t>(ref);
- mDepthStencilStateInfo.front.ops.compare = PackGLCompareFunc(depthStencilState.stencilFunc);
- mDepthStencilStateInfo.front.compareMask = static_cast<uint8_t>(depthStencilState.stencilMask);
+ setStencilFrontFuncs(static_cast<uint8_t>(ref),
+ PackGLCompareFunc(depthStencilState.stencilFunc),
+ static_cast<uint8_t>(depthStencilState.stencilMask));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, front));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, frontStencilReference));
}
@@ -914,10 +996,9 @@ void GraphicsPipelineDesc::updateStencilBackFuncs(GraphicsPipelineTransitionBits
GLint ref,
const gl::DepthStencilState &depthStencilState)
{
- mDepthStencilStateInfo.backStencilReference = static_cast<uint8_t>(ref);
- mDepthStencilStateInfo.back.ops.compare = PackGLCompareFunc(depthStencilState.stencilBackFunc);
- mDepthStencilStateInfo.back.compareMask =
- static_cast<uint8_t>(depthStencilState.stencilBackMask);
+ setStencilBackFuncs(static_cast<uint8_t>(ref),
+ PackGLCompareFunc(depthStencilState.stencilBackFunc),
+ static_cast<uint8_t>(depthStencilState.stencilBackMask));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, back));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, backStencilReference));
}
@@ -925,21 +1006,18 @@ void GraphicsPipelineDesc::updateStencilBackFuncs(GraphicsPipelineTransitionBits
void GraphicsPipelineDesc::updateStencilFrontOps(GraphicsPipelineTransitionBits *transition,
const gl::DepthStencilState &depthStencilState)
{
- mDepthStencilStateInfo.front.ops.pass = PackGLStencilOp(depthStencilState.stencilPassDepthPass);
- mDepthStencilStateInfo.front.ops.fail = PackGLStencilOp(depthStencilState.stencilFail);
- mDepthStencilStateInfo.front.ops.depthFail =
- PackGLStencilOp(depthStencilState.stencilPassDepthFail);
+ setStencilFrontOps(PackGLStencilOp(depthStencilState.stencilFail),
+ PackGLStencilOp(depthStencilState.stencilPassDepthPass),
+ PackGLStencilOp(depthStencilState.stencilPassDepthFail));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, front));
}
void GraphicsPipelineDesc::updateStencilBackOps(GraphicsPipelineTransitionBits *transition,
const gl::DepthStencilState &depthStencilState)
{
- mDepthStencilStateInfo.back.ops.pass =
- PackGLStencilOp(depthStencilState.stencilBackPassDepthPass);
- mDepthStencilStateInfo.back.ops.fail = PackGLStencilOp(depthStencilState.stencilBackFail);
- mDepthStencilStateInfo.back.ops.depthFail =
- PackGLStencilOp(depthStencilState.stencilBackPassDepthFail);
+ setStencilBackOps(PackGLStencilOp(depthStencilState.stencilBackFail),
+ PackGLStencilOp(depthStencilState.stencilBackPassDepthPass),
+ PackGLStencilOp(depthStencilState.stencilBackPassDepthFail));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, back));
}
@@ -949,8 +1027,8 @@ void GraphicsPipelineDesc::updateStencilFrontWriteMask(
const gl::Framebuffer *drawFramebuffer)
{
// Don't write to stencil buffers that should not exist
- mDepthStencilStateInfo.front.writeMask = static_cast<uint8_t>(
- drawFramebuffer->hasStencil() ? depthStencilState.stencilWritemask : 0);
+ setStencilFrontWriteMask(static_cast<uint8_t>(
+ drawFramebuffer->hasStencil() ? depthStencilState.stencilWritemask : 0));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, front));
}
@@ -960,8 +1038,8 @@ void GraphicsPipelineDesc::updateStencilBackWriteMask(
const gl::Framebuffer *drawFramebuffer)
{
// Don't write to stencil buffers that should not exist
- mDepthStencilStateInfo.back.writeMask = static_cast<uint8_t>(
- drawFramebuffer->hasStencil() ? depthStencilState.stencilBackWritemask : 0);
+ setStencilBackWriteMask(static_cast<uint8_t>(
+ drawFramebuffer->hasStencil() ? depthStencilState.stencilBackWritemask : 0));
transition->set(ANGLE_GET_TRANSITION_BIT(mDepthStencilStateInfo, back));
}
@@ -1083,12 +1161,26 @@ void AttachmentOpsArray::initDummyOp(size_t index,
{
PackedAttachmentOpsDesc &ops = mOps[index];
- ops.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
- ops.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- ops.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- ops.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- ops.initialLayout = static_cast<uint16_t>(initialLayout);
- ops.finalLayout = static_cast<uint16_t>(finalLayout);
+ SetBitField(ops.initialLayout, initialLayout);
+ SetBitField(ops.finalLayout, finalLayout);
+ SetBitField(ops.loadOp, VK_ATTACHMENT_LOAD_OP_LOAD);
+ SetBitField(ops.stencilLoadOp, VK_ATTACHMENT_LOAD_OP_DONT_CARE);
+ SetBitField(ops.storeOp, VK_ATTACHMENT_STORE_OP_STORE);
+ SetBitField(ops.stencilStoreOp, VK_ATTACHMENT_STORE_OP_DONT_CARE);
+}
+
+void AttachmentOpsArray::initWithLoadStore(size_t index,
+ VkImageLayout initialLayout,
+ VkImageLayout finalLayout)
+{
+ PackedAttachmentOpsDesc &ops = mOps[index];
+
+ SetBitField(ops.initialLayout, initialLayout);
+ SetBitField(ops.finalLayout, finalLayout);
+ SetBitField(ops.loadOp, VK_ATTACHMENT_LOAD_OP_LOAD);
+ SetBitField(ops.stencilLoadOp, VK_ATTACHMENT_LOAD_OP_LOAD);
+ SetBitField(ops.storeOp, VK_ATTACHMENT_STORE_OP_STORE);
+ SetBitField(ops.stencilStoreOp, VK_ATTACHMENT_STORE_OP_STORE);
}
size_t AttachmentOpsArray::hash() const
@@ -1344,8 +1436,8 @@ angle::Result GraphicsPipelineCache::insertPipeline(
const vk::RenderPass &compatibleRenderPass,
const vk::PipelineLayout &pipelineLayout,
const gl::AttributesMask &activeAttribLocationsMask,
- const vk::ShaderModule &vertexModule,
- const vk::ShaderModule &fragmentModule,
+ const vk::ShaderModule *vertexModule,
+ const vk::ShaderModule *fragmentModule,
const vk::GraphicsPipelineDesc &desc,
const vk::GraphicsPipelineDesc **descPtrOut,
vk::PipelineHelper **pipelineOut)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.h
index f1f9a1ada88..ad046740004 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_cache_utils.h
@@ -115,6 +115,8 @@ class AttachmentOpsArray final
// Initializes an attachment op with whatever values. Used for compatible RenderPass checks.
void initDummyOp(size_t index, VkImageLayout initialLayout, VkImageLayout finalLayout);
+ // Initialize an attachment op with all load and store operations.
+ void initWithLoadStore(size_t index, VkImageLayout initialLayout, VkImageLayout finalLayout);
size_t hash() const;
@@ -326,8 +328,8 @@ class GraphicsPipelineDesc final
const RenderPass &compatibleRenderPass,
const PipelineLayout &pipelineLayout,
const gl::AttributesMask &activeAttribLocationsMask,
- const ShaderModule &vertexModule,
- const ShaderModule &fragmentModule,
+ const ShaderModule *vertexModule,
+ const ShaderModule *fragmentModule,
Pipeline *pipelineOut) const;
// Vertex input state. For ES 3.1 this should be separated into binding and attribute.
@@ -365,11 +367,22 @@ class GraphicsPipelineDesc final
const gl::BlendState &blendState);
void setColorWriteMask(VkColorComponentFlags colorComponentFlags,
const gl::DrawBufferMask &alphaMask);
+ void setSingleColorWriteMask(uint32_t colorIndex, VkColorComponentFlags colorComponentFlags);
void updateColorWriteMask(GraphicsPipelineTransitionBits *transition,
VkColorComponentFlags colorComponentFlags,
const gl::DrawBufferMask &alphaMask);
// Depth/stencil states.
+ void setDepthTestEnabled(bool enabled);
+ void setDepthWriteEnabled(bool enabled);
+ void setDepthFunc(VkCompareOp op);
+ void setStencilTestEnabled(bool enabled);
+ void setStencilFrontFuncs(uint8_t reference, VkCompareOp compareOp, uint8_t compareMask);
+ void setStencilBackFuncs(uint8_t reference, VkCompareOp compareOp, uint8_t compareMask);
+ void setStencilFrontOps(VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp);
+ void setStencilBackOps(VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp);
+ void setStencilFrontWriteMask(uint8_t mask);
+ void setStencilBackWriteMask(uint8_t mask);
void updateDepthTestEnabled(GraphicsPipelineTransitionBits *transition,
const gl::DepthStencilState &depthStencilState,
const gl::Framebuffer *drawFramebuffer);
@@ -726,8 +739,8 @@ class GraphicsPipelineCache final : angle::NonCopyable
const vk::RenderPass &compatibleRenderPass,
const vk::PipelineLayout &pipelineLayout,
const gl::AttributesMask &activeAttribLocationsMask,
- const vk::ShaderModule &vertexModule,
- const vk::ShaderModule &fragmentModule,
+ const vk::ShaderModule *vertexModule,
+ const vk::ShaderModule *fragmentModule,
const vk::GraphicsPipelineDesc &desc,
const vk::GraphicsPipelineDesc **descPtrOut,
vk::PipelineHelper **pipelineOut)
@@ -751,8 +764,8 @@ class GraphicsPipelineCache final : angle::NonCopyable
const vk::RenderPass &compatibleRenderPass,
const vk::PipelineLayout &pipelineLayout,
const gl::AttributesMask &activeAttribLocationsMask,
- const vk::ShaderModule &vertexModule,
- const vk::ShaderModule &fragmentModule,
+ const vk::ShaderModule *vertexModule,
+ const vk::ShaderModule *fragmentModule,
const vk::GraphicsPipelineDesc &desc,
const vk::GraphicsPipelineDesc **descPtrOut,
vk::PipelineHelper **pipelineOut);
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
index 4374bb5d4bd..2f1e9086106 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
@@ -56,6 +56,12 @@ void RendererVk::ensureCapsInitialized() const
// TODO(geofflang): Support GL_OES_EGL_image_external_essl3. http://anglebug.com/2668
mNativeExtensions.eglImageExternalEssl3 = false;
+ mNativeExtensions.memoryObject = true;
+ mNativeExtensions.memoryObjectFd = getFeatures().supportsExternalMemoryFd;
+
+ mNativeExtensions.semaphore = true;
+ mNativeExtensions.semaphoreFd = getFeatures().supportsExternalSemaphoreFd;
+
// TODO: Enable this always and emulate instanced draws if any divisor exceeds the maximum
// supported. http://anglebug.com/2672
mNativeExtensions.instancedArraysANGLE = mMaxVertexAttribDivisor > 1;
@@ -68,7 +74,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 queries
// unless that feature is available.
- mNativeExtensions.occlusionQueryBoolean = mPhysicalDeviceFeatures.inheritedQueries;
+ mNativeExtensions.occlusionQueryBoolean =
+ vk::CommandBuffer::SupportsQueries(mPhysicalDeviceFeatures);
// From the Vulkan specs:
// > The number of valid bits in a timestamp value is determined by the
@@ -87,6 +94,9 @@ void RendererVk::ensureCapsInitialized() const
? mPhysicalDeviceProperties.limits.maxSamplerAnisotropy
: 0.0f;
+ // Vulkan natively supports non power-of-two textures
+ mNativeExtensions.textureNPOT = true;
+
// TODO(lucferron): Eventually remove everything above this line in this function as the caps
// get implemented.
// https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch31s02.html
@@ -193,6 +203,8 @@ void RendererVk::ensureCapsInitialized() const
mNativeCaps.maxVaryingVectors =
(mPhysicalDeviceProperties.limits.maxVertexOutputComponents / 4) - kReservedVaryingCount;
mNativeCaps.maxVertexOutputComponents = mNativeCaps.maxVaryingVectors * 4;
+
+ mNativeCaps.subPixelBits = mPhysicalDeviceProperties.limits.subPixelPrecisionBits;
}
namespace egl_vk
@@ -253,7 +265,7 @@ egl::Config GenerateDefaultConfig(const RendererVk *renderer,
config.bindToTextureRGBA = colorFormat.format == GL_RGBA || colorFormat.format == GL_BGRA_EXT;
config.colorBufferType = EGL_RGB_BUFFER;
config.configCaveat = EGL_NONE;
- config.conformant = 0;
+ config.conformant = es2Support | es3Support;
config.depthSize = depthStencilFormat.depthBits;
config.stencilSize = depthStencilFormat.stencilBits;
config.level = 0;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_map.json b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_map.json
index 30ca499b4a6..f6d0b264c7a 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_map.json
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_map.json
@@ -4,7 +4,7 @@
"Use of this source code is governed by a BSD-style license that can be",
"found in the LICENSE file.",
"",
- "vk_format_map.json: Texture format mapping between OpenGL and Vulkan.",
+ "vk_format_map.json: Format mapping between OpenGL and Vulkan.",
"",
"The format of the map is a dictionary where the key of each entry is the",
"ANGLE format ID, and the value is the Vulkan format enum. Note some formats",
@@ -14,7 +14,7 @@
"",
"We implement formats that aren't natively supported in Vulkan using",
"fallback and override formats. These are specified as dictionaries (also keyed on",
- "the angle format ID), with two optional entries for Buffer and Texture/Image",
+ "the angle format ID), with two optional entries for Buffer and Image",
"formats. Each entry specifies a fallback or override format.",
"",
"Override formats are used for emulated support for formats we assume are never",
@@ -190,39 +190,43 @@
},
"overrides": {
"A16_FLOAT": {
- "texture": "R16_FLOAT"
+ "image": "R16_FLOAT"
},
"A32_FLOAT": {
- "texture": "R32_FLOAT"
+ "image": "R32_FLOAT"
},
"A8_UNORM": {
- "texture": "R8_UNORM"
+ "image": "R8_UNORM"
},
"L8_UNORM": {
- "texture": "R8_UNORM"
+ "image": "R8_UNORM"
},
"L8A8_UNORM": {
- "texture": "R8G8_UNORM"
+ "image": "R8G8_UNORM"
},
"R4G4B4A4_UNORM": {
- "texture": "R8G8B8A8_UNORM"
+ "image": "R8G8B8A8_UNORM"
},
"R5G5B5A1_UNORM": {
- "texture": "A1R5G5B5_UNORM"
+ "image": "A1R5G5B5_UNORM"
},
"R8G8B8_UNORM": {
- "texture": "R8G8B8A8_UNORM"
+ "image": "R8G8B8A8_UNORM"
},
"R8G8B8_UNORM_SRGB": {
- "texture": "R8G8B8A8_UNORM_SRGB"
+ "image": "R8G8B8A8_UNORM_SRGB"
},
"B8G8R8X8_UNORM": {
"buffer": "NONE",
- "texture": "B8G8R8A8_UNORM"
+ "image": "B8G8R8A8_UNORM"
},
"D24_UNORM_X8_UINT": {
"buffer": "NONE",
- "texture": "D24_UNORM_S8_UINT"
+ "image": "D24_UNORM_S8_UINT"
+ },
+ "ETC1_R8G8B8_UNORM_BLOCK": {
+ "buffer": "NONE",
+ "image": "ETC2_R8G8B8_UNORM_BLOCK"
},
"R32_FIXED": {
"buffer": "R32_FLOAT"
@@ -239,16 +243,16 @@
},
"fallbacks": {
"D32_FLOAT_S8X24_UINT": {
- "texture": ["D24_UNORM_S8_UINT", "D32_FLOAT_S8X24_UINT"]
+ "image": ["D24_UNORM_S8_UINT", "D32_FLOAT_S8X24_UINT"]
},
"D24_UNORM_S8_UINT": {
- "texture": ["D32_FLOAT_S8X24_UINT", "D24_UNORM_S8_UINT"]
+ "image": ["D32_FLOAT_S8X24_UINT", "D24_UNORM_S8_UINT"]
},
"D24_UNORM_X8_UINT": {
- "texture": ["D32_FLOAT_S8X24_UINT", "D24_UNORM_S8_UINT"]
+ "image": ["D32_FLOAT_S8X24_UINT", "D24_UNORM_S8_UINT"]
},
"S8_UINT": {
- "texture": ["D24_UNORM_S8_UINT", "D32_FLOAT_S8X24_UINT", "S8_UINT"]
+ "image": ["D24_UNORM_S8_UINT", "D32_FLOAT_S8X24_UINT", "S8_UINT"]
},
"R8_UNORM": {
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp
index 0d793c0461c..a49c8523348 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp
@@ -5,7 +5,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// vk_format_table:
+// vk_format_table_autogen.cpp:
// Queries for full Vulkan format information based on GL format.
#include "libANGLE/renderer/vulkan/vk_format_utils.h"
@@ -27,18 +27,18 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
switch (angleFormat.id)
{
case angle::FormatID::A16_FLOAT:
- internalFormat = GL_ALPHA16F_EXT;
- textureFormatID = angle::FormatID::R16_FLOAT;
- vkTextureFormat = VK_FORMAT_R16_SFLOAT;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_ALPHA16F_EXT;
+ imageFormatID = angle::FormatID::R16_FLOAT;
+ vkImageFormat = VK_FORMAT_R16_SFLOAT;
+ imageInitializerFunction = nullptr;
break;
case angle::FormatID::A1R5G5B5_UNORM:
internalFormat = GL_A1RGB5_ANGLEX;
- textureFormatID = angle::FormatID::A1R5G5B5_UNORM;
- vkTextureFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::A1R5G5B5_UNORM;
+ vkImageFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::A1R5G5B5_UNORM;
vkBufferFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
vkBufferFormatIsPacked = true;
@@ -47,26 +47,26 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::A32_FLOAT:
- internalFormat = GL_ALPHA32F_EXT;
- textureFormatID = angle::FormatID::R32_FLOAT;
- vkTextureFormat = VK_FORMAT_R32_SFLOAT;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_ALPHA32F_EXT;
+ imageFormatID = angle::FormatID::R32_FLOAT;
+ vkImageFormat = VK_FORMAT_R32_SFLOAT;
+ imageInitializerFunction = nullptr;
break;
case angle::FormatID::A8_UNORM:
- internalFormat = GL_ALPHA8_EXT;
- textureFormatID = angle::FormatID::R8_UNORM;
- vkTextureFormat = VK_FORMAT_R8_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_ALPHA8_EXT;
+ imageFormatID = angle::FormatID::R8_UNORM;
+ vkImageFormat = VK_FORMAT_R8_UNORM;
+ imageInitializerFunction = nullptr;
break;
case angle::FormatID::ASTC_10x10_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
- textureFormatID = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -76,9 +76,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_10x10_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
- textureFormatID = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -88,9 +88,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_10x5_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
- textureFormatID = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -100,9 +100,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_10x5_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
- textureFormatID = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -112,9 +112,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_10x6_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
- textureFormatID = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -124,9 +124,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_10x6_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
- textureFormatID = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -136,9 +136,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_10x8_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
- textureFormatID = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -148,9 +148,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_10x8_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
- textureFormatID = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -160,9 +160,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_12x10_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
- textureFormatID = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -172,9 +172,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_12x10_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
- textureFormatID = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -184,9 +184,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_12x12_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
- textureFormatID = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -196,9 +196,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_12x12_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
- textureFormatID = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -208,9 +208,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_4x4_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
- textureFormatID = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -220,9 +220,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_4x4_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
- textureFormatID = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -232,9 +232,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_5x4_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
- textureFormatID = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -244,9 +244,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_5x4_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
- textureFormatID = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -256,9 +256,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_5x5_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
- textureFormatID = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -268,9 +268,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_5x5_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
- textureFormatID = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -280,9 +280,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_6x5_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
- textureFormatID = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -292,9 +292,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_6x5_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
- textureFormatID = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -304,9 +304,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_6x6_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
- textureFormatID = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -316,9 +316,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_6x6_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
- textureFormatID = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -328,9 +328,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_8x5_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
- textureFormatID = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -340,9 +340,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_8x5_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
- textureFormatID = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -352,9 +352,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_8x6_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
- textureFormatID = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -364,9 +364,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_8x6_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
- textureFormatID = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -376,9 +376,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_8x8_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
- textureFormatID = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -388,9 +388,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ASTC_8x8_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
- textureFormatID = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -400,9 +400,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::B4G4R4A4_UNORM:
internalFormat = GL_BGRA4_ANGLEX;
- textureFormatID = angle::FormatID::B4G4R4A4_UNORM;
- vkTextureFormat = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::B4G4R4A4_UNORM;
+ vkImageFormat = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::B4G4R4A4_UNORM;
vkBufferFormat = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
vkBufferFormatIsPacked = true;
@@ -412,9 +412,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::B5G5R5A1_UNORM:
internalFormat = GL_BGR5_A1_ANGLEX;
- textureFormatID = angle::FormatID::B5G5R5A1_UNORM;
- vkTextureFormat = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::B5G5R5A1_UNORM;
+ vkImageFormat = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::B5G5R5A1_UNORM;
vkBufferFormat = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
vkBufferFormatIsPacked = true;
@@ -424,9 +424,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::B5G6R5_UNORM:
internalFormat = GL_BGR565_ANGLEX;
- textureFormatID = angle::FormatID::B5G6R5_UNORM;
- vkTextureFormat = VK_FORMAT_B5G6R5_UNORM_PACK16;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::B5G6R5_UNORM;
+ vkImageFormat = VK_FORMAT_B5G6R5_UNORM_PACK16;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::B5G6R5_UNORM;
vkBufferFormat = VK_FORMAT_B5G6R5_UNORM_PACK16;
vkBufferFormatIsPacked = true;
@@ -444,9 +444,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::B8G8R8A8_UNORM:
internalFormat = GL_BGRA8_EXT;
- textureFormatID = angle::FormatID::B8G8R8A8_UNORM;
- vkTextureFormat = VK_FORMAT_B8G8R8A8_UNORM;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::B8G8R8A8_UNORM;
+ vkImageFormat = VK_FORMAT_B8G8R8A8_UNORM;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::B8G8R8A8_UNORM;
vkBufferFormat = VK_FORMAT_B8G8R8A8_UNORM;
vkBufferFormatIsPacked = false;
@@ -456,9 +456,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::B8G8R8A8_UNORM_SRGB:
internalFormat = GL_BGRA8_SRGB_ANGLEX;
- textureFormatID = angle::FormatID::B8G8R8A8_UNORM_SRGB;
- vkTextureFormat = VK_FORMAT_B8G8R8A8_SRGB;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::B8G8R8A8_UNORM_SRGB;
+ vkImageFormat = VK_FORMAT_B8G8R8A8_SRGB;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::B8G8R8A8_UNORM_SRGB;
vkBufferFormat = VK_FORMAT_B8G8R8A8_SRGB;
vkBufferFormatIsPacked = false;
@@ -468,9 +468,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::B8G8R8X8_UNORM:
internalFormat = GL_BGRX8_ANGLEX;
- textureFormatID = angle::FormatID::B8G8R8A8_UNORM;
- vkTextureFormat = VK_FORMAT_B8G8R8A8_UNORM;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::B8G8R8A8_UNORM;
+ vkImageFormat = VK_FORMAT_B8G8R8A8_UNORM;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::NONE;
vkBufferFormat = VK_FORMAT_UNDEFINED;
vkBufferFormatIsPacked = false;
@@ -480,9 +480,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC1_RGBA_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
- textureFormatID = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -492,9 +492,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
- textureFormatID = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -504,9 +504,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC1_RGB_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
- textureFormatID = angle::FormatID::BC1_RGB_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC1_RGB_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC1_RGB_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -516,9 +516,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB_S3TC_DXT1_EXT;
- textureFormatID = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_BC1_RGB_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_BC1_RGB_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_BC1_RGB_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -528,9 +528,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC2_RGBA_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
- textureFormatID = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_BC2_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_BC2_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_BC2_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -540,9 +540,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
- textureFormatID = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_BC2_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_BC2_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_BC2_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -552,9 +552,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC3_RGBA_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
- textureFormatID = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_BC3_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_BC3_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_BC3_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -564,9 +564,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
- textureFormatID = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_BC3_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_BC3_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_BC3_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -576,9 +576,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BPTC_RGBA_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA_BPTC_UNORM_EXT;
- textureFormatID = angle::FormatID::BPTC_RGBA_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_BC7_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BPTC_RGBA_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_BC7_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BPTC_RGBA_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_BC7_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -588,9 +588,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BPTC_RGB_SIGNED_FLOAT_BLOCK:
internalFormat = GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;
- textureFormatID = angle::FormatID::BPTC_RGB_SIGNED_FLOAT_BLOCK;
- vkTextureFormat = VK_FORMAT_BC6H_SFLOAT_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BPTC_RGB_SIGNED_FLOAT_BLOCK;
+ vkImageFormat = VK_FORMAT_BC6H_SFLOAT_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BPTC_RGB_SIGNED_FLOAT_BLOCK;
vkBufferFormat = VK_FORMAT_BC6H_SFLOAT_BLOCK;
vkBufferFormatIsPacked = false;
@@ -600,9 +600,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BPTC_RGB_UNSIGNED_FLOAT_BLOCK:
internalFormat = GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;
- textureFormatID = angle::FormatID::BPTC_RGB_UNSIGNED_FLOAT_BLOCK;
- vkTextureFormat = VK_FORMAT_BC6H_UFLOAT_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BPTC_RGB_UNSIGNED_FLOAT_BLOCK;
+ vkImageFormat = VK_FORMAT_BC6H_UFLOAT_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BPTC_RGB_UNSIGNED_FLOAT_BLOCK;
vkBufferFormat = VK_FORMAT_BC6H_UFLOAT_BLOCK;
vkBufferFormatIsPacked = false;
@@ -612,9 +612,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::BPTC_SRGB_ALPHA_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;
- textureFormatID = angle::FormatID::BPTC_SRGB_ALPHA_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_BC7_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::BPTC_SRGB_ALPHA_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_BC7_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::BPTC_SRGB_ALPHA_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_BC7_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -624,9 +624,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::D16_UNORM:
internalFormat = GL_DEPTH_COMPONENT16;
- textureFormatID = angle::FormatID::D16_UNORM;
- vkTextureFormat = VK_FORMAT_D16_UNORM;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::D16_UNORM;
+ vkImageFormat = VK_FORMAT_D16_UNORM;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::D16_UNORM;
vkBufferFormat = VK_FORMAT_D16_UNORM;
vkBufferFormatIsPacked = false;
@@ -637,11 +637,11 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::D24_UNORM_S8_UINT:
internalFormat = GL_DEPTH24_STENCIL8;
{
- static constexpr TextureFormatInitInfo kInfo[] = {
+ static constexpr ImageFormatInitInfo kInfo[] = {
{angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
{angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr},
{angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr}};
- initTextureFallback(renderer, kInfo, ArraySize(kInfo));
+ initImageFallback(renderer, kInfo, ArraySize(kInfo));
}
bufferFormatID = angle::FormatID::D24_UNORM_S8_UINT;
vkBufferFormat = VK_FORMAT_D24_UNORM_S8_UINT;
@@ -653,11 +653,11 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::D24_UNORM_X8_UINT:
internalFormat = GL_DEPTH_COMPONENT24;
{
- static constexpr TextureFormatInitInfo kInfo[] = {
+ static constexpr ImageFormatInitInfo kInfo[] = {
{angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
{angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr},
{angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr}};
- initTextureFallback(renderer, kInfo, ArraySize(kInfo));
+ initImageFallback(renderer, kInfo, ArraySize(kInfo));
}
bufferFormatID = angle::FormatID::NONE;
vkBufferFormat = VK_FORMAT_UNDEFINED;
@@ -668,9 +668,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::D32_FLOAT:
internalFormat = GL_DEPTH_COMPONENT32F;
- textureFormatID = angle::FormatID::D32_FLOAT;
- vkTextureFormat = VK_FORMAT_D32_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::D32_FLOAT;
+ vkImageFormat = VK_FORMAT_D32_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::D32_FLOAT;
vkBufferFormat = VK_FORMAT_D32_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -681,11 +681,11 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::D32_FLOAT_S8X24_UINT:
internalFormat = GL_DEPTH32F_STENCIL8;
{
- static constexpr TextureFormatInitInfo kInfo[] = {
+ static constexpr ImageFormatInitInfo kInfo[] = {
{angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr},
{angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
{angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr}};
- initTextureFallback(renderer, kInfo, ArraySize(kInfo));
+ initImageFallback(renderer, kInfo, ArraySize(kInfo));
}
bufferFormatID = angle::FormatID::D32_FLOAT_S8X24_UINT;
vkBufferFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
@@ -700,9 +700,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::EAC_R11G11_SNORM_BLOCK:
internalFormat = GL_COMPRESSED_SIGNED_RG11_EAC;
- textureFormatID = angle::FormatID::EAC_R11G11_SNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_EAC_R11G11_SNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::EAC_R11G11_SNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_EAC_R11G11_SNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::EAC_R11G11_SNORM_BLOCK;
vkBufferFormat = VK_FORMAT_EAC_R11G11_SNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -712,9 +712,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::EAC_R11G11_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RG11_EAC;
- textureFormatID = angle::FormatID::EAC_R11G11_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::EAC_R11G11_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::EAC_R11G11_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -724,9 +724,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::EAC_R11_SNORM_BLOCK:
internalFormat = GL_COMPRESSED_SIGNED_R11_EAC;
- textureFormatID = angle::FormatID::EAC_R11_SNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_EAC_R11_SNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::EAC_R11_SNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_EAC_R11_SNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::EAC_R11_SNORM_BLOCK;
vkBufferFormat = VK_FORMAT_EAC_R11_SNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -736,9 +736,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::EAC_R11_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_R11_EAC;
- textureFormatID = angle::FormatID::EAC_R11_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_EAC_R11_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::EAC_R11_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_EAC_R11_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::EAC_R11_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_EAC_R11_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -751,14 +751,22 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK:
- // This format is not implemented in Vulkan.
+ internalFormat = GL_ETC1_RGB8_OES;
+ imageFormatID = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
+ bufferFormatID = angle::FormatID::NONE;
+ vkBufferFormat = VK_FORMAT_UNDEFINED;
+ vkBufferFormatIsPacked = false;
+ vertexLoadFunction = nullptr;
+ vertexLoadRequiresConversion = true;
break;
case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
- textureFormatID = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -767,22 +775,22 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK:
- internalFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
- textureFormatID = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
- textureInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
- bufferFormatID = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK;
- vkBufferFormat = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
- vkBufferFormatIsPacked = false;
- vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>;
+ internalFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+ imageFormatID = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
+ imageInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
+ bufferFormatID = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK;
+ vkBufferFormat = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
+ vkBufferFormatIsPacked = false;
+ vertexLoadFunction = CopyNativeVertexData<GLubyte, 4, 4, 0>;
vertexLoadRequiresConversion = false;
break;
case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
- textureFormatID = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -792,9 +800,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
- textureFormatID = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -804,9 +812,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK:
internalFormat = GL_COMPRESSED_SRGB8_ETC2;
- textureFormatID = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK;
- vkTextureFormat = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK;
+ vkImageFormat = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK;
vkBufferFormat = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;
vkBufferFormatIsPacked = false;
@@ -816,9 +824,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK:
internalFormat = GL_COMPRESSED_RGB8_ETC2;
- textureFormatID = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK;
- vkTextureFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK;
+ vkImageFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK;
vkBufferFormat = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
vkBufferFormatIsPacked = false;
@@ -843,18 +851,18 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::L8A8_UNORM:
- internalFormat = GL_LUMINANCE8_ALPHA8_EXT;
- textureFormatID = angle::FormatID::R8G8_UNORM;
- vkTextureFormat = VK_FORMAT_R8G8_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_LUMINANCE8_ALPHA8_EXT;
+ imageFormatID = angle::FormatID::R8G8_UNORM;
+ vkImageFormat = VK_FORMAT_R8G8_UNORM;
+ imageInitializerFunction = nullptr;
break;
case angle::FormatID::L8_UNORM:
- internalFormat = GL_LUMINANCE8_EXT;
- textureFormatID = angle::FormatID::R8_UNORM;
- vkTextureFormat = VK_FORMAT_R8_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_LUMINANCE8_EXT;
+ imageFormatID = angle::FormatID::R8_UNORM;
+ vkImageFormat = VK_FORMAT_R8_UNORM;
+ imageInitializerFunction = nullptr;
break;
@@ -864,9 +872,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R10G10B10A2_SINT:
internalFormat = GL_RGB10_A2_SINT_ANGLEX;
- textureFormatID = angle::FormatID::R10G10B10A2_SINT;
- vkTextureFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R10G10B10A2_SINT;
+ vkImageFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SINT;
vkBufferFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32;
vkBufferFormatIsPacked = true;
@@ -876,9 +884,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R10G10B10A2_SNORM:
internalFormat = GL_RGB10_A2_SNORM_ANGLEX;
- textureFormatID = angle::FormatID::R10G10B10A2_SNORM;
- vkTextureFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R10G10B10A2_SNORM;
+ vkImageFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SNORM;
vkBufferFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
vkBufferFormatIsPacked = true;
@@ -888,9 +896,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R10G10B10A2_SSCALED:
internalFormat = GL_RGB10_A2_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R10G10B10A2_SSCALED;
- vkTextureFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R10G10B10A2_SSCALED;
+ vkImageFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SSCALED;
vkBufferFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
vkBufferFormatIsPacked = true;
@@ -900,9 +908,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R10G10B10A2_UINT:
internalFormat = GL_RGB10_A2UI;
- textureFormatID = angle::FormatID::R10G10B10A2_UINT;
- vkTextureFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R10G10B10A2_UINT;
+ vkImageFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_UINT;
vkBufferFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32;
vkBufferFormatIsPacked = true;
@@ -912,9 +920,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R10G10B10A2_UNORM:
internalFormat = GL_RGB10_A2;
- textureFormatID = angle::FormatID::R10G10B10A2_UNORM;
- vkTextureFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R10G10B10A2_UNORM;
+ vkImageFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_UNORM;
vkBufferFormat = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
vkBufferFormatIsPacked = true;
@@ -924,9 +932,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R10G10B10A2_USCALED:
internalFormat = GL_RGB10_A2_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R10G10B10A2_USCALED;
- vkTextureFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R10G10B10A2_USCALED;
+ vkImageFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_USCALED;
vkBufferFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
vkBufferFormatIsPacked = true;
@@ -940,9 +948,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16B16A16_FLOAT:
internalFormat = GL_RGBA16F;
- textureFormatID = angle::FormatID::R16G16B16A16_FLOAT;
- vkTextureFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16B16A16_FLOAT;
+ vkImageFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16B16A16_FLOAT;
vkBufferFormat = VK_FORMAT_R16G16B16A16_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -952,9 +960,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16B16A16_SINT:
internalFormat = GL_RGBA16I;
- textureFormatID = angle::FormatID::R16G16B16A16_SINT;
- vkTextureFormat = VK_FORMAT_R16G16B16A16_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16B16A16_SINT;
+ vkImageFormat = VK_FORMAT_R16G16B16A16_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16B16A16_SINT;
vkBufferFormat = VK_FORMAT_R16G16B16A16_SINT;
vkBufferFormatIsPacked = false;
@@ -963,10 +971,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16A16_SNORM:
- internalFormat = GL_RGBA16_SNORM_EXT;
- textureFormatID = angle::FormatID::R16G16B16A16_SNORM;
- vkTextureFormat = VK_FORMAT_R16G16B16A16_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA16_SNORM_EXT;
+ imageFormatID = angle::FormatID::R16G16B16A16_SNORM;
+ vkImageFormat = VK_FORMAT_R16G16B16A16_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_SNORM, false,
@@ -978,10 +986,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16A16_SSCALED:
- internalFormat = GL_RGBA16_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16G16B16A16_SSCALED;
- vkTextureFormat = VK_FORMAT_R16G16B16A16_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA16_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16G16B16A16_SSCALED;
+ vkImageFormat = VK_FORMAT_R16G16B16A16_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16A16_SSCALED, VK_FORMAT_R16G16B16A16_SSCALED, false,
@@ -994,9 +1002,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16B16A16_UINT:
internalFormat = GL_RGBA16UI;
- textureFormatID = angle::FormatID::R16G16B16A16_UINT;
- vkTextureFormat = VK_FORMAT_R16G16B16A16_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16B16A16_UINT;
+ vkImageFormat = VK_FORMAT_R16G16B16A16_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16B16A16_UINT;
vkBufferFormat = VK_FORMAT_R16G16B16A16_UINT;
vkBufferFormatIsPacked = false;
@@ -1005,10 +1013,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16A16_UNORM:
- internalFormat = GL_RGBA16_EXT;
- textureFormatID = angle::FormatID::R16G16B16A16_UNORM;
- vkTextureFormat = VK_FORMAT_R16G16B16A16_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA16_EXT;
+ imageFormatID = angle::FormatID::R16G16B16A16_UNORM;
+ vkImageFormat = VK_FORMAT_R16G16B16A16_UNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_UNORM, false,
@@ -1020,10 +1028,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16A16_USCALED:
- internalFormat = GL_RGBA16_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16G16B16A16_USCALED;
- vkTextureFormat = VK_FORMAT_R16G16B16A16_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA16_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16G16B16A16_USCALED;
+ vkImageFormat = VK_FORMAT_R16G16B16A16_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16A16_USCALED, VK_FORMAT_R16G16B16A16_USCALED, false,
@@ -1036,9 +1044,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16B16_FLOAT:
internalFormat = GL_RGB16F;
- textureFormatID = angle::FormatID::R16G16B16_FLOAT;
- vkTextureFormat = VK_FORMAT_R16G16B16_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16B16_FLOAT;
+ vkImageFormat = VK_FORMAT_R16G16B16_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16B16_FLOAT;
vkBufferFormat = VK_FORMAT_R16G16B16_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -1048,9 +1056,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16B16_SINT:
internalFormat = GL_RGB16I;
- textureFormatID = angle::FormatID::R16G16B16_SINT;
- vkTextureFormat = VK_FORMAT_R16G16B16_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16B16_SINT;
+ vkImageFormat = VK_FORMAT_R16G16B16_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16B16_SINT;
vkBufferFormat = VK_FORMAT_R16G16B16_SINT;
vkBufferFormatIsPacked = false;
@@ -1059,10 +1067,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16_SNORM:
- internalFormat = GL_RGB16_SNORM_EXT;
- textureFormatID = angle::FormatID::R16G16B16_SNORM;
- vkTextureFormat = VK_FORMAT_R16G16B16_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGB16_SNORM_EXT;
+ imageFormatID = angle::FormatID::R16G16B16_SNORM;
+ vkImageFormat = VK_FORMAT_R16G16B16_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16_SNORM, VK_FORMAT_R16G16B16_SNORM, false,
@@ -1074,10 +1082,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16_SSCALED:
- internalFormat = GL_RGB16_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16G16B16_SSCALED;
- vkTextureFormat = VK_FORMAT_R16G16B16_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGB16_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16G16B16_SSCALED;
+ vkImageFormat = VK_FORMAT_R16G16B16_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16_SSCALED, VK_FORMAT_R16G16B16_SSCALED, false,
@@ -1090,9 +1098,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16B16_UINT:
internalFormat = GL_RGB16UI;
- textureFormatID = angle::FormatID::R16G16B16_UINT;
- vkTextureFormat = VK_FORMAT_R16G16B16_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16B16_UINT;
+ vkImageFormat = VK_FORMAT_R16G16B16_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16B16_UINT;
vkBufferFormat = VK_FORMAT_R16G16B16_UINT;
vkBufferFormatIsPacked = false;
@@ -1101,10 +1109,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16_UNORM:
- internalFormat = GL_RGB16_EXT;
- textureFormatID = angle::FormatID::R16G16B16_UNORM;
- vkTextureFormat = VK_FORMAT_R16G16B16_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGB16_EXT;
+ imageFormatID = angle::FormatID::R16G16B16_UNORM;
+ vkImageFormat = VK_FORMAT_R16G16B16_UNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16_UNORM, VK_FORMAT_R16G16B16_UNORM, false,
@@ -1116,10 +1124,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16B16_USCALED:
- internalFormat = GL_RGB16_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16G16B16_USCALED;
- vkTextureFormat = VK_FORMAT_R16G16B16_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGB16_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16G16B16_USCALED;
+ vkImageFormat = VK_FORMAT_R16G16B16_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16B16_USCALED, VK_FORMAT_R16G16B16_USCALED, false,
@@ -1132,9 +1140,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16_FLOAT:
internalFormat = GL_RG16F;
- textureFormatID = angle::FormatID::R16G16_FLOAT;
- vkTextureFormat = VK_FORMAT_R16G16_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16_FLOAT;
+ vkImageFormat = VK_FORMAT_R16G16_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16_FLOAT;
vkBufferFormat = VK_FORMAT_R16G16_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -1144,9 +1152,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16_SINT:
internalFormat = GL_RG16I;
- textureFormatID = angle::FormatID::R16G16_SINT;
- vkTextureFormat = VK_FORMAT_R16G16_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16_SINT;
+ vkImageFormat = VK_FORMAT_R16G16_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16_SINT;
vkBufferFormat = VK_FORMAT_R16G16_SINT;
vkBufferFormatIsPacked = false;
@@ -1155,10 +1163,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16_SNORM:
- internalFormat = GL_RG16_SNORM_EXT;
- textureFormatID = angle::FormatID::R16G16_SNORM;
- vkTextureFormat = VK_FORMAT_R16G16_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG16_SNORM_EXT;
+ imageFormatID = angle::FormatID::R16G16_SNORM;
+ vkImageFormat = VK_FORMAT_R16G16_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16_SNORM, VK_FORMAT_R16G16_SNORM, false,
@@ -1170,10 +1178,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16_SSCALED:
- internalFormat = GL_RG16_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16G16_SSCALED;
- vkTextureFormat = VK_FORMAT_R16G16_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG16_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16G16_SSCALED;
+ vkImageFormat = VK_FORMAT_R16G16_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16_SSCALED, VK_FORMAT_R16G16_SSCALED, false,
@@ -1186,9 +1194,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16G16_UINT:
internalFormat = GL_RG16UI;
- textureFormatID = angle::FormatID::R16G16_UINT;
- vkTextureFormat = VK_FORMAT_R16G16_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16G16_UINT;
+ vkImageFormat = VK_FORMAT_R16G16_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16G16_UINT;
vkBufferFormat = VK_FORMAT_R16G16_UINT;
vkBufferFormatIsPacked = false;
@@ -1197,10 +1205,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16_UNORM:
- internalFormat = GL_RG16_EXT;
- textureFormatID = angle::FormatID::R16G16_UNORM;
- vkTextureFormat = VK_FORMAT_R16G16_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG16_EXT;
+ imageFormatID = angle::FormatID::R16G16_UNORM;
+ vkImageFormat = VK_FORMAT_R16G16_UNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16_UNORM, VK_FORMAT_R16G16_UNORM, false,
@@ -1212,10 +1220,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16G16_USCALED:
- internalFormat = GL_RG16_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16G16_USCALED;
- vkTextureFormat = VK_FORMAT_R16G16_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG16_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16G16_USCALED;
+ vkImageFormat = VK_FORMAT_R16G16_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16G16_USCALED, VK_FORMAT_R16G16_USCALED, false,
@@ -1228,9 +1236,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16_FLOAT:
internalFormat = GL_R16F;
- textureFormatID = angle::FormatID::R16_FLOAT;
- vkTextureFormat = VK_FORMAT_R16_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16_FLOAT;
+ vkImageFormat = VK_FORMAT_R16_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16_FLOAT;
vkBufferFormat = VK_FORMAT_R16_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -1240,9 +1248,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16_SINT:
internalFormat = GL_R16I;
- textureFormatID = angle::FormatID::R16_SINT;
- vkTextureFormat = VK_FORMAT_R16_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16_SINT;
+ vkImageFormat = VK_FORMAT_R16_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16_SINT;
vkBufferFormat = VK_FORMAT_R16_SINT;
vkBufferFormatIsPacked = false;
@@ -1251,10 +1259,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16_SNORM:
- internalFormat = GL_R16_SNORM_EXT;
- textureFormatID = angle::FormatID::R16_SNORM;
- vkTextureFormat = VK_FORMAT_R16_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R16_SNORM_EXT;
+ imageFormatID = angle::FormatID::R16_SNORM;
+ vkImageFormat = VK_FORMAT_R16_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16_SNORM, VK_FORMAT_R16_SNORM, false,
@@ -1266,10 +1274,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16_SSCALED:
- internalFormat = GL_R16_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16_SSCALED;
- vkTextureFormat = VK_FORMAT_R16_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R16_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16_SSCALED;
+ vkImageFormat = VK_FORMAT_R16_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16_SSCALED, VK_FORMAT_R16_SSCALED, false,
@@ -1282,9 +1290,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R16_UINT:
internalFormat = GL_R16UI;
- textureFormatID = angle::FormatID::R16_UINT;
- vkTextureFormat = VK_FORMAT_R16_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R16_UINT;
+ vkImageFormat = VK_FORMAT_R16_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R16_UINT;
vkBufferFormat = VK_FORMAT_R16_UINT;
vkBufferFormatIsPacked = false;
@@ -1293,10 +1301,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16_UNORM:
- internalFormat = GL_R16_EXT;
- textureFormatID = angle::FormatID::R16_UNORM;
- vkTextureFormat = VK_FORMAT_R16_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R16_EXT;
+ imageFormatID = angle::FormatID::R16_UNORM;
+ vkImageFormat = VK_FORMAT_R16_UNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16_UNORM, VK_FORMAT_R16_UNORM, false,
@@ -1308,10 +1316,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R16_USCALED:
- internalFormat = GL_R16_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R16_USCALED;
- vkTextureFormat = VK_FORMAT_R16_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R16_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R16_USCALED;
+ vkImageFormat = VK_FORMAT_R16_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R16_USCALED, VK_FORMAT_R16_USCALED, false,
@@ -1334,9 +1342,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32B32A32_FLOAT:
internalFormat = GL_RGBA32F;
- textureFormatID = angle::FormatID::R32G32B32A32_FLOAT;
- vkTextureFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32B32A32_FLOAT;
+ vkImageFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -1346,9 +1354,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32B32A32_SINT:
internalFormat = GL_RGBA32I;
- textureFormatID = angle::FormatID::R32G32B32A32_SINT;
- vkTextureFormat = VK_FORMAT_R32G32B32A32_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32B32A32_SINT;
+ vkImageFormat = VK_FORMAT_R32G32B32A32_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_SINT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SINT;
vkBufferFormatIsPacked = false;
@@ -1366,9 +1374,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32B32A32_UINT:
internalFormat = GL_RGBA32UI;
- textureFormatID = angle::FormatID::R32G32B32A32_UINT;
- vkTextureFormat = VK_FORMAT_R32G32B32A32_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32B32A32_UINT;
+ vkImageFormat = VK_FORMAT_R32G32B32A32_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_UINT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_UINT;
vkBufferFormatIsPacked = false;
@@ -1396,9 +1404,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32B32_FLOAT:
internalFormat = GL_RGB32F;
- textureFormatID = angle::FormatID::R32G32B32_FLOAT;
- vkTextureFormat = VK_FORMAT_R32G32B32_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32B32_FLOAT;
+ vkImageFormat = VK_FORMAT_R32G32B32_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -1408,9 +1416,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32B32_SINT:
internalFormat = GL_RGB32I;
- textureFormatID = angle::FormatID::R32G32B32_SINT;
- vkTextureFormat = VK_FORMAT_R32G32B32_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32B32_SINT;
+ vkImageFormat = VK_FORMAT_R32G32B32_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32_SINT;
vkBufferFormat = VK_FORMAT_R32G32B32_SINT;
vkBufferFormatIsPacked = false;
@@ -1428,9 +1436,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32B32_UINT:
internalFormat = GL_RGB32UI;
- textureFormatID = angle::FormatID::R32G32B32_UINT;
- vkTextureFormat = VK_FORMAT_R32G32B32_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32B32_UINT;
+ vkImageFormat = VK_FORMAT_R32G32B32_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32_UINT;
vkBufferFormat = VK_FORMAT_R32G32B32_UINT;
vkBufferFormatIsPacked = false;
@@ -1458,9 +1466,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32_FLOAT:
internalFormat = GL_RG32F;
- textureFormatID = angle::FormatID::R32G32_FLOAT;
- vkTextureFormat = VK_FORMAT_R32G32_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32_FLOAT;
+ vkImageFormat = VK_FORMAT_R32G32_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -1470,9 +1478,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32_SINT:
internalFormat = GL_RG32I;
- textureFormatID = angle::FormatID::R32G32_SINT;
- vkTextureFormat = VK_FORMAT_R32G32_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32_SINT;
+ vkImageFormat = VK_FORMAT_R32G32_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32_SINT;
vkBufferFormat = VK_FORMAT_R32G32_SINT;
vkBufferFormatIsPacked = false;
@@ -1490,9 +1498,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32G32_UINT:
internalFormat = GL_RG32UI;
- textureFormatID = angle::FormatID::R32G32_UINT;
- vkTextureFormat = VK_FORMAT_R32G32_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32G32_UINT;
+ vkImageFormat = VK_FORMAT_R32G32_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32_UINT;
vkBufferFormat = VK_FORMAT_R32G32_UINT;
vkBufferFormatIsPacked = false;
@@ -1520,9 +1528,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32_FLOAT:
internalFormat = GL_R32F;
- textureFormatID = angle::FormatID::R32_FLOAT;
- vkTextureFormat = VK_FORMAT_R32_SFLOAT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32_FLOAT;
+ vkImageFormat = VK_FORMAT_R32_SFLOAT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32_FLOAT;
vkBufferFormat = VK_FORMAT_R32_SFLOAT;
vkBufferFormatIsPacked = false;
@@ -1532,9 +1540,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32_SINT:
internalFormat = GL_R32I;
- textureFormatID = angle::FormatID::R32_SINT;
- vkTextureFormat = VK_FORMAT_R32_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32_SINT;
+ vkImageFormat = VK_FORMAT_R32_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32_SINT;
vkBufferFormat = VK_FORMAT_R32_SINT;
vkBufferFormatIsPacked = false;
@@ -1552,9 +1560,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R32_UINT:
internalFormat = GL_R32UI;
- textureFormatID = angle::FormatID::R32_UINT;
- vkTextureFormat = VK_FORMAT_R32_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R32_UINT;
+ vkImageFormat = VK_FORMAT_R32_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32_UINT;
vkBufferFormat = VK_FORMAT_R32_UINT;
vkBufferFormatIsPacked = false;
@@ -1572,9 +1580,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R4G4B4A4_UNORM:
internalFormat = GL_RGBA4;
- textureFormatID = angle::FormatID::R8G8B8A8_UNORM;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_UNORM;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8B8A8_UNORM;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_UNORM;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R4G4B4A4_UNORM;
vkBufferFormat = VK_FORMAT_R4G4B4A4_UNORM_PACK16;
vkBufferFormatIsPacked = true;
@@ -1584,9 +1592,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R5G5B5A1_UNORM:
internalFormat = GL_RGB5_A1;
- textureFormatID = angle::FormatID::A1R5G5B5_UNORM;
- vkTextureFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::A1R5G5B5_UNORM;
+ vkImageFormat = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R5G5B5A1_UNORM;
vkBufferFormat = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
vkBufferFormatIsPacked = true;
@@ -1596,9 +1604,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R5G6B5_UNORM:
internalFormat = GL_RGB565;
- textureFormatID = angle::FormatID::R5G6B5_UNORM;
- vkTextureFormat = VK_FORMAT_R5G6B5_UNORM_PACK16;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R5G6B5_UNORM;
+ vkImageFormat = VK_FORMAT_R5G6B5_UNORM_PACK16;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R5G6B5_UNORM;
vkBufferFormat = VK_FORMAT_R5G6B5_UNORM_PACK16;
vkBufferFormatIsPacked = true;
@@ -1608,9 +1616,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8G8B8A8_SINT:
internalFormat = GL_RGBA8I;
- textureFormatID = angle::FormatID::R8G8B8A8_SINT;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8B8A8_SINT;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8G8B8A8_SINT;
vkBufferFormat = VK_FORMAT_R8G8B8A8_SINT;
vkBufferFormatIsPacked = false;
@@ -1619,10 +1627,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8A8_SNORM:
- internalFormat = GL_RGBA8_SNORM;
- textureFormatID = angle::FormatID::R8G8B8A8_SNORM;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA8_SNORM;
+ imageFormatID = angle::FormatID::R8G8B8A8_SNORM;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SNORM, false,
@@ -1634,10 +1642,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8A8_SSCALED:
- internalFormat = GL_RGBA8_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8G8B8A8_SSCALED;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA8_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8G8B8A8_SSCALED;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8A8_SSCALED, VK_FORMAT_R8G8B8A8_SSCALED, false,
@@ -1658,9 +1666,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8G8B8A8_UINT:
internalFormat = GL_RGBA8UI;
- textureFormatID = angle::FormatID::R8G8B8A8_UINT;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8B8A8_UINT;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8G8B8A8_UINT;
vkBufferFormat = VK_FORMAT_R8G8B8A8_UINT;
vkBufferFormatIsPacked = false;
@@ -1669,10 +1677,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8A8_UNORM:
- internalFormat = GL_RGBA8;
- textureFormatID = angle::FormatID::R8G8B8A8_UNORM;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA8;
+ imageFormatID = angle::FormatID::R8G8B8A8_UNORM;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_UNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, false,
@@ -1685,9 +1693,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8G8B8A8_UNORM_SRGB:
internalFormat = GL_SRGB8_ALPHA8;
- textureFormatID = angle::FormatID::R8G8B8A8_UNORM_SRGB;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_SRGB;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8B8A8_UNORM_SRGB;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_SRGB;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8G8B8A8_UNORM_SRGB;
vkBufferFormat = VK_FORMAT_R8G8B8A8_SRGB;
vkBufferFormatIsPacked = false;
@@ -1696,10 +1704,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8A8_USCALED:
- internalFormat = GL_RGBA8_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8G8B8A8_USCALED;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGBA8_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8G8B8A8_USCALED;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8A8_USCALED, VK_FORMAT_R8G8B8A8_USCALED, false,
@@ -1712,9 +1720,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8G8B8_SINT:
internalFormat = GL_RGB8I;
- textureFormatID = angle::FormatID::R8G8B8_SINT;
- vkTextureFormat = VK_FORMAT_R8G8B8_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8B8_SINT;
+ vkImageFormat = VK_FORMAT_R8G8B8_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8G8B8_SINT;
vkBufferFormat = VK_FORMAT_R8G8B8_SINT;
vkBufferFormatIsPacked = false;
@@ -1723,10 +1731,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8_SNORM:
- internalFormat = GL_RGB8_SNORM;
- textureFormatID = angle::FormatID::R8G8B8_SNORM;
- vkTextureFormat = VK_FORMAT_R8G8B8_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGB8_SNORM;
+ imageFormatID = angle::FormatID::R8G8B8_SNORM;
+ vkImageFormat = VK_FORMAT_R8G8B8_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8_SNORM, VK_FORMAT_R8G8B8_SNORM, false,
@@ -1738,10 +1746,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8_SSCALED:
- internalFormat = GL_RGB8_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8G8B8_SSCALED;
- vkTextureFormat = VK_FORMAT_R8G8B8_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGB8_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8G8B8_SSCALED;
+ vkImageFormat = VK_FORMAT_R8G8B8_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8_SSCALED, VK_FORMAT_R8G8B8_SSCALED, false,
@@ -1754,9 +1762,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8G8B8_UINT:
internalFormat = GL_RGB8UI;
- textureFormatID = angle::FormatID::R8G8B8_UINT;
- vkTextureFormat = VK_FORMAT_R8G8B8_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8B8_UINT;
+ vkImageFormat = VK_FORMAT_R8G8B8_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8G8B8_UINT;
vkBufferFormat = VK_FORMAT_R8G8B8_UINT;
vkBufferFormatIsPacked = false;
@@ -1765,10 +1773,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8_UNORM:
- internalFormat = GL_RGB8;
- textureFormatID = angle::FormatID::R8G8B8A8_UNORM;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_UNORM;
- textureInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
+ internalFormat = GL_RGB8;
+ imageFormatID = angle::FormatID::R8G8B8A8_UNORM;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_UNORM;
+ imageInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8_UNORM, VK_FORMAT_R8G8B8_UNORM, false,
@@ -1780,22 +1788,22 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8B8_UNORM_SRGB:
- internalFormat = GL_SRGB8;
- textureFormatID = angle::FormatID::R8G8B8A8_UNORM_SRGB;
- vkTextureFormat = VK_FORMAT_R8G8B8A8_SRGB;
- textureInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
- bufferFormatID = angle::FormatID::R8G8B8_UNORM_SRGB;
- vkBufferFormat = VK_FORMAT_R8G8B8_SRGB;
- vkBufferFormatIsPacked = false;
- vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>;
+ internalFormat = GL_SRGB8;
+ imageFormatID = angle::FormatID::R8G8B8A8_UNORM_SRGB;
+ vkImageFormat = VK_FORMAT_R8G8B8A8_SRGB;
+ imageInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
+ bufferFormatID = angle::FormatID::R8G8B8_UNORM_SRGB;
+ vkBufferFormat = VK_FORMAT_R8G8B8_SRGB;
+ vkBufferFormatIsPacked = false;
+ vertexLoadFunction = CopyNativeVertexData<GLubyte, 3, 3, 0>;
vertexLoadRequiresConversion = false;
break;
case angle::FormatID::R8G8B8_USCALED:
- internalFormat = GL_RGB8_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8G8B8_USCALED;
- vkTextureFormat = VK_FORMAT_R8G8B8_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RGB8_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8G8B8_USCALED;
+ vkImageFormat = VK_FORMAT_R8G8B8_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8B8_USCALED, VK_FORMAT_R8G8B8_USCALED, false,
@@ -1808,9 +1816,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8G8_SINT:
internalFormat = GL_RG8I;
- textureFormatID = angle::FormatID::R8G8_SINT;
- vkTextureFormat = VK_FORMAT_R8G8_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8_SINT;
+ vkImageFormat = VK_FORMAT_R8G8_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8G8_SINT;
vkBufferFormat = VK_FORMAT_R8G8_SINT;
vkBufferFormatIsPacked = false;
@@ -1819,10 +1827,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8_SNORM:
- internalFormat = GL_RG8_SNORM;
- textureFormatID = angle::FormatID::R8G8_SNORM;
- vkTextureFormat = VK_FORMAT_R8G8_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG8_SNORM;
+ imageFormatID = angle::FormatID::R8G8_SNORM;
+ vkImageFormat = VK_FORMAT_R8G8_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8_SNORM, VK_FORMAT_R8G8_SNORM, false,
@@ -1834,10 +1842,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8_SSCALED:
- internalFormat = GL_RG8_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8G8_SSCALED;
- vkTextureFormat = VK_FORMAT_R8G8_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG8_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8G8_SSCALED;
+ vkImageFormat = VK_FORMAT_R8G8_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8_SSCALED, VK_FORMAT_R8G8_SSCALED, false,
@@ -1850,9 +1858,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8G8_UINT:
internalFormat = GL_RG8UI;
- textureFormatID = angle::FormatID::R8G8_UINT;
- vkTextureFormat = VK_FORMAT_R8G8_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8G8_UINT;
+ vkImageFormat = VK_FORMAT_R8G8_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8G8_UINT;
vkBufferFormat = VK_FORMAT_R8G8_UINT;
vkBufferFormatIsPacked = false;
@@ -1861,10 +1869,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8_UNORM:
- internalFormat = GL_RG8;
- textureFormatID = angle::FormatID::R8G8_UNORM;
- vkTextureFormat = VK_FORMAT_R8G8_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG8;
+ imageFormatID = angle::FormatID::R8G8_UNORM;
+ vkImageFormat = VK_FORMAT_R8G8_UNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8_UNORM, VK_FORMAT_R8G8_UNORM, false,
@@ -1876,10 +1884,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8G8_USCALED:
- internalFormat = GL_RG8_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8G8_USCALED;
- vkTextureFormat = VK_FORMAT_R8G8_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_RG8_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8G8_USCALED;
+ vkImageFormat = VK_FORMAT_R8G8_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8G8_USCALED, VK_FORMAT_R8G8_USCALED, false,
@@ -1892,9 +1900,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8_SINT:
internalFormat = GL_R8I;
- textureFormatID = angle::FormatID::R8_SINT;
- vkTextureFormat = VK_FORMAT_R8_SINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8_SINT;
+ vkImageFormat = VK_FORMAT_R8_SINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8_SINT;
vkBufferFormat = VK_FORMAT_R8_SINT;
vkBufferFormatIsPacked = false;
@@ -1903,10 +1911,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8_SNORM:
- internalFormat = GL_R8_SNORM;
- textureFormatID = angle::FormatID::R8_SNORM;
- vkTextureFormat = VK_FORMAT_R8_SNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R8_SNORM;
+ imageFormatID = angle::FormatID::R8_SNORM;
+ vkImageFormat = VK_FORMAT_R8_SNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8_SNORM, VK_FORMAT_R8_SNORM, false,
@@ -1918,10 +1926,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8_SSCALED:
- internalFormat = GL_R8_SSCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8_SSCALED;
- vkTextureFormat = VK_FORMAT_R8_SSCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R8_SSCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8_SSCALED;
+ vkImageFormat = VK_FORMAT_R8_SSCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8_SSCALED, VK_FORMAT_R8_SSCALED, false,
@@ -1934,9 +1942,9 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::R8_UINT:
internalFormat = GL_R8UI;
- textureFormatID = angle::FormatID::R8_UINT;
- vkTextureFormat = VK_FORMAT_R8_UINT;
- textureInitializerFunction = nullptr;
+ imageFormatID = angle::FormatID::R8_UINT;
+ vkImageFormat = VK_FORMAT_R8_UINT;
+ imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R8_UINT;
vkBufferFormat = VK_FORMAT_R8_UINT;
vkBufferFormatIsPacked = false;
@@ -1945,10 +1953,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8_UNORM:
- internalFormat = GL_R8;
- textureFormatID = angle::FormatID::R8_UNORM;
- vkTextureFormat = VK_FORMAT_R8_UNORM;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R8;
+ imageFormatID = angle::FormatID::R8_UNORM;
+ vkImageFormat = VK_FORMAT_R8_UNORM;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8_UNORM, VK_FORMAT_R8_UNORM, false,
@@ -1960,10 +1968,10 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R8_USCALED:
- internalFormat = GL_R8_USCALED_ANGLEX;
- textureFormatID = angle::FormatID::R8_USCALED;
- vkTextureFormat = VK_FORMAT_R8_USCALED;
- textureInitializerFunction = nullptr;
+ internalFormat = GL_R8_USCALED_ANGLEX;
+ imageFormatID = angle::FormatID::R8_USCALED;
+ vkImageFormat = VK_FORMAT_R8_USCALED;
+ imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R8_USCALED, VK_FORMAT_R8_USCALED, false,
@@ -1981,12 +1989,12 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
case angle::FormatID::S8_UINT:
internalFormat = GL_STENCIL_INDEX8;
{
- static constexpr TextureFormatInitInfo kInfo[] = {
+ static constexpr ImageFormatInitInfo kInfo[] = {
{angle::FormatID::S8_UINT, VK_FORMAT_S8_UINT, nullptr},
{angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
{angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr},
{angle::FormatID::S8_UINT, VK_FORMAT_S8_UINT, nullptr}};
- initTextureFallback(renderer, kInfo, ArraySize(kInfo));
+ initImageFallback(renderer, kInfo, ArraySize(kInfo));
}
bufferFormatID = angle::FormatID::S8_UINT;
vkBufferFormat = VK_FORMAT_S8_UINT;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
index 8e18f031fd7..cfd2500b6bb 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
@@ -36,13 +36,13 @@ void FillTextureFormatCaps(RendererVk *renderer, VkFormat format, gl::TextureCap
const VkPhysicalDeviceLimits &physicalDeviceLimits =
renderer->getPhysicalDeviceProperties().limits;
bool hasColorAttachmentFeatureBit =
- renderer->hasTextureFormatFeatureBits(format, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
- bool hasDepthAttachmentFeatureBit = renderer->hasTextureFormatFeatureBits(
- format, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);
+ renderer->hasImageFormatFeatureBits(format, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
+ bool hasDepthAttachmentFeatureBit =
+ renderer->hasImageFormatFeatureBits(format, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);
outTextureCaps->texturable =
- renderer->hasTextureFormatFeatureBits(format, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
- outTextureCaps->filterable = renderer->hasTextureFormatFeatureBits(
+ renderer->hasImageFormatFeatureBits(format, VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT);
+ outTextureCaps->filterable = renderer->hasImageFormatFeatureBits(
format, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT);
outTextureCaps->textureAttachment =
hasColorAttachmentFeatureBit || hasDepthAttachmentFeatureBit;
@@ -103,11 +103,11 @@ namespace vk
Format::Format()
: angleFormatID(angle::FormatID::NONE),
internalFormat(GL_NONE),
- textureFormatID(angle::FormatID::NONE),
- vkTextureFormat(VK_FORMAT_UNDEFINED),
+ imageFormatID(angle::FormatID::NONE),
+ vkImageFormat(VK_FORMAT_UNDEFINED),
bufferFormatID(angle::FormatID::NONE),
vkBufferFormat(VK_FORMAT_UNDEFINED),
- textureInitializerFunction(nullptr),
+ imageInitializerFunction(nullptr),
textureLoadFunctions(),
vertexLoadRequiresConversion(false),
vkBufferFormatIsPacked(false),
@@ -116,17 +116,15 @@ Format::Format()
vkFormatIsUnsigned(false)
{}
-void Format::initTextureFallback(RendererVk *renderer,
- const TextureFormatInitInfo *info,
- int numInfo)
+void Format::initImageFallback(RendererVk *renderer, const ImageFormatInitInfo *info, int numInfo)
{
size_t skip = renderer->getFeatures().forceFallbackFormat ? 1 : 0;
int i = FindSupportedFormat(renderer, info + skip, numInfo - skip, HasFullTextureFormatSupport);
i += skip;
- textureFormatID = info[i].format;
- vkTextureFormat = info[i].vkFormat;
- textureInitializerFunction = info[i].initializer;
+ imageFormatID = info[i].format;
+ vkImageFormat = info[i].vkFormat;
+ imageInitializerFunction = info[i].initializer;
}
void Format::initBufferFallback(RendererVk *renderer, const BufferFormatInitInfo *info, int numInfo)
@@ -163,7 +161,7 @@ size_t Format::getImageCopyBufferAlignment() const
// - else blockSize % 4 != 0 gives a 2x multiplier
// - else there's no multiplier.
//
- const angle::Format &format = textureFormat();
+ const angle::Format &format = imageFormat();
if (!format.isBlock)
{
@@ -178,6 +176,18 @@ size_t Format::getImageCopyBufferAlignment() const
return alignment;
}
+bool Format::hasEmulatedImageChannels() const
+{
+ const angle::Format &angleFmt = angleFormat();
+ const angle::Format &textureFmt = imageFormat();
+
+ return (angleFmt.alphaBits == 0 && textureFmt.alphaBits > 0) ||
+ (angleFmt.blueBits == 0 && textureFmt.blueBits > 0) ||
+ (angleFmt.greenBits == 0 && textureFmt.greenBits > 0) ||
+ (angleFmt.depthBits == 0 && textureFmt.depthBits > 0) ||
+ (angleFmt.stencilBits == 0 && textureFmt.stencilBits > 0);
+}
+
bool operator==(const Format &lhs, const Format &rhs)
{
return &lhs == &rhs;
@@ -205,7 +215,6 @@ void FormatTable::initialize(RendererVk *renderer,
format.initialize(renderer, angleFormat);
const GLenum internalFormat = format.internalFormat;
- format.textureLoadFunctions = GetLoadFunctionsMap(internalFormat, format.textureFormatID);
format.angleFormatID = formatID;
if (!format.valid())
@@ -217,9 +226,14 @@ void FormatTable::initialize(RendererVk *renderer,
format.vkBufferFormat, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT);
gl::TextureCaps textureCaps;
- FillTextureFormatCaps(renderer, format.vkTextureFormat, &textureCaps);
+ FillTextureFormatCaps(renderer, format.vkImageFormat, &textureCaps);
outTextureCapsMap->set(formatID, textureCaps);
+ if (textureCaps.texturable)
+ {
+ format.textureLoadFunctions = GetLoadFunctionsMap(internalFormat, format.imageFormatID);
+ }
+
if (angleFormat.isBlock)
{
outCompressedTextureFormats->push_back(internalFormat);
@@ -235,8 +249,8 @@ bool HasFullTextureFormatSupport(RendererVk *renderer, VkFormat vkFormat)
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
constexpr uint32_t kBitsDepth = VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
- return renderer->hasTextureFormatFeatureBits(vkFormat, kBitsColor) ||
- renderer->hasTextureFormatFeatureBits(vkFormat, kBitsDepth);
+ return renderer->hasImageFormatFeatureBits(vkFormat, kBitsColor) ||
+ renderer->hasImageFormatFeatureBits(vkFormat, kBitsDepth);
}
size_t GetVertexInputAlignment(const vk::Format &format)
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.h
index cd02c457aff..d050132a443 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_format_utils.h
@@ -34,7 +34,7 @@ namespace vk
// VkFormat values in range [0, kNumVkFormats) are used as indices in various tables.
constexpr uint32_t kNumVkFormats = 185;
-struct TextureFormatInitInfo final
+struct ImageFormatInitInfo final
{
angle::FormatID format;
VkFormat vkFormat;
@@ -56,30 +56,42 @@ struct Format final : private angle::NonCopyable
bool valid() const { return internalFormat != 0; }
- // This is an auto-generated method in vk_format_table_autogen.cpp.
- void initialize(RendererVk *renderer, const angle::Format &angleFormat);
+ // The ANGLE format is the front-end format.
+ const angle::Format &angleFormat() const { return angle::Format::Get(angleFormatID); }
- void initTextureFallback(RendererVk *renderer, const TextureFormatInitInfo *info, int numInfo);
- void initBufferFallback(RendererVk *renderer, const BufferFormatInitInfo *info, int numInfo);
+ // The Image format is the VkFormat used to implement the front-end format for VkImages.
+ const angle::Format &imageFormat() const { return angle::Format::Get(imageFormatID); }
- const angle::Format &angleFormat() const { return angle::Format::Get(angleFormatID); }
- const angle::Format &textureFormat() const { return angle::Format::Get(textureFormatID); }
+ // The Buffer format is the VkFormat used to implement the front-end format for VkBuffers.
const angle::Format &bufferFormat() const { return angle::Format::Get(bufferFormatID); }
- // Get buffer alignment for image-copy operations (to or from a buffer).
+ // Returns OpenGL format information for the front-end format.
const gl::InternalFormat &getInternalFormatInfo(GLenum type) const
{
return gl::GetInternalFormatInfo(internalFormat, type);
}
+
+ // Get buffer alignment for image-copy operations (to or from a buffer).
size_t getImageCopyBufferAlignment() const;
+ // Returns true if the Image format has more channels than the ANGLE format.
+ bool hasEmulatedImageChannels() const;
+
+ // This is an auto-generated method in vk_format_table_autogen.cpp.
+ void initialize(RendererVk *renderer, const angle::Format &angleFormat);
+
+ // These are used in the format table init.
+ void initImageFallback(RendererVk *renderer, const ImageFormatInitInfo *info, int numInfo);
+ void initBufferFallback(RendererVk *renderer, const BufferFormatInitInfo *info, int numInfo);
+
angle::FormatID angleFormatID;
GLenum internalFormat;
- angle::FormatID textureFormatID;
- VkFormat vkTextureFormat;
+ angle::FormatID imageFormatID;
+ VkFormat vkImageFormat;
angle::FormatID bufferFormatID;
VkFormat vkBufferFormat;
- InitializeTextureDataFunction textureInitializerFunction;
+
+ InitializeTextureDataFunction imageInitializerFunction;
LoadFunctionMap textureLoadFunctions;
VertexCopyFunction vertexLoadFunction;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index 8ba4f80d299..5c9f059a7e7 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -23,6 +23,14 @@ namespace vk
{
namespace
{
+// WebGL requires color textures to be initialized to transparent black.
+constexpr VkClearColorValue kWebGLInitColorValue = {{0, 0, 0, 0}};
+// When emulating a texture, we want the emulated channels to be 0, with alpha 1.
+constexpr VkClearColorValue kEmulatedInitColorValue = {{0, 0, 0, 1.0f}};
+// WebGL requires depth/stencil textures to be initialized to depth=1, stencil=0. We are fine with
+// these values for emulated depth/stencil textures too.
+constexpr VkClearDepthStencilValue kWebGLInitDepthStencilValue = {1.0f, 0};
+
constexpr VkBufferUsageFlags kLineLoopDynamicBufferUsage =
VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
@@ -970,7 +978,7 @@ angle::Result LineLoopHelper::getIndexBufferForElementArrayBuffer(ContextVk *con
{
TRACE_EVENT0("gpu.angle", "LineLoopHelper::getIndexBufferForElementArrayBuffer");
// Needed before reading buffer or we could get stale data.
- ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
+ ANGLE_TRY(contextVk->finishImpl());
void *srcDataMapping = nullptr;
ANGLE_TRY(elementArrayBufferVk->mapImpl(contextVk, &srcDataMapping));
@@ -1060,11 +1068,11 @@ void LineLoopHelper::destroy(VkDevice device)
}
// static
-void LineLoopHelper::Draw(uint32_t count, CommandBuffer *commandBuffer)
+void LineLoopHelper::Draw(uint32_t count, vk::CommandBuffer *commandBuffer)
{
// Our first index is always 0 because that's how we set it up in createIndexBuffer*.
// Note: this could theoretically overflow and wrap to zero.
- commandBuffer->drawIndexed(count + 1, 1, 0, 0, 0);
+ commandBuffer->drawIndexed(count + 1);
}
// BufferHelper implementation.
@@ -1257,6 +1265,7 @@ ImageHelper::ImageHelper(ImageHelper &&other)
mStagingBuffer(std::move(other.mStagingBuffer)),
mSubresourceUpdates(std::move(other.mSubresourceUpdates))
{
+ ASSERT(this != &other);
other.mCurrentLayout = ImageLayout::Undefined;
other.mLayerCount = 0;
other.mLevelCount = 0;
@@ -1315,7 +1324,7 @@ angle::Result ImageHelper::initExternal(Context *context,
imageInfo.pNext = externalImageCreateInfo;
imageInfo.flags = GetImageCreateFlags(textureType);
imageInfo.imageType = gl_vk::GetImageType(textureType);
- imageInfo.format = format.vkTextureFormat;
+ imageInfo.format = format.vkImageFormat;
imageInfo.extent.width = static_cast<uint32_t>(extents.width);
imageInfo.extent.height = static_cast<uint32_t>(extents.height);
imageInfo.extent.depth = 1;
@@ -1410,7 +1419,7 @@ angle::Result ImageHelper::initLayerImageView(Context *context,
viewInfo.flags = 0;
viewInfo.image = mImage.getHandle();
viewInfo.viewType = gl_vk::GetImageViewType(textureType);
- viewInfo.format = mFormat->vkTextureFormat;
+ viewInfo.format = mFormat->vkImageFormat;
if (swizzleMap.swizzleRequired())
{
viewInfo.components.r = gl_vk::GetSwizzle(swizzleMap.swizzleRed);
@@ -1482,7 +1491,7 @@ angle::Result ImageHelper::init2DStaging(Context *context,
imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
imageInfo.flags = 0;
imageInfo.imageType = VK_IMAGE_TYPE_2D;
- imageInfo.format = format.vkTextureFormat;
+ imageInfo.format = format.vkImageFormat;
imageInfo.extent.width = static_cast<uint32_t>(extents.width);
imageInfo.extent.height = static_cast<uint32_t>(extents.height);
imageInfo.extent.depth = 1;
@@ -1507,7 +1516,7 @@ angle::Result ImageHelper::init2DStaging(Context *context,
VkImageAspectFlags ImageHelper::getAspectFlags() const
{
- return GetFormatAspectFlags(mFormat->textureFormat());
+ return GetFormatAspectFlags(mFormat->imageFormat());
}
void ImageHelper::dumpResources(Serial serial, std::vector<GarbageObject> *garbageQueue)
@@ -1516,34 +1525,17 @@ void ImageHelper::dumpResources(Serial serial, std::vector<GarbageObject> *garba
mDeviceMemory.dumpResources(serial, garbageQueue);
}
-const Image &ImageHelper::getImage() const
-{
- return mImage;
-}
-
-const DeviceMemory &ImageHelper::getDeviceMemory() const
-{
- return mDeviceMemory;
-}
-
-const gl::Extents &ImageHelper::getExtents() const
-{
- return mExtents;
-}
-
-const Format &ImageHelper::getFormat() const
+VkImageLayout ImageHelper::getCurrentLayout() const
{
- return *mFormat;
+ return kImageMemoryBarrierData[mCurrentLayout].layout;
}
-GLint ImageHelper::getSamples() const
+gl::Extents ImageHelper::getLevelExtents2D(uint32_t level) const
{
- return mSamples;
-}
+ int width = std::max(mExtents.width >> level, 1);
+ int height = std::max(mExtents.height >> level, 1);
-VkImageLayout ImageHelper::getCurrentLayout() const
-{
- return kImageMemoryBarrierData[mCurrentLayout].layout;
+ return gl::Extents(width, height, 1);
}
bool ImageHelper::isLayoutChangeNecessary(ImageLayout newLayout) const
@@ -1558,7 +1550,7 @@ bool ImageHelper::isLayoutChangeNecessary(ImageLayout newLayout) const
void ImageHelper::changeLayout(VkImageAspectFlags aspectMask,
ImageLayout newLayout,
- CommandBuffer *commandBuffer)
+ vk::CommandBuffer *commandBuffer)
{
if (!isLayoutChangeNecessary(newLayout))
{
@@ -1571,7 +1563,7 @@ void ImageHelper::changeLayout(VkImageAspectFlags aspectMask,
void ImageHelper::changeLayoutAndQueue(VkImageAspectFlags aspectMask,
ImageLayout newLayout,
uint32_t newQueueFamilyIndex,
- CommandBuffer *commandBuffer)
+ vk::CommandBuffer *commandBuffer)
{
ASSERT(isQueueChangeNeccesary(newQueueFamilyIndex));
forceChangeLayoutAndQueue(aspectMask, newLayout, newQueueFamilyIndex, commandBuffer);
@@ -1580,7 +1572,7 @@ void ImageHelper::changeLayoutAndQueue(VkImageAspectFlags aspectMask,
void ImageHelper::forceChangeLayoutAndQueue(VkImageAspectFlags aspectMask,
ImageLayout newLayout,
uint32_t newQueueFamilyIndex,
- CommandBuffer *commandBuffer)
+ vk::CommandBuffer *commandBuffer)
{
const ImageMemoryBarrierData &transitionFrom = kImageMemoryBarrierData[mCurrentLayout];
@@ -1603,28 +1595,18 @@ void ImageHelper::forceChangeLayoutAndQueue(VkImageAspectFlags aspectMask,
imageMemoryBarrier.subresourceRange.baseArrayLayer = 0;
imageMemoryBarrier.subresourceRange.layerCount = mLayerCount;
- commandBuffer->pipelineBarrier(transitionFrom.srcStageMask, transitionTo.dstStageMask, 0, 0,
- nullptr, 0, nullptr, 1, &imageMemoryBarrier);
-
- mCurrentLayout = newLayout;
+ commandBuffer->imageBarrier(transitionFrom.srcStageMask, transitionTo.dstStageMask,
+ &imageMemoryBarrier);
+ mCurrentLayout = newLayout;
mCurrentQueueFamilyIndex = newQueueFamilyIndex;
}
void ImageHelper::clearColor(const VkClearColorValue &color,
uint32_t baseMipLevel,
uint32_t levelCount,
- CommandBuffer *commandBuffer)
-
-{
- clearColorLayer(color, baseMipLevel, levelCount, 0, mLayerCount, commandBuffer);
-}
-
-void ImageHelper::clearColorLayer(const VkClearColorValue &color,
- uint32_t baseMipLevel,
- uint32_t levelCount,
- uint32_t baseArrayLayer,
- uint32_t layerCount,
- CommandBuffer *commandBuffer)
+ uint32_t baseArrayLayer,
+ uint32_t layerCount,
+ vk::CommandBuffer *commandBuffer)
{
ASSERT(valid());
@@ -1643,7 +1625,7 @@ void ImageHelper::clearColorLayer(const VkClearColorValue &color,
void ImageHelper::clearDepthStencil(VkImageAspectFlags imageAspectFlags,
VkImageAspectFlags clearAspectFlags,
const VkClearDepthStencilValue &depthStencil,
- CommandBuffer *commandBuffer)
+ vk::CommandBuffer *commandBuffer)
{
ASSERT(valid());
@@ -1660,6 +1642,27 @@ void ImageHelper::clearDepthStencil(VkImageAspectFlags imageAspectFlags,
commandBuffer->clearDepthStencilImage(mImage, getCurrentLayout(), depthStencil, 1, &clearRange);
}
+void ImageHelper::clear(const VkClearValue &value,
+ uint32_t mipLevel,
+ uint32_t baseArrayLayer,
+ uint32_t layerCount,
+ vk::CommandBuffer *commandBuffer)
+{
+ const angle::Format &angleFormat = mFormat->angleFormat();
+ bool isDepthStencil = angleFormat.depthBits > 0 || angleFormat.stencilBits > 0;
+
+ if (isDepthStencil)
+ {
+ ASSERT(mipLevel == 0 && baseArrayLayer == 0 && layerCount == 1);
+ const VkImageAspectFlags aspect = vk::GetDepthStencilAspectFlags(mFormat->imageFormat());
+ clearDepthStencil(aspect, aspect, value.depthStencil, commandBuffer);
+ }
+ else
+ {
+ clearColor(value.color, mipLevel, 1, baseArrayLayer, layerCount, commandBuffer);
+ }
+}
+
gl::Extents ImageHelper::getSize(const gl::ImageIndex &index) const
{
ASSERT(mExtents.depth == 1);
@@ -1678,7 +1681,7 @@ void ImageHelper::Copy(ImageHelper *srcImage,
const gl::Extents &copySize,
const VkImageSubresourceLayers &srcSubresource,
const VkImageSubresourceLayers &dstSubresource,
- CommandBuffer *commandBuffer)
+ vk::CommandBuffer *commandBuffer)
{
ASSERT(commandBuffer->valid() && srcImage->valid() && dstImage->valid());
@@ -1738,10 +1741,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
// We can do it for all layers at once.
- commandBuffer->pipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
- VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1,
- &barrier);
-
+ commandBuffer->imageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+ &barrier);
VkImageBlit blit = {};
blit.srcOffsets[0] = {0, 0, 0};
blit.srcOffsets[1] = {mipWidth, mipHeight, 1};
@@ -1770,9 +1771,8 @@ angle::Result ImageHelper::generateMipmapsWithBlit(ContextVk *contextVk, GLuint
barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
// We can do it for all layers at once.
- commandBuffer->pipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
- 0, 0, nullptr, 0, nullptr, 1, &barrier);
-
+ commandBuffer->imageBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+ &barrier);
// This is just changing the internal state of the image helper so that the next call
// to changeLayout will use this layout as the "oldLayout" argument.
mCurrentLayout = ImageLayout::TransferSrc;
@@ -1808,7 +1808,8 @@ angle::Result ImageHelper::stageSubresourceUpdate(ContextVk *contextVk,
const gl::InternalFormat &formatInfo,
const gl::PixelUnpackState &unpack,
GLenum type,
- const uint8_t *pixels)
+ const uint8_t *pixels,
+ const vk::Format &vkFormat)
{
GLuint inputRowPitch = 0;
ANGLE_VK_CHECK_MATH(contextVk, formatInfo.computeRowPitch(type, extents.width, unpack.alignment,
@@ -1827,10 +1828,7 @@ angle::Result ImageHelper::stageSubresourceUpdate(ContextVk *contextVk,
formatInfo.computeSkipBytes(type, inputRowPitch, inputDepthPitch, unpack,
applySkipImages, &inputSkipBytes));
- RendererVk *renderer = contextVk->getRenderer();
-
- const vk::Format &vkFormat = renderer->getFormat(formatInfo.sizedInternalFormat);
- const angle::Format &storageFormat = vkFormat.textureFormat();
+ const angle::Format &storageFormat = vkFormat.imageFormat();
size_t outputRowPitch;
size_t outputDepthPitch;
@@ -1865,13 +1863,13 @@ angle::Result ImageHelper::stageSubresourceUpdate(ContextVk *contextVk,
}
else
{
+ ASSERT(storageFormat.pixelBytes != 0);
+
outputRowPitch = storageFormat.pixelBytes * extents.width;
outputDepthPitch = outputRowPitch * extents.height;
bufferRowLength = extents.width;
bufferImageHeight = extents.height;
-
- ASSERT(storageFormat.pixelBytes != 0);
}
VkBuffer bufferHandle = VK_NULL_HANDLE;
@@ -1967,7 +1965,7 @@ angle::Result ImageHelper::stageSubresourceUpdateFromFramebuffer(
RendererVk *renderer = contextVk->getRenderer();
const vk::Format &vkFormat = renderer->getFormat(formatInfo.sizedInternalFormat);
- const angle::Format &storageFormat = vkFormat.textureFormat();
+ const angle::Format &storageFormat = vkFormat.imageFormat();
LoadImageFunctionInfo loadFunction = vkFormat.textureLoadFunctions(formatInfo.type);
size_t outputRowPitch = storageFormat.pixelBytes * clippedRectangle.width;
@@ -2051,6 +2049,53 @@ void ImageHelper::stageSubresourceUpdateFromImage(vk::ImageHelper *image,
mSubresourceUpdates.emplace_back(image, copyToImage);
}
+void ImageHelper::stageSubresourceRobustClear(const gl::ImageIndex &index,
+ const angle::Format &format)
+{
+ stageSubresourceClear(index, format, kWebGLInitColorValue, kWebGLInitDepthStencilValue);
+}
+
+void ImageHelper::stageSubresourceEmulatedClear(const gl::ImageIndex &index,
+ const angle::Format &format)
+{
+ stageSubresourceClear(index, format, kEmulatedInitColorValue, kWebGLInitDepthStencilValue);
+}
+
+angle::Result ImageHelper::clearIfEmulatedFormat(Context *context,
+ const gl::ImageIndex &index,
+ const Format &format)
+{
+ if (format.hasEmulatedImageChannels())
+ {
+ stageSubresourceEmulatedClear(index, format.angleFormat());
+ ANGLE_TRY(flushAllStagedUpdates(context));
+ }
+
+ return angle::Result::Continue;
+}
+
+void ImageHelper::stageSubresourceClear(const gl::ImageIndex &index,
+ const angle::Format &format,
+ const VkClearColorValue &colorValue,
+ const VkClearDepthStencilValue &depthStencilValue)
+{
+ VkClearValue clearValue;
+
+ bool isDepthStencil = format.depthBits > 0 || format.stencilBits > 0;
+ if (isDepthStencil)
+ {
+ clearValue.depthStencil = depthStencilValue;
+ }
+ else
+ {
+ clearValue.color = colorValue;
+ }
+
+ // Note that clears can arrive out of order from the front-end with respect to staged changes,
+ // but they are intended to be done first.
+ mSubresourceUpdates.emplace(mSubresourceUpdates.begin(), clearValue, index);
+}
+
angle::Result ImageHelper::allocateStagingMemory(ContextVk *contextVk,
size_t sizeInBytes,
uint8_t **ptrOut,
@@ -2063,8 +2108,10 @@ angle::Result ImageHelper::allocateStagingMemory(ContextVk *contextVk,
}
angle::Result ImageHelper::flushStagedUpdates(Context *context,
- uint32_t baseLevel,
- uint32_t levelCount,
+ uint32_t levelStart,
+ uint32_t levelEnd,
+ uint32_t layerStart,
+ uint32_t layerEnd,
vk::CommandBuffer *commandBuffer)
{
if (mSubresourceUpdates.empty())
@@ -2077,40 +2124,69 @@ angle::Result ImageHelper::flushStagedUpdates(Context *context,
ANGLE_TRY(mStagingBuffer.flush(context));
std::vector<SubresourceUpdate> updatesToKeep;
+ const VkImageAspectFlags aspectFlags = GetFormatAspectFlags(mFormat->imageFormat());
for (SubresourceUpdate &update : mSubresourceUpdates)
{
- ASSERT((update.updateSource == SubresourceUpdate::UpdateSource::Buffer &&
+ ASSERT(update.updateSource == SubresourceUpdate::UpdateSource::Clear ||
+ (update.updateSource == SubresourceUpdate::UpdateSource::Buffer &&
update.buffer.bufferHandle != VK_NULL_HANDLE) ||
(update.updateSource == SubresourceUpdate::UpdateSource::Image &&
update.image.image != nullptr && update.image.image->valid()));
- const uint32_t updateMipLevel = update.dstSubresource().mipLevel;
+ uint32_t updateMipLevel;
+ uint32_t updateBaseLayer;
+ uint32_t updateLayerCount;
+ if (update.updateSource == SubresourceUpdate::UpdateSource::Clear)
+ {
+ updateMipLevel = update.clear.levelIndex;
+ updateBaseLayer = update.clear.layerIndex;
+ updateLayerCount = update.clear.layerCount;
+ if (updateLayerCount == static_cast<uint32_t>(gl::ImageIndex::kEntireLevel))
+ {
+ updateLayerCount = mLayerCount;
+ }
+ }
+ else
+ {
+ const VkImageSubresourceLayers &dstSubresource = update.dstSubresource();
+ updateMipLevel = dstSubresource.mipLevel;
+ updateBaseLayer = dstSubresource.baseArrayLayer;
+ updateLayerCount = dstSubresource.layerCount;
+ }
+
+ // If the update level is not within the requested range, skip the update.
+ const bool isUpdateLevelOutsideRange =
+ updateMipLevel < levelStart || updateMipLevel >= levelEnd;
+ // If the update layers don't intersect the requested layers, skip the update.
+ const bool areUpdateLayersOutsideRange =
+ updateBaseLayer + updateLayerCount <= layerStart || updateBaseLayer >= layerEnd;
- // It's possible we've accumulated updates that are no longer applicable if the image has
- // never been flushed but the image description has changed. Check if this level exist for
- // this image.
- if (updateMipLevel < baseLevel || updateMipLevel >= baseLevel + levelCount)
+ if (isUpdateLevelOutsideRange || areUpdateLayersOutsideRange)
{
updatesToKeep.emplace_back(update);
continue;
}
- // Conservatively flush all writes to the image. We could use a more restricted barrier.
- // Do not move this above the for loop, otherwise multiple updates can have race conditions
- // and not be applied correctly as seen in:
- // dEQP-gles2.functional_texture_specification_texsubimage2d_align_2d* tests on Windows AMD
- changeLayout(VK_IMAGE_ASPECT_COLOR_BIT, vk::ImageLayout::TransferDst, commandBuffer);
+ // Conservatively add a barrier between every update. This is to avoid races when updating
+ // the same subresource. A possible optimization could be to only issue this barrier when
+ // an overlap in updates is observed.
+ changeLayout(aspectFlags, vk::ImageLayout::TransferDst, commandBuffer);
- if (update.updateSource == SubresourceUpdate::UpdateSource::Buffer)
+ if (update.updateSource == SubresourceUpdate::UpdateSource::Clear)
+ {
+ clear(update.clear.value, updateMipLevel, updateBaseLayer, updateLayerCount,
+ commandBuffer);
+ }
+ else if (update.updateSource == SubresourceUpdate::UpdateSource::Buffer)
{
commandBuffer->copyBufferToImage(update.buffer.bufferHandle, mImage, getCurrentLayout(),
1, &update.buffer.copyRegion);
}
else
{
- update.image.image->changeLayout(VK_IMAGE_ASPECT_COLOR_BIT,
- vk::ImageLayout::TransferSrc, commandBuffer);
+ update.image.image->changeLayout(aspectFlags, vk::ImageLayout::TransferSrc,
+ commandBuffer);
update.image.image->addReadDependency(this);
@@ -2129,18 +2205,16 @@ angle::Result ImageHelper::flushStagedUpdates(Context *context,
{
mStagingBuffer.releaseRetainedBuffers(context->getRenderer());
}
- else
- {
- WARN() << "Internal Vulkan buffer could not be released. This is likely due to having "
- "extra images defined in the Texture.";
- }
return angle::Result::Continue;
}
-bool ImageHelper::hasStagedUpdates() const
+angle::Result ImageHelper::flushAllStagedUpdates(Context *context)
{
- return !mSubresourceUpdates.empty();
+ // Clear the image.
+ vk::CommandBuffer *commandBuffer = nullptr;
+ ANGLE_TRY(recordCommands(context, &commandBuffer));
+ return flushStagedUpdates(context, 0, mLevelCount, 0, mLayerCount, commandBuffer);
}
// ImageHelper::SubresourceUpdate implementation
@@ -2158,10 +2232,24 @@ ImageHelper::SubresourceUpdate::SubresourceUpdate(vk::ImageHelper *imageIn,
: updateSource(UpdateSource::Image), image{imageIn, copyRegionIn}
{}
+ImageHelper::SubresourceUpdate::SubresourceUpdate(const VkClearValue &clearValue,
+ const gl::ImageIndex &imageIndex)
+ : updateSource(UpdateSource::Clear)
+{
+ clear.value = clearValue;
+ clear.levelIndex = imageIndex.getLevelIndex();
+ clear.layerIndex = imageIndex.hasLayer() ? imageIndex.getLayerIndex() : 0;
+ clear.layerCount = imageIndex.getLayerCount();
+}
+
ImageHelper::SubresourceUpdate::SubresourceUpdate(const SubresourceUpdate &other)
: updateSource(other.updateSource)
{
- if (updateSource == UpdateSource::Buffer)
+ if (updateSource == UpdateSource::Clear)
+ {
+ clear = other.clear;
+ }
+ else if (updateSource == UpdateSource::Buffer)
{
buffer = other.buffer;
}
@@ -2184,6 +2272,11 @@ void ImageHelper::SubresourceUpdate::release(RendererVk *renderer)
bool ImageHelper::SubresourceUpdate::isUpdateToLayerLevel(uint32_t layerIndex,
uint32_t levelIndex) const
{
+ if (updateSource == UpdateSource::Clear)
+ {
+ return clear.levelIndex == levelIndex && clear.layerIndex == layerIndex;
+ }
+
const VkImageSubresourceLayers &dst = dstSubresource();
return dst.baseArrayLayer == layerIndex && dst.mipLevel == levelIndex;
}
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h
index b0853a81cfb..fc437f6e9d3 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -379,7 +379,7 @@ class LineLoopHelper final : angle::NonCopyable
void release(RendererVk *renderer);
void destroy(VkDevice device);
- static void Draw(uint32_t count, CommandBuffer *commandBuffer);
+ static void Draw(uint32_t count, vk::CommandBuffer *commandBuffer);
private:
DynamicBuffer mDynamicIndexBuffer;
@@ -599,33 +599,28 @@ class ImageHelper final : public CommandGraphResource
GLint samples);
void resetImageWeakReference();
- const Image &getImage() const;
- const DeviceMemory &getDeviceMemory() const;
+ const Image &getImage() const { return mImage; }
+ const DeviceMemory &getDeviceMemory() const { return mDeviceMemory; }
- const gl::Extents &getExtents() const;
+ const gl::Extents &getExtents() const { return mExtents; }
uint32_t getLayerCount() const { return mLayerCount; }
uint32_t getLevelCount() const { return mLevelCount; }
- const Format &getFormat() const;
- GLint getSamples() const;
+ const Format &getFormat() const { return *mFormat; }
+ GLint getSamples() const { return mSamples; }
VkImageLayout getCurrentLayout() const;
- void clearColor(const VkClearColorValue &color,
- uint32_t baseMipLevel,
- uint32_t levelCount,
- CommandBuffer *commandBuffer);
+ // Helper function to calculate the extents of a render target created for a certain mip of the
+ // image.
+ gl::Extents getLevelExtents2D(uint32_t level) const;
- void clearColorLayer(const VkClearColorValue &color,
- uint32_t baseMipLevel,
- uint32_t levelCount,
- uint32_t baseArrayLayer,
- uint32_t layerCount,
- CommandBuffer *commandBuffer);
+ // Clear either color or depth/stencil based on image format.
+ void clear(const VkClearValue &value,
+ uint32_t mipLevel,
+ uint32_t baseArrayLayer,
+ uint32_t layerCount,
+ vk::CommandBuffer *commandBuffer);
- void clearDepthStencil(VkImageAspectFlags imageAspectFlags,
- VkImageAspectFlags clearAspectFlags,
- const VkClearDepthStencilValue &depthStencil,
- CommandBuffer *commandBuffer);
gl::Extents getSize(const gl::ImageIndex &index) const;
static void Copy(ImageHelper *srcImage,
@@ -635,7 +630,7 @@ class ImageHelper final : public CommandGraphResource
const gl::Extents &copySize,
const VkImageSubresourceLayers &srcSubresources,
const VkImageSubresourceLayers &dstSubresources,
- CommandBuffer *commandBuffer);
+ vk::CommandBuffer *commandBuffer);
angle::Result generateMipmapsWithBlit(ContextVk *contextVk, GLuint maxLevel);
@@ -649,7 +644,8 @@ class ImageHelper final : public CommandGraphResource
const gl::InternalFormat &formatInfo,
const gl::PixelUnpackState &unpack,
GLenum type,
- const uint8_t *pixels);
+ const uint8_t *pixels,
+ const vk::Format &vkFormat);
angle::Result stageSubresourceUpdateAndGetData(ContextVk *contextVk,
size_t allocationSize,
@@ -671,6 +667,19 @@ class ImageHelper final : public CommandGraphResource
const gl::Offset &destOffset,
const gl::Extents &extents);
+ // Stage a clear operation to a clear value based on WebGL requirements.
+ void stageSubresourceRobustClear(const gl::ImageIndex &index, const angle::Format &format);
+
+ // Stage a clear operation to a clear value that initializes emulated channels to the desired
+ // values.
+ void stageSubresourceEmulatedClear(const gl::ImageIndex &index, const angle::Format &format);
+
+ // If the image has emulated channels, we clear them once so as not to leave garbage on those
+ // channels.
+ angle::Result clearIfEmulatedFormat(Context *context,
+ const gl::ImageIndex &index,
+ const Format &format);
+
// This will use the underlying dynamic buffer to allocate some memory to be used as a src or
// dst.
angle::Result allocateStagingMemory(ContextVk *contextVk,
@@ -680,12 +689,21 @@ class ImageHelper final : public CommandGraphResource
VkDeviceSize *offsetOut,
bool *newBufferAllocatedOut);
+ // Flushes staged updates to a range of levels and layers from start to (but not including) end.
+ // Due to the nature of updates (done wholly to a VkImageSubresourceLayers), some unsolicited
+ // layers may also be updated.
angle::Result flushStagedUpdates(Context *context,
- uint32_t baseLevel,
- uint32_t levelCount,
+ uint32_t levelStart,
+ uint32_t levelEnd,
+ uint32_t layerStart,
+ uint32_t layerEnd,
vk::CommandBuffer *commandBuffer);
+ // Creates a command buffer and flushes all staged updates. This is used for one-time
+ // initialization of resources that we don't expect to accumulate further staged updates, such
+ // as with renderbuffers or surface images.
+ angle::Result flushAllStagedUpdates(Context *context);
- bool hasStagedUpdates() const;
+ bool hasStagedUpdates() const { return !mSubresourceUpdates.empty(); }
// changeLayout automatically skips the layout change if it's unnecessary. This function can be
// used to prevent creating a command graph node and subsequently a command buffer for the sole
@@ -694,7 +712,7 @@ class ImageHelper final : public CommandGraphResource
void changeLayout(VkImageAspectFlags aspectMask,
ImageLayout newLayout,
- CommandBuffer *commandBuffer);
+ vk::CommandBuffer *commandBuffer);
bool isQueueChangeNeccesary(uint32_t newQueueFamilyIndex) const
{
@@ -704,25 +722,44 @@ class ImageHelper final : public CommandGraphResource
void changeLayoutAndQueue(VkImageAspectFlags aspectMask,
ImageLayout newLayout,
uint32_t newQueueFamilyIndex,
- CommandBuffer *commandBuffer);
+ vk::CommandBuffer *commandBuffer);
private:
void forceChangeLayoutAndQueue(VkImageAspectFlags aspectMask,
ImageLayout newLayout,
uint32_t newQueueFamilyIndex,
- CommandBuffer *commandBuffer);
+ vk::CommandBuffer *commandBuffer);
+
+ void stageSubresourceClear(const gl::ImageIndex &index,
+ const angle::Format &format,
+ const VkClearColorValue &colorValue,
+ const VkClearDepthStencilValue &depthStencilValue);
+
+ void clearColor(const VkClearColorValue &color,
+ uint32_t baseMipLevel,
+ uint32_t levelCount,
+ uint32_t baseArrayLayer,
+ uint32_t layerCount,
+ vk::CommandBuffer *commandBuffer);
+
+ void clearDepthStencil(VkImageAspectFlags imageAspectFlags,
+ VkImageAspectFlags clearAspectFlags,
+ const VkClearDepthStencilValue &depthStencil,
+ vk::CommandBuffer *commandBuffer);
struct SubresourceUpdate
{
SubresourceUpdate();
SubresourceUpdate(VkBuffer bufferHandle, const VkBufferImageCopy &copyRegion);
SubresourceUpdate(vk::ImageHelper *image, const VkImageCopy &copyRegion);
+ SubresourceUpdate(const VkClearValue &clearValue, const gl::ImageIndex &imageIndex);
SubresourceUpdate(const SubresourceUpdate &other);
void release(RendererVk *renderer);
const VkImageSubresourceLayers &dstSubresource() const
{
+ ASSERT(updateSource == UpdateSource::Buffer || updateSource == UpdateSource::Image);
return updateSource == UpdateSource::Buffer ? buffer.copyRegion.imageSubresource
: image.copyRegion.dstSubresource;
}
@@ -730,9 +767,17 @@ class ImageHelper final : public CommandGraphResource
enum class UpdateSource
{
+ Clear,
Buffer,
Image,
};
+ struct ClearUpdate
+ {
+ VkClearValue value;
+ uint32_t levelIndex;
+ uint32_t layerIndex;
+ uint32_t layerCount;
+ };
struct BufferUpdate
{
VkBuffer bufferHandle;
@@ -747,6 +792,7 @@ class ImageHelper final : public CommandGraphResource
UpdateSource updateSource;
union
{
+ ClearUpdate clear;
BufferUpdate buffer;
ImageUpdate image;
};
@@ -840,10 +886,15 @@ class ShaderProgramHelper : angle::NonCopyable
ANGLE_TRY(renderPassCache->getCompatibleRenderPass(
context, currentQueueSerial, pipelineDesc.getRenderPassDesc(), &compatibleRenderPass));
- return mGraphicsPipelines.getPipeline(
- context, pipelineCache, *compatibleRenderPass, pipelineLayout,
- activeAttribLocationsMask, mShaders[gl::ShaderType::Vertex].get().get(),
- mShaders[gl::ShaderType::Fragment].get().get(), pipelineDesc, descPtrOut, pipelineOut);
+ ShaderModule *vertexShader = &mShaders[gl::ShaderType::Vertex].get().get();
+ ShaderModule *fragmentShader = mShaders[gl::ShaderType::Fragment].valid()
+ ? &mShaders[gl::ShaderType::Fragment].get().get()
+ : nullptr;
+
+ return mGraphicsPipelines.getPipeline(context, pipelineCache, *compatibleRenderPass,
+ pipelineLayout, activeAttribLocationsMask,
+ vertexShader, fragmentShader, pipelineDesc,
+ descPtrOut, pipelineOut);
}
angle::Result getComputePipeline(Context *context,
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp
index fdf5dc0285c..2056ee8d074 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp
@@ -46,6 +46,29 @@ namespace
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc"
@@ -109,6 +132,29 @@ constexpr ShaderBlob kFullScreenQuad_vert_shaders[] = {
};
constexpr ShaderBlob kImageClear_frag_shaders[] = {
{kImageClear_frag_00000000, sizeof(kImageClear_frag_00000000)},
+ {kImageClear_frag_00000001, sizeof(kImageClear_frag_00000001)},
+ {kImageClear_frag_00000002, sizeof(kImageClear_frag_00000002)},
+ {kImageClear_frag_00000003, sizeof(kImageClear_frag_00000003)},
+ {kImageClear_frag_00000004, sizeof(kImageClear_frag_00000004)},
+ {kImageClear_frag_00000005, sizeof(kImageClear_frag_00000005)},
+ {kImageClear_frag_00000006, sizeof(kImageClear_frag_00000006)},
+ {kImageClear_frag_00000007, sizeof(kImageClear_frag_00000007)},
+ {kImageClear_frag_00000008, sizeof(kImageClear_frag_00000008)},
+ {kImageClear_frag_00000009, sizeof(kImageClear_frag_00000009)},
+ {kImageClear_frag_0000000A, sizeof(kImageClear_frag_0000000A)},
+ {kImageClear_frag_0000000B, sizeof(kImageClear_frag_0000000B)},
+ {kImageClear_frag_0000000C, sizeof(kImageClear_frag_0000000C)},
+ {kImageClear_frag_0000000D, sizeof(kImageClear_frag_0000000D)},
+ {kImageClear_frag_0000000E, sizeof(kImageClear_frag_0000000E)},
+ {kImageClear_frag_0000000F, sizeof(kImageClear_frag_0000000F)},
+ {kImageClear_frag_00000010, sizeof(kImageClear_frag_00000010)},
+ {kImageClear_frag_00000011, sizeof(kImageClear_frag_00000011)},
+ {kImageClear_frag_00000012, sizeof(kImageClear_frag_00000012)},
+ {kImageClear_frag_00000013, sizeof(kImageClear_frag_00000013)},
+ {kImageClear_frag_00000014, sizeof(kImageClear_frag_00000014)},
+ {kImageClear_frag_00000015, sizeof(kImageClear_frag_00000015)},
+ {kImageClear_frag_00000016, sizeof(kImageClear_frag_00000016)},
+ {kImageClear_frag_00000017, sizeof(kImageClear_frag_00000017)},
};
constexpr ShaderBlob kImageCopy_frag_shaders[] = {
{kImageCopy_frag_00000000, sizeof(kImageCopy_frag_00000000)},
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni
index 810f544c4f7..ecc388d3f48 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni
@@ -39,6 +39,29 @@ angle_vulkan_internal_shaders = [
"shaders/gen/ConvertVertex.comp.0000000F.inc",
"shaders/gen/FullScreenQuad.vert.00000000.inc",
"shaders/gen/ImageClear.frag.00000000.inc",
+ "shaders/gen/ImageClear.frag.00000001.inc",
+ "shaders/gen/ImageClear.frag.00000002.inc",
+ "shaders/gen/ImageClear.frag.00000003.inc",
+ "shaders/gen/ImageClear.frag.00000004.inc",
+ "shaders/gen/ImageClear.frag.00000005.inc",
+ "shaders/gen/ImageClear.frag.00000006.inc",
+ "shaders/gen/ImageClear.frag.00000007.inc",
+ "shaders/gen/ImageClear.frag.00000008.inc",
+ "shaders/gen/ImageClear.frag.00000009.inc",
+ "shaders/gen/ImageClear.frag.0000000A.inc",
+ "shaders/gen/ImageClear.frag.0000000B.inc",
+ "shaders/gen/ImageClear.frag.0000000C.inc",
+ "shaders/gen/ImageClear.frag.0000000D.inc",
+ "shaders/gen/ImageClear.frag.0000000E.inc",
+ "shaders/gen/ImageClear.frag.0000000F.inc",
+ "shaders/gen/ImageClear.frag.00000010.inc",
+ "shaders/gen/ImageClear.frag.00000011.inc",
+ "shaders/gen/ImageClear.frag.00000012.inc",
+ "shaders/gen/ImageClear.frag.00000013.inc",
+ "shaders/gen/ImageClear.frag.00000014.inc",
+ "shaders/gen/ImageClear.frag.00000015.inc",
+ "shaders/gen/ImageClear.frag.00000016.inc",
+ "shaders/gen/ImageClear.frag.00000017.inc",
"shaders/gen/ImageCopy.frag.00000000.inc",
"shaders/gen/ImageCopy.frag.00000001.inc",
"shaders/gen/ImageCopy.frag.00000002.inc",
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h
index b42271df413..fea5ae2abf1 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h
@@ -66,7 +66,27 @@ namespace FullScreenQuad_vert
{} // namespace FullScreenQuad_vert
namespace ImageClear_frag
-{} // namespace ImageClear_frag
+{
+enum AttachmentIndex
+{
+ kAttachment0 = 0x00000000,
+ kAttachment1 = 0x00000001,
+ kAttachment2 = 0x00000002,
+ kAttachment3 = 0x00000003,
+ kAttachment4 = 0x00000004,
+ kAttachment5 = 0x00000005,
+ kAttachment6 = 0x00000006,
+ kAttachment7 = 0x00000007,
+ kAttachmentIndexMask = 0x00000007,
+};
+enum Format
+{
+ kIsFloat = 0x00000000,
+ kIsInt = 0x00000008,
+ kIsUint = 0x00000010,
+ kFormatMask = 0x00000018,
+};
+} // namespace ImageClear_frag
namespace ImageCopy_frag
{
@@ -126,7 +146,9 @@ class ShaderLibrary final : angle::NonCopyable
mConvertVertex_comp_shaders[InternalShader::ConvertVertex_comp::kFlagsMask |
InternalShader::ConvertVertex_comp::kConversionMask];
RefCounted<ShaderAndSerial> mFullScreenQuad_vert_shaders[1];
- RefCounted<ShaderAndSerial> mImageClear_frag_shaders[1];
+ RefCounted<ShaderAndSerial>
+ mImageClear_frag_shaders[InternalShader::ImageClear_frag::kAttachmentIndexMask |
+ InternalShader::ImageClear_frag::kFormatMask];
RefCounted<ShaderAndSerial>
mImageCopy_frag_shaders[InternalShader::ImageCopy_frag::kFlagsMask |
InternalShader::ImageCopy_frag::kSrcFormatMask |
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp
index 211864824c9..dbc2baaa51d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_mandatory_format_support_table_autogen.cpp
@@ -7,7 +7,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
-// vk_mandatory_format_support_table:
+// vk_mandatory_format_support_table_autogen.cpp:
// Queries for full Vulkan mandatory format support information based on VK format.
#include "libANGLE/renderer/vulkan/vk_format_utils.h"
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp
index 4b304894996..d49cca0c2ce 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.cpp
@@ -33,11 +33,6 @@ VkImageUsageFlags GetStagingBufferUsageFlags(rx::vk::StagingUsage usage)
return 0;
}
}
-
-constexpr gl::Rectangle kMaxSizedScissor(0,
- 0,
- std::numeric_limits<int>::max(),
- std::numeric_limits<int>::max());
} // anonymous namespace
namespace angle
@@ -262,8 +257,11 @@ VkImageAspectFlags GetDepthStencilAspectFlags(const angle::Format &format)
VkImageAspectFlags GetFormatAspectFlags(const angle::Format &format)
{
- return (format.redBits > 0 ? VK_IMAGE_ASPECT_COLOR_BIT : 0) |
- GetDepthStencilAspectFlags(format);
+ VkImageAspectFlags dsAspect = GetDepthStencilAspectFlags(format);
+ // If the image is not depth stencil, assume color aspect. Note that detecting color formats
+ // is less trivial than depth/stencil, e.g. as block formats don't indicate any bits for RGBA
+ // channels.
+ return dsAspect != 0 ? dsAspect : VK_IMAGE_ASPECT_COLOR_BIT;
}
VkImageAspectFlags GetDepthStencilAspectFlagsForCopy(bool copyDepth, bool copyStencil)
@@ -823,36 +821,5 @@ void GetViewport(const gl::Rectangle &viewport,
viewportOut->height = -viewportOut->height;
}
}
-
-void GetScissor(const gl::State &glState,
- bool invertViewport,
- const gl::Rectangle &renderArea,
- VkRect2D *scissorOut)
-{
- if (glState.isScissorTestEnabled())
- {
- gl::Rectangle clippedRect;
- if (!gl::ClipRectangle(glState.getScissor(), renderArea, &clippedRect))
- {
- memset(scissorOut, 0, sizeof(VkRect2D));
- return;
- }
-
- *scissorOut = gl_vk::GetRect(clippedRect);
-
- if (invertViewport)
- {
- scissorOut->offset.y =
- renderArea.height - scissorOut->offset.y - scissorOut->extent.height;
- }
- }
- else
- {
- // If the scissor test isn't enabled, we can simply use a really big scissor that's
- // certainly larger than the current surface using the maximum size of a 2D texture
- // for the width and height.
- *scissorOut = gl_vk::GetRect(kMaxSizedScissor);
- }
-}
} // namespace gl_vk
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.h
index b270878ab85..07403d4896b 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -18,12 +18,14 @@
#include "common/debug.h"
#include "libANGLE/Error.h"
#include "libANGLE/Observer.h"
+#include "libANGLE/renderer/vulkan/SecondaryCommandBuffer.h"
#include "libANGLE/renderer/vulkan/vk_wrapper.h"
#define ANGLE_GL_OBJECTS_X(PROC) \
PROC(Buffer) \
PROC(Context) \
PROC(Framebuffer) \
+ PROC(MemoryObject) \
PROC(Program) \
PROC(Texture) \
PROC(VertexArray)
@@ -34,7 +36,7 @@ namespace egl
{
class Display;
class Image;
-}
+} // namespace egl
namespace gl
{
@@ -114,6 +116,14 @@ class Context : angle::NonCopyable
RendererVk *const mRenderer;
};
+#if ANGLE_USE_CUSTOM_VULKAN_CMD_BUFFERS
+using CommandBuffer = priv::SecondaryCommandBuffer;
+#else
+using CommandBuffer = priv::CommandBuffer;
+#endif
+
+using PrimaryCommandBuffer = priv::CommandBuffer;
+
VkImageAspectFlags GetDepthStencilAspectFlags(const angle::Format &format);
VkImageAspectFlags GetFormatAspectFlags(const angle::Format &format);
VkImageAspectFlags GetDepthStencilAspectFlagsForCopy(bool copyDepth, bool copyStencil);
@@ -520,10 +530,6 @@ void GetViewport(const gl::Rectangle &viewport,
bool invertViewport,
GLint renderAreaHeight,
VkViewport *viewportOut);
-void GetScissor(const gl::State &glState,
- bool invertViewport,
- const gl::Rectangle &renderArea,
- VkRect2D *scissorOut);
} // namespace gl_vk
} // namespace rx
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_wrapper.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_wrapper.h
index de7b84ec76f..4145c2dd47d 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_wrapper.h
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_wrapper.h
@@ -70,7 +70,6 @@ class WrappedObject : angle::NonCopyable
#define ANGLE_HANDLE_TYPES_X(FUNC) \
FUNC(Buffer) \
FUNC(BufferView) \
- FUNC(CommandBuffer) \
FUNC(CommandPool) \
FUNC(DescriptorPool) \
FUNC(DescriptorSetLayout) \
@@ -94,6 +93,7 @@ class WrappedObject : angle::NonCopyable
enum class HandleType
{
Invalid,
+ CommandBuffer,
ANGLE_HANDLE_TYPES_X(ANGLE_COMMA_SEP_FUNC)
};
@@ -101,6 +101,10 @@ enum class HandleType
#define ANGLE_PRE_DECLARE_CLASS_FUNC(TYPE) class TYPE;
ANGLE_HANDLE_TYPES_X(ANGLE_PRE_DECLARE_CLASS_FUNC)
+namespace priv
+{
+class CommandBuffer;
+} // namespace priv
#undef ANGLE_PRE_DECLARE_CLASS_FUNC
// Returns the HandleType of a Vk Handle.
@@ -115,6 +119,11 @@ struct HandleTypeHelper;
};
ANGLE_HANDLE_TYPES_X(ANGLE_HANDLE_TYPE_HELPER_FUNC)
+template <>
+struct HandleTypeHelper<priv::CommandBuffer>
+{
+ constexpr static HandleType kHandleType = HandleType::CommandBuffer;
+};
#undef ANGLE_HANDLE_TYPE_HELPER_FUNC
@@ -142,6 +151,9 @@ class Pipeline final : public WrappedObject<Pipeline, VkPipeline>
const PipelineCache &pipelineCacheVk);
};
+namespace priv
+{
+
// Helper class that wraps a Vulkan command buffer.
class CommandBuffer : public WrappedObject<CommandBuffer, VkCommandBuffer>
{
@@ -157,6 +169,45 @@ class CommandBuffer : public WrappedObject<CommandBuffer, VkCommandBuffer>
void destroy(VkDevice device, const CommandPool &commandPool);
VkResult init(VkDevice device, const VkCommandBufferAllocateInfo &createInfo);
+
+ // There is no way to know if the command buffer contains any commands.
+ bool empty() const { return false; }
+
+ using WrappedObject::operator=;
+
+ static bool SupportsQueries(const VkPhysicalDeviceFeatures &features)
+ {
+ return features.inheritedQueries;
+ }
+
+ // Vulkan command buffers are executed as secondary command buffers within a primary command
+ // buffer.
+ static constexpr bool ExecutesInline() { return false; }
+
+ VkResult begin(const VkCommandBufferBeginInfo &info);
+
+ void beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
+
+ void beginRenderPass(const VkRenderPassBeginInfo &beginInfo, VkSubpassContents subpassContents);
+
+ void bindGraphicsDescriptorSets(const PipelineLayout &layout,
+ uint32_t firstSet,
+ uint32_t descriptorSetCount,
+ const VkDescriptorSet *descriptorSets,
+ uint32_t dynamicOffsetCount,
+ const uint32_t *dynamicOffsets);
+ void bindGraphicsPipeline(const Pipeline &pipeline);
+ void bindComputeDescriptorSets(const PipelineLayout &layout,
+ const VkDescriptorSet *descriptorSets);
+ void bindComputePipeline(const Pipeline &pipeline);
+ void bindPipeline(VkPipelineBindPoint pipelineBindPoint, const Pipeline &pipeline);
+
+ void bindIndexBuffer(const Buffer &buffer, VkDeviceSize offset, VkIndexType indexType);
+ void bindVertexBuffers(uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer *buffers,
+ const VkDeviceSize *offsets);
+
void blitImage(const Image &srcImage,
VkImageLayout srcImageLayout,
const Image &dstImage,
@@ -164,22 +215,6 @@ class CommandBuffer : public WrappedObject<CommandBuffer, VkCommandBuffer>
uint32_t regionCount,
VkImageBlit *pRegions,
VkFilter filter);
- using WrappedObject::operator=;
-
- VkResult begin(const VkCommandBufferBeginInfo &info);
-
- VkResult end();
- VkResult reset();
-
- void pipelineBarrier(VkPipelineStageFlags srcStageMask,
- VkPipelineStageFlags dstStageMask,
- VkDependencyFlags dependencyFlags,
- uint32_t memoryBarrierCount,
- const VkMemoryBarrier *memoryBarriers,
- uint32_t bufferMemoryBarrierCount,
- const VkBufferMemoryBarrier *bufferMemoryBarriers,
- uint32_t imageMemoryBarrierCount,
- const VkImageMemoryBarrier *imageMemoryBarriers);
void clearColorImage(const Image &image,
VkImageLayout imageLayout,
@@ -219,43 +254,45 @@ class CommandBuffer : public WrappedObject<CommandBuffer, VkCommandBuffer>
uint32_t regionCount,
const VkImageCopy *regions);
- void beginRenderPass(const VkRenderPassBeginInfo &beginInfo, VkSubpassContents subpassContents);
- void endRenderPass();
+ void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
void draw(uint32_t vertexCount,
uint32_t instanceCount,
uint32_t firstVertex,
uint32_t firstInstance);
-
+ void draw(uint32_t vertexCount, uint32_t firstVertex);
+ void drawInstanced(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex);
void drawIndexed(uint32_t indexCount,
uint32_t instanceCount,
uint32_t firstIndex,
int32_t vertexOffset,
uint32_t firstInstance);
+ void drawIndexed(uint32_t indexCount);
+ void drawIndexedInstanced(uint32_t indexCount, uint32_t instanceCount);
- void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
+ VkResult end();
+ void endQuery(VkQueryPool queryPool, uint32_t query);
+ void endRenderPass();
+ void executeCommands(uint32_t commandBufferCount, const CommandBuffer *commandBuffers);
- void bindPipeline(VkPipelineBindPoint pipelineBindPoint, const Pipeline &pipeline);
+ void imageBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkImageMemoryBarrier *imageMemoryBarrier);
- void bindVertexBuffers(uint32_t firstBinding,
- uint32_t bindingCount,
- const VkBuffer *buffers,
- const VkDeviceSize *offsets);
+ void memoryBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkMemoryBarrier *memoryBarrier);
- void bindIndexBuffer(const VkBuffer &buffer, VkDeviceSize offset, VkIndexType indexType);
- void bindDescriptorSets(VkPipelineBindPoint bindPoint,
- const PipelineLayout &layout,
- uint32_t firstSet,
- uint32_t descriptorSetCount,
- const VkDescriptorSet *descriptorSets,
- uint32_t dynamicOffsetCount,
- const uint32_t *dynamicOffsets);
+ void pipelineBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ VkDependencyFlags dependencyFlags,
+ uint32_t memoryBarrierCount,
+ const VkMemoryBarrier *memoryBarriers,
+ uint32_t bufferMemoryBarrierCount,
+ const VkBufferMemoryBarrier *bufferMemoryBarriers,
+ uint32_t imageMemoryBarrierCount,
+ const VkImageMemoryBarrier *imageMemoryBarriers);
- void executeCommands(uint32_t commandBufferCount, const CommandBuffer *commandBuffers);
- void updateBuffer(const vk::Buffer &buffer,
- VkDeviceSize dstOffset,
- VkDeviceSize dataSize,
- const void *data);
void pushConstants(const PipelineLayout &layout,
VkShaderStageFlags flag,
uint32_t offset,
@@ -263,7 +300,9 @@ class CommandBuffer : public WrappedObject<CommandBuffer, VkCommandBuffer>
const void *data);
void setEvent(VkEvent event, VkPipelineStageFlags stageMask);
+ VkResult reset();
void resetEvent(VkEvent event, VkPipelineStageFlags stageMask);
+ void resetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
void waitEvents(uint32_t eventCount,
const VkEvent *events,
VkPipelineStageFlags srcStageMask,
@@ -275,16 +314,11 @@ class CommandBuffer : public WrappedObject<CommandBuffer, VkCommandBuffer>
uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier *imageMemoryBarriers);
- void resetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount);
- void beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags);
- void endQuery(VkQueryPool queryPool, uint32_t query);
void writeTimestamp(VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool,
uint32_t query);
-
- void setViewport(uint32_t firstViewport, uint32_t viewportCount, const VkViewport *viewports);
- void setScissor(uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *scissors);
};
+} // namespace priv
class Image final : public WrappedObject<Image, VkImage>
{
@@ -511,6 +545,9 @@ ANGLE_INLINE VkResult CommandPool::init(VkDevice device, const VkCommandPoolCrea
return vkCreateCommandPool(device, &createInfo, nullptr, &mHandle);
}
+namespace priv
+{
+
// CommandBuffer implementation.
ANGLE_INLINE VkCommandBuffer CommandBuffer::releaseHandle()
{
@@ -534,9 +571,10 @@ ANGLE_INLINE void CommandBuffer::blitImage(const Image &srcImage,
VkImageBlit *pRegions,
VkFilter filter)
{
- ASSERT(valid());
+ ASSERT(valid() && srcImage.valid() && dstImage.valid());
+ ASSERT(regionCount == 1);
vkCmdBlitImage(mHandle, srcImage.getHandle(), srcImageLayout, dstImage.getHandle(),
- dstImageLayout, regionCount, pRegions, filter);
+ dstImageLayout, 1, pRegions, filter);
}
ANGLE_INLINE VkResult CommandBuffer::begin(const VkCommandBufferBeginInfo &info)
@@ -557,6 +595,15 @@ ANGLE_INLINE VkResult CommandBuffer::reset()
return vkResetCommandBuffer(mHandle, 0);
}
+ANGLE_INLINE void CommandBuffer::memoryBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkMemoryBarrier *memoryBarrier)
+{
+ ASSERT(valid());
+ vkCmdPipelineBarrier(mHandle, srcStageMask, dstStageMask, 0, 1, memoryBarrier, 0, nullptr, 0,
+ nullptr);
+}
+
ANGLE_INLINE void CommandBuffer::pipelineBarrier(VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask,
VkDependencyFlags dependencyFlags,
@@ -573,6 +620,15 @@ ANGLE_INLINE void CommandBuffer::pipelineBarrier(VkPipelineStageFlags srcStageMa
imageMemoryBarrierCount, imageMemoryBarriers);
}
+ANGLE_INLINE void CommandBuffer::imageBarrier(VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask,
+ const VkImageMemoryBarrier *imageMemoryBarrier)
+{
+ ASSERT(valid());
+ vkCmdPipelineBarrier(mHandle, srcStageMask, dstStageMask, 0, 0, nullptr, 0, nullptr, 1,
+ imageMemoryBarrier);
+}
+
ANGLE_INLINE void CommandBuffer::destroy(VkDevice device)
{
releaseHandle();
@@ -588,13 +644,12 @@ ANGLE_INLINE void CommandBuffer::destroy(VkDevice device, const vk::CommandPool
}
}
-ANGLE_INLINE void CommandBuffer::copyBuffer(const vk::Buffer &srcBuffer,
- const vk::Buffer &destBuffer,
+ANGLE_INLINE void CommandBuffer::copyBuffer(const Buffer &srcBuffer,
+ const Buffer &destBuffer,
uint32_t regionCount,
const VkBufferCopy *regions)
{
- ASSERT(valid());
- ASSERT(srcBuffer.valid() && destBuffer.valid());
+ ASSERT(valid() && srcBuffer.valid() && destBuffer.valid());
vkCmdCopyBuffer(mHandle, srcBuffer.getHandle(), destBuffer.getHandle(), regionCount, regions);
}
@@ -604,11 +659,10 @@ ANGLE_INLINE void CommandBuffer::copyBufferToImage(VkBuffer srcBuffer,
uint32_t regionCount,
const VkBufferImageCopy *regions)
{
- ASSERT(valid());
+ ASSERT(valid() && dstImage.valid());
ASSERT(srcBuffer != VK_NULL_HANDLE);
- ASSERT(dstImage.valid());
- vkCmdCopyBufferToImage(mHandle, srcBuffer, dstImage.getHandle(), dstImageLayout, regionCount,
- regions);
+ ASSERT(regionCount == 1);
+ vkCmdCopyBufferToImage(mHandle, srcBuffer, dstImage.getHandle(), dstImageLayout, 1, regions);
}
ANGLE_INLINE void CommandBuffer::copyImageToBuffer(const Image &srcImage,
@@ -617,33 +671,33 @@ ANGLE_INLINE void CommandBuffer::copyImageToBuffer(const Image &srcImage,
uint32_t regionCount,
const VkBufferImageCopy *regions)
{
- ASSERT(valid());
+ ASSERT(valid() && srcImage.valid());
ASSERT(dstBuffer != VK_NULL_HANDLE);
- ASSERT(srcImage.valid());
- vkCmdCopyImageToBuffer(mHandle, srcImage.getHandle(), srcImageLayout, dstBuffer, regionCount,
- regions);
+ ASSERT(regionCount == 1);
+ vkCmdCopyImageToBuffer(mHandle, srcImage.getHandle(), srcImageLayout, dstBuffer, 1, regions);
}
-ANGLE_INLINE void CommandBuffer::clearColorImage(const vk::Image &image,
+ANGLE_INLINE void CommandBuffer::clearColorImage(const Image &image,
VkImageLayout imageLayout,
const VkClearColorValue &color,
uint32_t rangeCount,
const VkImageSubresourceRange *ranges)
{
ASSERT(valid());
- vkCmdClearColorImage(mHandle, image.getHandle(), imageLayout, &color, rangeCount, ranges);
+ ASSERT(rangeCount == 1);
+ vkCmdClearColorImage(mHandle, image.getHandle(), imageLayout, &color, 1, ranges);
}
ANGLE_INLINE void CommandBuffer::clearDepthStencilImage(
- const vk::Image &image,
+ const Image &image,
VkImageLayout imageLayout,
const VkClearDepthStencilValue &depthStencil,
uint32_t rangeCount,
const VkImageSubresourceRange *ranges)
{
ASSERT(valid());
- vkCmdClearDepthStencilImage(mHandle, image.getHandle(), imageLayout, &depthStencil, rangeCount,
- ranges);
+ ASSERT(rangeCount == 1);
+ vkCmdClearDepthStencilImage(mHandle, image.getHandle(), imageLayout, &depthStencil, 1, ranges);
}
ANGLE_INLINE void CommandBuffer::clearAttachments(uint32_t attachmentCount,
@@ -655,14 +709,15 @@ ANGLE_INLINE void CommandBuffer::clearAttachments(uint32_t attachmentCount,
vkCmdClearAttachments(mHandle, attachmentCount, attachments, rectCount, rects);
}
-ANGLE_INLINE void CommandBuffer::copyImage(const vk::Image &srcImage,
+ANGLE_INLINE void CommandBuffer::copyImage(const Image &srcImage,
VkImageLayout srcImageLayout,
- const vk::Image &dstImage,
+ const Image &dstImage,
VkImageLayout dstImageLayout,
uint32_t regionCount,
const VkImageCopy *regions)
{
ASSERT(valid() && srcImage.valid() && dstImage.valid());
+ ASSERT(regionCount == 1);
vkCmdCopyImage(mHandle, srcImage.getHandle(), srcImageLayout, dstImage.getHandle(),
dstImageLayout, 1, regions);
}
@@ -680,41 +735,39 @@ ANGLE_INLINE void CommandBuffer::endRenderPass()
vkCmdEndRenderPass(mHandle);
}
-ANGLE_INLINE void CommandBuffer::bindIndexBuffer(const VkBuffer &buffer,
+ANGLE_INLINE void CommandBuffer::bindIndexBuffer(const Buffer &buffer,
VkDeviceSize offset,
VkIndexType indexType)
{
ASSERT(valid());
- vkCmdBindIndexBuffer(mHandle, buffer, offset, indexType);
+ vkCmdBindIndexBuffer(mHandle, buffer.getHandle(), offset, indexType);
}
-ANGLE_INLINE void CommandBuffer::bindDescriptorSets(VkPipelineBindPoint bindPoint,
- const vk::PipelineLayout &layout,
- uint32_t firstSet,
- uint32_t descriptorSetCount,
- const VkDescriptorSet *descriptorSets,
- uint32_t dynamicOffsetCount,
- const uint32_t *dynamicOffsets)
+ANGLE_INLINE void CommandBuffer::bindComputeDescriptorSets(const PipelineLayout &layout,
+ const VkDescriptorSet *descriptorSets)
{
- ASSERT(valid());
- vkCmdBindDescriptorSets(mHandle, bindPoint, layout.getHandle(), firstSet, descriptorSetCount,
- descriptorSets, dynamicOffsetCount, dynamicOffsets);
+ ASSERT(valid() && layout.valid());
+ vkCmdBindDescriptorSets(mHandle, VK_PIPELINE_BIND_POINT_COMPUTE, layout.getHandle(), 0, 1,
+ descriptorSets, 0, nullptr);
}
-ANGLE_INLINE void CommandBuffer::executeCommands(uint32_t commandBufferCount,
- const vk::CommandBuffer *commandBuffers)
+ANGLE_INLINE void CommandBuffer::bindGraphicsDescriptorSets(const PipelineLayout &layout,
+ uint32_t firstSet,
+ uint32_t descriptorSetCount,
+ const VkDescriptorSet *descriptorSets,
+ uint32_t dynamicOffsetCount,
+ const uint32_t *dynamicOffsets)
{
- ASSERT(valid());
- vkCmdExecuteCommands(mHandle, commandBufferCount, commandBuffers[0].ptr());
+ ASSERT(valid() && layout.valid());
+ vkCmdBindDescriptorSets(mHandle, VK_PIPELINE_BIND_POINT_GRAPHICS, layout.getHandle(), firstSet,
+ descriptorSetCount, descriptorSets, dynamicOffsetCount, dynamicOffsets);
}
-ANGLE_INLINE void CommandBuffer::updateBuffer(const vk::Buffer &buffer,
- VkDeviceSize dstOffset,
- VkDeviceSize dataSize,
- const void *data)
+ANGLE_INLINE void CommandBuffer::executeCommands(uint32_t commandBufferCount,
+ const CommandBuffer *commandBuffers)
{
- ASSERT(valid() && buffer.valid());
- vkCmdUpdateBuffer(mHandle, buffer.getHandle(), dstOffset, dataSize, data);
+ ASSERT(valid());
+ vkCmdExecuteCommands(mHandle, commandBufferCount, commandBuffers[0].ptr());
}
ANGLE_INLINE void CommandBuffer::pushConstants(const PipelineLayout &layout,
@@ -724,7 +777,8 @@ ANGLE_INLINE void CommandBuffer::pushConstants(const PipelineLayout &layout,
const void *data)
{
ASSERT(valid() && layout.valid());
- vkCmdPushConstants(mHandle, layout.getHandle(), flag, offset, size, data);
+ ASSERT(offset == 0);
+ vkCmdPushConstants(mHandle, layout.getHandle(), flag, 0, size, data);
}
ANGLE_INLINE void CommandBuffer::setEvent(VkEvent event, VkPipelineStageFlags stageMask)
@@ -786,29 +840,27 @@ ANGLE_INLINE void CommandBuffer::writeTimestamp(VkPipelineStageFlagBits pipeline
vkCmdWriteTimestamp(mHandle, pipelineStage, queryPool, query);
}
-ANGLE_INLINE void CommandBuffer::setViewport(uint32_t firstViewport,
- uint32_t viewportCount,
- const VkViewport *viewports)
+ANGLE_INLINE void CommandBuffer::draw(uint32_t vertexCount,
+ uint32_t instanceCount,
+ uint32_t firstVertex,
+ uint32_t firstInstance)
{
ASSERT(valid());
- vkCmdSetViewport(mHandle, firstViewport, viewportCount, viewports);
+ vkCmdDraw(mHandle, vertexCount, instanceCount, firstVertex, firstInstance);
}
-ANGLE_INLINE void CommandBuffer::setScissor(uint32_t firstScissor,
- uint32_t scissorCount,
- const VkRect2D *scissors)
+ANGLE_INLINE void CommandBuffer::draw(uint32_t vertexCount, uint32_t firstVertex)
{
ASSERT(valid());
- vkCmdSetScissor(mHandle, firstScissor, scissorCount, scissors);
+ vkCmdDraw(mHandle, vertexCount, 1, firstVertex, 0);
}
-ANGLE_INLINE void CommandBuffer::draw(uint32_t vertexCount,
- uint32_t instanceCount,
- uint32_t firstVertex,
- uint32_t firstInstance)
+ANGLE_INLINE void CommandBuffer::drawInstanced(uint32_t vertexCount,
+ uint32_t instanceCount,
+ uint32_t firstVertex)
{
ASSERT(valid());
- vkCmdDraw(mHandle, vertexCount, instanceCount, firstVertex, firstInstance);
+ vkCmdDraw(mHandle, vertexCount, instanceCount, firstVertex, 0);
}
ANGLE_INLINE void CommandBuffer::drawIndexed(uint32_t indexCount,
@@ -821,6 +873,18 @@ ANGLE_INLINE void CommandBuffer::drawIndexed(uint32_t indexCount,
vkCmdDrawIndexed(mHandle, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
}
+ANGLE_INLINE void CommandBuffer::drawIndexed(uint32_t indexCount)
+{
+ ASSERT(valid());
+ vkCmdDrawIndexed(mHandle, indexCount, 1, 0, 0, 0);
+}
+
+ANGLE_INLINE void CommandBuffer::drawIndexedInstanced(uint32_t indexCount, uint32_t instanceCount)
+{
+ ASSERT(valid());
+ vkCmdDrawIndexed(mHandle, indexCount, instanceCount, 0, 0, 0);
+}
+
ANGLE_INLINE void CommandBuffer::dispatch(uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ)
@@ -836,6 +900,18 @@ ANGLE_INLINE void CommandBuffer::bindPipeline(VkPipelineBindPoint pipelineBindPo
vkCmdBindPipeline(mHandle, pipelineBindPoint, pipeline.getHandle());
}
+ANGLE_INLINE void CommandBuffer::bindGraphicsPipeline(const Pipeline &pipeline)
+{
+ ASSERT(valid() && pipeline.valid());
+ vkCmdBindPipeline(mHandle, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.getHandle());
+}
+
+ANGLE_INLINE void CommandBuffer::bindComputePipeline(const Pipeline &pipeline)
+{
+ ASSERT(valid() && pipeline.valid());
+ vkCmdBindPipeline(mHandle, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.getHandle());
+}
+
ANGLE_INLINE void CommandBuffer::bindVertexBuffers(uint32_t firstBinding,
uint32_t bindingCount,
const VkBuffer *buffers,
@@ -845,6 +921,8 @@ ANGLE_INLINE void CommandBuffer::bindVertexBuffers(uint32_t firstBinding,
vkCmdBindVertexBuffers(mHandle, firstBinding, bindingCount, buffers, offsets);
}
+} // namespace priv
+
// Image implementation.
ANGLE_INLINE void Image::setHandle(VkImage handle)
{
diff --git a/chromium/third_party/angle/src/libANGLE/validationEGL.cpp b/chromium/third_party/angle/src/libANGLE/validationEGL.cpp
index b17571d696e..a9dfb86fc29 100644
--- a/chromium/third_party/angle/src/libANGLE/validationEGL.cpp
+++ b/chromium/third_party/angle/src/libANGLE/validationEGL.cpp
@@ -2869,11 +2869,7 @@ Error ValidateSwapBuffersWithDamageKHR(const Display *display,
EGLint *rects,
EGLint n_rects)
{
- Error error = ValidateSurface(display, surface);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(ValidateSurface(display, surface));
if (!display->getExtensions().swapBuffersWithDamage)
{
@@ -2960,7 +2956,7 @@ Error ValidateBindTexImage(const Display *display,
if (context)
{
gl::TextureType type = egl_gl::EGLTextureTargetToTextureType(surface->getTextureTarget());
- *textureObject = context->getTargetTexture(type);
+ *textureObject = context->getTextureByType(type);
ASSERT(*textureObject != nullptr);
if ((*textureObject)->getImmutableFormat())
diff --git a/chromium/third_party/angle/src/libANGLE/validationES.cpp b/chromium/third_party/angle/src/libANGLE/validationES.cpp
index c1ccfb9c8b5..480a0e66dfc 100644
--- a/chromium/third_party/angle/src/libANGLE/validationES.cpp
+++ b/chromium/third_party/angle/src/libANGLE/validationES.cpp
@@ -683,12 +683,12 @@ bool ValidateDrawInstancedANGLE(Context *context)
return false;
}
-bool ValidTexture3DDestinationTarget(const Context *context, TextureType target)
+bool ValidTexture3DDestinationTarget(const Context *context, TextureTarget target)
{
switch (target)
{
- case TextureType::_3D:
- case TextureType::_2DArray:
+ case TextureTarget::_3D:
+ case TextureTarget::_2DArray:
return true;
default:
return false;
@@ -1446,17 +1446,16 @@ bool ValidateBlitFramebufferParameters(Context *context,
}
}
- // ANGLE_multiview, Revision 1:
+ // OVR_multiview2:
// Calling BlitFramebuffer will result in an INVALID_FRAMEBUFFER_OPERATION error if the
- // multi-view layout of the current draw framebuffer is not NONE, or if the multi-view layout of
- // the current read framebuffer is FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE or the number of
+ // current draw framebuffer isMultiview() or the number of
// views in the current read framebuffer is more than one.
if (readFramebuffer->readDisallowedByMultiview())
{
context->validationError(GL_INVALID_FRAMEBUFFER_OPERATION, kBlitFromMultiview);
return false;
}
- if (drawFramebuffer->getMultiviewLayout() != GL_NONE)
+ if (drawFramebuffer->isMultiview())
{
context->validationError(GL_INVALID_FRAMEBUFFER_OPERATION, kBlitToMultiview);
return false;
@@ -2678,7 +2677,7 @@ const char *ValidateDrawStates(Context *context)
return kTextureTypeConflict;
}
- if (extensions.multiview)
+ if (extensions.multiview2)
{
const int programNumViews = program->usesMultiview() ? program->getNumViews() : 1;
const int framebufferNumViews = framebuffer->getNumViews();
@@ -2733,6 +2732,11 @@ const char *ValidateDrawStates(Context *context)
// Do some additonal WebGL-specific validation
if (extensions.webglCompatibility)
{
+ if (!state.validateSamplerFormats())
+ {
+ return kSamplerFormatMismatch;
+ }
+
const TransformFeedback *transformFeedbackObject = state.getCurrentTransformFeedback();
if (transformFeedbackObject != nullptr && transformFeedbackObject->isActive() &&
transformFeedbackObject->buffersBoundForOtherUse())
@@ -2741,7 +2745,7 @@ const char *ValidateDrawStates(Context *context)
}
// Detect rendering feedback loops for WebGL.
- if (framebuffer->formsRenderingFeedbackLoopWith(state))
+ if (framebuffer->formsRenderingFeedbackLoopWith(context))
{
return kFeedbackLoop;
}
@@ -3359,8 +3363,8 @@ bool ValidateEGLImageTargetTexture2DOES(Context *context, TextureType type, GLeg
egl::Image *imageObject = static_cast<egl::Image *>(image);
- ASSERT(context->getCurrentDisplay());
- if (!context->getCurrentDisplay()->isValidImage(imageObject))
+ ASSERT(context->getDisplay());
+ if (!context->getDisplay()->isValidImage(imageObject))
{
context->validationError(GL_INVALID_VALUE, kInvalidEGLImage);
return false;
@@ -3403,8 +3407,8 @@ bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
egl::Image *imageObject = static_cast<egl::Image *>(image);
- ASSERT(context->getCurrentDisplay());
- if (!context->getCurrentDisplay()->isValidImage(imageObject))
+ ASSERT(context->getDisplay());
+ if (!context->getDisplay()->isValidImage(imageObject))
{
context->validationError(GL_INVALID_VALUE, kInvalidEGLImage);
return false;
@@ -3826,11 +3830,9 @@ bool ValidateGetFramebufferAttachmentParameterivBase(Context *context,
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
break;
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
- case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
- if (clientVersion < 3 || !context->getExtensions().multiview)
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR:
+ case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR:
+ if (clientVersion < 3 || !context->getExtensions().multiview2)
{
context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
return false;
@@ -4057,18 +4059,7 @@ bool ValidateGetFramebufferAttachmentParameterivBase(Context *context,
if (numParams)
{
- if (pname == GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE)
- {
- // Only when the viewport offsets are queried we can have a varying number of output
- // parameters.
- const int numViews = attachmentObject ? attachmentObject->getNumViews() : 1;
- *numParams = numViews * 2;
- }
- else
- {
- // For all other queries we can have only one output parameter.
- *numParams = 1;
- }
+ *numParams = 1;
}
return true;
@@ -5095,7 +5086,7 @@ bool ValidateGetTexParameterBase(Context *context,
return false;
}
- if (context->getTargetTexture(target) == nullptr)
+ if (context->getTextureByType(target) == nullptr)
{
// Should only be possible for external textures
context->validationError(GL_INVALID_ENUM, kTextureNotBound);
@@ -5372,10 +5363,9 @@ bool ValidateReadPixelsBase(Context *context,
return false;
}
- // ANGLE_multiview, Revision 1:
- // ReadPixels generates an INVALID_FRAMEBUFFER_OPERATION error if the multi-view layout of the
- // current read framebuffer is FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE or the number of views
- // in the current read framebuffer is more than one.
+ // OVR_multiview2, Revision 1:
+ // ReadPixels generates an INVALID_FRAMEBUFFER_OPERATION error if
+ // the number of views in the current read framebuffer is more than one.
if (framebuffer->readDisallowedByMultiview())
{
context->validationError(GL_INVALID_FRAMEBUFFER_OPERATION, kMultiviewReadFramebuffer);
@@ -5554,7 +5544,7 @@ bool ValidateTexParameterBase(Context *context,
return false;
}
- if (context->getTargetTexture(target) == nullptr)
+ if (context->getTextureByType(target) == nullptr)
{
// Should only be possible for external textures
context->validationError(GL_INVALID_ENUM, kTextureNotBound);
@@ -6257,7 +6247,7 @@ bool ValidateTexStorageMultisample(Context *context,
return false;
}
- Texture *texture = context->getTargetTexture(target);
+ Texture *texture = context->getTextureByType(target);
if (!texture || texture->id() == 0)
{
context->validationError(GL_INVALID_OPERATION, kZeroBoundToTarget);
@@ -6314,7 +6304,7 @@ bool ValidateGetTexLevelParameterBase(Context *context,
return false;
}
- if (context->getTargetTexture(type) == nullptr)
+ if (context->getTextureByType(type) == nullptr)
{
context->validationError(GL_INVALID_ENUM, kTextureNotBound);
return false;
@@ -6412,4 +6402,40 @@ void RecordDrawAttribsError(Context *context)
context->validationError(GL_INVALID_OPERATION, kInsufficientVertexBufferSize);
}
}
+
+bool ValidateLoseContextCHROMIUM(Context *context,
+ GraphicsResetStatus current,
+ GraphicsResetStatus other)
+{
+ if (!context->getExtensions().loseContextCHROMIUM)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ switch (current)
+ {
+ case GraphicsResetStatus::GuiltyContextReset:
+ case GraphicsResetStatus::InnocentContextReset:
+ case GraphicsResetStatus::UnknownContextReset:
+ break;
+
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidResetStatus);
+ }
+
+ switch (other)
+ {
+ case GraphicsResetStatus::GuiltyContextReset:
+ case GraphicsResetStatus::InnocentContextReset:
+ case GraphicsResetStatus::UnknownContextReset:
+ break;
+
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidResetStatus);
+ }
+
+ return true;
+}
+
} // namespace gl
diff --git a/chromium/third_party/angle/src/libANGLE/validationES.h b/chromium/third_party/angle/src/libANGLE/validationES.h
index 4c0bbb2e560..2d1cf1e4f10 100644
--- a/chromium/third_party/angle/src/libANGLE/validationES.h
+++ b/chromium/third_party/angle/src/libANGLE/validationES.h
@@ -43,7 +43,7 @@ bool ValidTexture2DTarget(const Context *context, TextureType type);
bool ValidTexture3DTarget(const Context *context, TextureType target);
bool ValidTextureExternalTarget(const Context *context, TextureType target);
bool ValidTexture2DDestinationTarget(const Context *context, TextureTarget target);
-bool ValidTexture3DDestinationTarget(const Context *context, TextureType target);
+bool ValidTexture3DDestinationTarget(const Context *context, TextureTarget target);
bool ValidTexLevelDestinationTarget(const Context *context, TextureType type);
bool ValidFramebufferTarget(const Context *context, GLenum target);
bool ValidMipLevel(const Context *context, TextureType type, GLint level);
diff --git a/chromium/third_party/angle/src/libANGLE/validationES2.cpp b/chromium/third_party/angle/src/libANGLE/validationES2.cpp
index 4455d8b6897..254db5b9d39 100644
--- a/chromium/third_party/angle/src/libANGLE/validationES2.cpp
+++ b/chromium/third_party/angle/src/libANGLE/validationES2.cpp
@@ -1155,21 +1155,6 @@ bool ValidateES2TexImageParameters(Context *context,
return false;
}
- // From GL_CHROMIUM_color_buffer_float_rgb[a]:
- // GL_RGB[A] / GL_RGB[A]32F becomes an allowable format / internalformat parameter pair for
- // TexImage2D. The restriction in section 3.7.1 of the OpenGL ES 2.0 spec that the
- // internalformat parameter and format parameter of TexImage2D must match is lifted for this
- // case.
- bool nonEqualFormatsAllowed =
- (internalformat == GL_RGB32F && context->getExtensions().colorBufferFloatRGB) ||
- (internalformat == GL_RGBA32F && context->getExtensions().colorBufferFloatRGBA);
-
- if (!isSubImage && !isCompressed && internalformat != format && !nonEqualFormatsAllowed)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
- return false;
- }
-
const gl::Caps &caps = context->getCaps();
switch (texType)
@@ -1218,55 +1203,13 @@ bool ValidateES2TexImageParameters(Context *context,
return false;
}
- gl::Texture *texture = context->getTargetTexture(texType);
+ gl::Texture *texture = context->getTextureByType(texType);
if (!texture)
{
context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
return false;
}
- if (isSubImage)
- {
- const InternalFormat &textureInternalFormat = *texture->getFormat(target, level).info;
- if (textureInternalFormat.internalFormat == GL_NONE)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidTextureLevel);
- return false;
- }
-
- if (format != GL_NONE)
- {
- if (GetInternalFormatInfo(format, type).sizedInternalFormat !=
- textureInternalFormat.sizedInternalFormat)
- {
- context->validationError(GL_INVALID_OPERATION, kTypeMismatch);
- return false;
- }
- }
-
- if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
- static_cast<size_t>(yoffset + height) > texture->getHeight(target, level))
- {
- context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
- return false;
- }
-
- if (width > 0 && height > 0 && pixels == nullptr &&
- context->getState().getTargetBuffer(BufferBinding::PixelUnpack) == nullptr)
- {
- context->validationError(GL_INVALID_VALUE, kPixelDataNull);
- return false;
- }
- }
- else
- {
- if (texture->getImmutableFormat())
- {
- context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
- return false;
- }
- }
-
// Verify zero border
if (border != 0)
{
@@ -1274,6 +1217,8 @@ bool ValidateES2TexImageParameters(Context *context,
return false;
}
+ bool nonEqualFormatsAllowed = false;
+
if (isCompressed)
{
GLenum actualInternalFormat =
@@ -1583,12 +1528,23 @@ bool ValidateES2TexImageParameters(Context *context,
{
switch (internalformat)
{
+ // Core ES 2.0 formats
+ case GL_ALPHA:
+ case GL_LUMINANCE:
+ case GL_LUMINANCE_ALPHA:
+ case GL_RGB:
+ case GL_RGBA:
+ break;
+
case GL_RGBA32F:
if (!context->getExtensions().colorBufferFloatRGBA)
{
context->validationError(GL_INVALID_ENUM, kInvalidFormat);
return false;
}
+
+ nonEqualFormatsAllowed = true;
+
if (type != GL_FLOAT)
{
context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
@@ -1607,6 +1563,9 @@ bool ValidateES2TexImageParameters(Context *context,
context->validationError(GL_INVALID_ENUM, kInvalidFormat);
return false;
}
+
+ nonEqualFormatsAllowed = true;
+
if (type != GL_FLOAT)
{
context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
@@ -1619,8 +1578,44 @@ bool ValidateES2TexImageParameters(Context *context,
}
break;
- default:
+ case GL_BGRA_EXT:
+ if (!context->getExtensions().textureFormatBGRA8888)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidFormat);
+ return false;
+ }
break;
+
+ case GL_DEPTH_COMPONENT:
+ case GL_DEPTH_STENCIL:
+ if (!context->getExtensions().depthTextures)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidFormat);
+ return false;
+ }
+ break;
+
+ case GL_RED:
+ case GL_RG:
+ if (!context->getExtensions().textureRG)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidFormat);
+ return false;
+ }
+ break;
+
+ case GL_SRGB_EXT:
+ case GL_SRGB_ALPHA_EXT:
+ if (!context->getExtensions().sRGB)
+ {
+ context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
+ return false;
+ }
+ break;
+
+ default:
+ context->validationError(GL_INVALID_VALUE, kInvalidInternalFormat);
+ return false;
}
}
@@ -1642,14 +1637,68 @@ bool ValidateES2TexImageParameters(Context *context,
}
}
- GLenum sizeCheckFormat = isSubImage ? format : internalformat;
- if (!ValidImageDataSize(context, texType, width, height, 1, sizeCheckFormat, type, pixels,
- imageSize))
+ if (isSubImage)
{
+ const InternalFormat &textureInternalFormat = *texture->getFormat(target, level).info;
+ if (textureInternalFormat.internalFormat == GL_NONE)
+ {
+ context->validationError(GL_INVALID_OPERATION, kInvalidTextureLevel);
+ return false;
+ }
+
+ if (format != textureInternalFormat.format)
+ {
+ context->validationError(GL_INVALID_OPERATION, err::kTextureFormatMismatch);
+ return false;
+ }
+
+ if (context->getExtensions().webglCompatibility)
+ {
+ if (GetInternalFormatInfo(format, type).sizedInternalFormat !=
+ textureInternalFormat.sizedInternalFormat)
+ {
+ context->validationError(GL_INVALID_OPERATION, kTextureTypeMismatch);
+ return false;
+ }
+ }
+
+ if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
+ static_cast<size_t>(yoffset + height) > texture->getHeight(target, level))
+ {
+ context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
+ return false;
+ }
+
+ if (width > 0 && height > 0 && pixels == nullptr &&
+ context->getState().getTargetBuffer(BufferBinding::PixelUnpack) == nullptr)
+ {
+ context->validationError(GL_INVALID_VALUE, kPixelDataNull);
+ return false;
+ }
+ }
+ else
+ {
+ if (texture->getImmutableFormat())
+ {
+ context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
+ return false;
+ }
+ }
+
+ // From GL_CHROMIUM_color_buffer_float_rgb[a]:
+ // GL_RGB[A] / GL_RGB[A]32F becomes an allowable format / internalformat parameter pair for
+ // TexImage2D. The restriction in section 3.7.1 of the OpenGL ES 2.0 spec that the
+ // internalformat parameter and format parameter of TexImage2D must match is lifted for this
+ // case.
+ if (!isSubImage && !isCompressed && internalformat != format && !nonEqualFormatsAllowed)
+ {
+ context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
return false;
}
- return true;
+ GLenum sizeCheckFormat = isSubImage ? format : internalformat;
+ return ValidImageDataSize(context, texType, width, height, 1, sizeCheckFormat, type, pixels,
+ imageSize);
}
bool ValidateES2TexStorageParameters(Context *context,
@@ -1856,7 +1905,7 @@ bool ValidateES2TexStorageParameters(Context *context,
break;
}
- gl::Texture *texture = context->getTargetTexture(target);
+ gl::Texture *texture = context->getTextureByType(target);
if (!texture || texture->id() == 0)
{
context->validationError(GL_INVALID_OPERATION, kMissingTexture);
@@ -2640,7 +2689,7 @@ bool ValidateClear(Context *context, GLbitfield mask)
}
}
- if (extensions.multiview && extensions.disjointTimerQuery)
+ if (extensions.multiview2 && extensions.disjointTimerQuery)
{
const State &state = context->getState();
Framebuffer *framebuffer = state.getDrawFramebuffer();
@@ -2990,6 +3039,296 @@ bool ValidateMapBufferRangeEXT(Context *context,
return ValidateMapBufferRangeBase(context, target, offset, length, access);
}
+bool ValidateBufferStorageMemEXT(Context *context,
+ TextureType target,
+ GLsizeiptr size,
+ GLuint memory,
+ GLuint64 offset)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateCreateMemoryObjectsEXT(Context *context, GLsizei n, GLuint *memoryObjects)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteMemoryObjectsEXT(Context *context, GLsizei n, const GLuint *memoryObjects)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGetMemoryObjectParameterivEXT(Context *context,
+ GLuint memoryObject,
+ GLenum pname,
+ GLint *params)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateGetUnsignedBytevEXT(Context *context, GLenum pname, GLubyte *data)
+{
+ if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateGetUnsignedBytei_vEXT(Context *context, GLenum target, GLuint index, GLubyte *data)
+{
+ if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateIsMemoryObjectEXT(Context *context, GLuint memoryObject)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateMemoryObjectParameterivEXT(Context *context,
+ GLuint memoryObject,
+ GLenum pname,
+ const GLint *params)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateTexStorageMem2DEXT(Context *context,
+ TextureType target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ if (context->getClientMajorVersion() < 3)
+ {
+ return ValidateES2TexStorageParameters(context, target, levels, internalFormat, width,
+ height);
+ }
+
+ ASSERT(context->getClientMajorVersion() >= 3);
+ return ValidateES3TexStorage2DParameters(context, target, levels, internalFormat, width, height,
+ 1);
+}
+
+bool ValidateTexStorageMem3DEXT(Context *context,
+ TextureType target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateImportMemoryFdEXT(Context *context,
+ GLuint memory,
+ GLuint64 size,
+ HandleType handleType,
+ GLint fd)
+{
+ if (!context->getExtensions().memoryObjectFd)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ switch (handleType)
+ {
+ case HandleType::OpaqueFd:
+ break;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidHandleType);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateDeleteSemaphoresEXT(Context *context, GLsizei n, const GLuint *semaphores)
+{
+ if (!context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateGenSemaphoresEXT(Context *context, GLsizei n, GLuint *semaphores)
+{
+ if (!context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateGetSemaphoreParameterui64vEXT(Context *context,
+ GLuint semaphore,
+ GLenum pname,
+ GLuint64 *params)
+{
+ if (!context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateIsSemaphoreEXT(Context *context, GLuint semaphore)
+{
+ if (!context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateSemaphoreParameterui64vEXT(Context *context,
+ GLuint semaphore,
+ GLenum pname,
+ const GLuint64 *params)
+{
+ if (!context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateSignalSemaphoreEXT(Context *context,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts)
+{
+ if (!context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateWaitSemaphoreEXT(Context *context,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts)
+{
+ if (!context->getExtensions().semaphore)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
+bool ValidateImportSemaphoreFdEXT(Context *context,
+ GLuint semaphore,
+ HandleType handleType,
+ GLint fd)
+{
+ if (!context->getExtensions().semaphoreFd)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
bool ValidateMapBufferBase(Context *context, BufferBinding target)
{
Buffer *buffer = context->getState().getTargetBuffer(target);
@@ -5904,7 +6243,7 @@ bool ValidateGenerateMipmap(Context *context, TextureType target)
return false;
}
- Texture *texture = context->getTargetTexture(target);
+ Texture *texture = context->getTextureByType(target);
if (texture == nullptr)
{
diff --git a/chromium/third_party/angle/src/libANGLE/validationES2.h b/chromium/third_party/angle/src/libANGLE/validationES2.h
index 452b7537c74..138aaae5b31 100644
--- a/chromium/third_party/angle/src/libANGLE/validationES2.h
+++ b/chromium/third_party/angle/src/libANGLE/validationES2.h
@@ -140,7 +140,7 @@ ANGLE_INLINE bool ValidateBindTexture(Context *context, TextureType target, GLui
Texture *textureObject = context->getTexture(texture);
if (textureObject && textureObject->getType() != target)
{
- context->validationError(GL_INVALID_OPERATION, err::kTypeMismatch);
+ context->validationError(GL_INVALID_OPERATION, err::kTextureTargetMismatch);
return false;
}
diff --git a/chromium/third_party/angle/src/libANGLE/validationES3.cpp b/chromium/third_party/angle/src/libANGLE/validationES3.cpp
index a5750f2a76c..84e0a75f2e4 100644
--- a/chromium/third_party/angle/src/libANGLE/validationES3.cpp
+++ b/chromium/third_party/angle/src/libANGLE/validationES3.cpp
@@ -36,7 +36,7 @@ bool ValidateFramebufferTextureMultiviewBaseANGLE(Context *context,
GLint level,
GLsizei numViews)
{
- if (!context->getExtensions().multiview)
+ if (!context->getExtensions().multiview2)
{
context->validationError(GL_INVALID_OPERATION, kMultiviewNotAvailable);
return false;
@@ -431,7 +431,7 @@ bool ValidateES3TexImageParametersBase(Context *context,
return false;
}
- gl::Texture *texture = context->getTargetTexture(texType);
+ gl::Texture *texture = context->getTextureByType(texType);
if (!texture)
{
context->validationError(GL_INVALID_OPERATION, kMissingTexture);
@@ -622,7 +622,7 @@ bool ValidateES3TexImage2DParameters(Context *context,
}
bool ValidateES3TexImage3DParameters(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLenum internalformat,
bool isCompressed,
@@ -645,17 +645,16 @@ bool ValidateES3TexImage3DParameters(Context *context,
return false;
}
- if (IsETC2EACFormat(format) && target != TextureType::_2DArray)
+ if (IsETC2EACFormat(format) && target != TextureTarget::_2DArray)
{
// ES 3.1, Section 8.7, page 169.
context->validationError(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArray);
return false;
}
- return ValidateES3TexImageParametersBase(context, NonCubeTextureTypeToTarget(target), level,
- internalformat, isCompressed, isSubImage, xoffset,
- yoffset, zoffset, width, height, depth, border, format,
- type, bufSize, pixels);
+ return ValidateES3TexImageParametersBase(context, target, level, internalformat, isCompressed,
+ isSubImage, xoffset, yoffset, zoffset, width, height,
+ depth, border, format, type, bufSize, pixels);
}
struct EffectiveInternalFormatInfo
@@ -998,7 +997,7 @@ bool ValidateES3CopyTexImage2DParameters(Context *context,
}
bool ValidateES3CopyTexImage3DParameters(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLenum internalformat,
bool isSubImage,
@@ -1017,9 +1016,9 @@ bool ValidateES3CopyTexImage3DParameters(Context *context,
return false;
}
- return ValidateES3CopyTexImageParametersBase(context, NonCubeTextureTypeToTarget(target), level,
- internalformat, isSubImage, xoffset, yoffset,
- zoffset, x, y, width, height, border);
+ return ValidateES3CopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
+ xoffset, yoffset, zoffset, x, y, width, height,
+ border);
}
bool ValidateES3TexStorageParametersBase(Context *context,
@@ -1125,7 +1124,7 @@ bool ValidateES3TexStorageParametersBase(Context *context,
return false;
}
- gl::Texture *texture = context->getTargetTexture(target);
+ gl::Texture *texture = context->getTextureByType(target);
if (!texture || texture->id() == 0)
{
context->validationError(GL_INVALID_OPERATION, kMissingTexture);
@@ -1508,7 +1507,7 @@ bool ValidateReadBuffer(Context *context, GLenum src)
}
bool ValidateCompressedTexImage3D(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -1524,14 +1523,15 @@ bool ValidateCompressedTexImage3D(Context *context,
return false;
}
- if (!ValidTextureTarget(context, target))
+ if (!ValidTextureTarget(context, TextureTargetToType(target)))
{
context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
return false;
}
// Validate image size
- if (!ValidImageSizeParameters(context, target, level, width, height, depth, false))
+ if (!ValidImageSizeParameters(context, TextureTargetToType(target), level, width, height, depth,
+ false))
{
// Error already generated.
return false;
@@ -1558,7 +1558,7 @@ bool ValidateCompressedTexImage3D(Context *context,
}
// 3D texture target validation
- if (target != TextureType::_3D && target != TextureType::_2DArray)
+ if (target != TextureTarget::_3D && target != TextureTarget::_2DArray)
{
context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
return false;
@@ -1576,7 +1576,7 @@ bool ValidateCompressedTexImage3D(Context *context,
}
bool ValidateCompressedTexImage3DRobustANGLE(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -1995,7 +1995,7 @@ bool ValidateDrawBuffers(Context *context, GLsizei n, const GLenum *bufs)
}
bool ValidateCopyTexSubImage3D(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -2167,7 +2167,7 @@ bool ValidateCopySubTexture3DANGLE(Context *context,
}
bool ValidateTexImage3D(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLint internalformat,
GLsizei width,
@@ -2190,7 +2190,7 @@ bool ValidateTexImage3D(Context *context,
}
bool ValidateTexImage3DRobustANGLE(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLint internalformat,
GLsizei width,
@@ -2219,7 +2219,7 @@ bool ValidateTexImage3DRobustANGLE(Context *context,
}
bool ValidateTexSubImage3D(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -2243,7 +2243,7 @@ bool ValidateTexSubImage3D(Context *context,
}
bool ValidateTexSubImage3DRobustANGLE(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -2273,7 +2273,7 @@ bool ValidateTexSubImage3DRobustANGLE(Context *context,
}
bool ValidateCompressedTexSubImage3D(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -2328,7 +2328,7 @@ bool ValidateCompressedTexSubImage3D(Context *context,
}
bool ValidateCompressedTexSubImage3DRobustANGLE(Context *context,
- TextureType target,
+ TextureTarget target,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -3157,13 +3157,13 @@ bool ValidateMultiDrawElementsInstancedANGLE(Context *context,
return true;
}
-bool ValidateFramebufferTextureMultiviewLayeredANGLE(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
+bool ValidateFramebufferTextureMultiviewOVR(Context *context,
+ GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews)
{
if (!ValidateFramebufferTextureMultiviewBaseANGLE(context, target, attachment, texture, level,
numViews))
@@ -3219,53 +3219,6 @@ bool ValidateFramebufferTextureMultiviewLayeredANGLE(Context *context,
return true;
}
-bool ValidateFramebufferTextureMultiviewSideBySideANGLE(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- if (!ValidateFramebufferTextureMultiviewBaseANGLE(context, target, attachment, texture, level,
- numViews))
- {
- return false;
- }
-
- if (texture != 0)
- {
- const GLsizei numViewportOffsetValues = numViews * 2;
- for (GLsizei i = 0; i < numViewportOffsetValues; ++i)
- {
- if (viewportOffsets[i] < 0)
- {
- context->validationError(GL_INVALID_VALUE, kNegativeOffset);
- return false;
- }
- }
-
- Texture *tex = context->getTexture(texture);
- ASSERT(tex);
-
- switch (tex->getType())
- {
- case TextureType::_2D:
- break;
- default:
- context->validationError(GL_INVALID_OPERATION, kInvalidTextureType);
- return false;
- }
-
- if (!ValidateFramebufferTextureMultiviewLevelAndFormat(context, tex, level))
- {
- return false;
- }
- }
-
- return true;
-}
-
bool ValidateUniform1ui(Context *context, GLint location, GLuint v0)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT, location, 1);
diff --git a/chromium/third_party/angle/src/libANGLE/validationES31.cpp b/chromium/third_party/angle/src/libANGLE/validationES31.cpp
index 9495e085067..fc55e31cd53 100644
--- a/chromium/third_party/angle/src/libANGLE/validationES31.cpp
+++ b/chromium/third_party/angle/src/libANGLE/validationES31.cpp
@@ -453,17 +453,6 @@ bool ValidateDrawIndirectBase(Context *context, PrimitiveMode mode, const void *
return false;
}
- // ANGLE_multiview spec, revision 1:
- // An INVALID_OPERATION is generated by DrawArraysIndirect and DrawElementsIndirect if the
- // number of views in the draw framebuffer is greater than 1.
- const Framebuffer *drawFramebuffer = context->getState().getDrawFramebuffer();
- ASSERT(drawFramebuffer != nullptr);
- if (drawFramebuffer->getNumViews() > 1)
- {
- context->validationError(GL_INVALID_OPERATION, kMultiviewActive);
- return false;
- }
-
return true;
}
@@ -949,6 +938,26 @@ bool ValidateTexStorage2DMultisample(Context *context,
height);
}
+bool ValidateTexStorageMem2DMultisampleEXT(Context *context,
+ TextureType target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
bool ValidateGetMultisamplefv(Context *context, GLenum pname, GLuint index, GLfloat *val)
{
if (context->getClientVersion() < ES_3_1)
@@ -1744,7 +1753,7 @@ bool ValidateMemoryBarrier(Context *context, GLbitfield barriers)
GL_PIXEL_BUFFER_BARRIER_BIT | GL_TEXTURE_UPDATE_BARRIER_BIT | GL_BUFFER_UPDATE_BARRIER_BIT |
GL_FRAMEBUFFER_BARRIER_BIT | GL_TRANSFORM_FEEDBACK_BARRIER_BIT |
GL_ATOMIC_COUNTER_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT;
- if ((barriers & ~supported_barrier_bits) != 0)
+ if (barriers == 0 || (barriers & ~supported_barrier_bits) != 0)
{
context->validationError(GL_INVALID_VALUE, kInvalidMemoryBarrierBit);
return false;
@@ -1770,7 +1779,7 @@ bool ValidateMemoryBarrierByRegion(Context *context, GLbitfield barriers)
GL_SHADER_IMAGE_ACCESS_BARRIER_BIT |
GL_SHADER_STORAGE_BARRIER_BIT |
GL_TEXTURE_FETCH_BARRIER_BIT | GL_UNIFORM_BARRIER_BIT;
- if ((barriers & ~supported_barrier_bits) != 0)
+ if (barriers == 0 || (barriers & ~supported_barrier_bits) != 0)
{
context->validationError(GL_INVALID_VALUE, kInvalidMemoryBarrierBit);
return false;
@@ -1869,6 +1878,27 @@ bool ValidateTexStorage3DMultisampleOES(Context *context,
height);
}
+bool ValidateTexStorageMem3DMultisampleEXT(Context *context,
+ TextureType target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ if (!context->getExtensions().memoryObject)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ UNIMPLEMENTED();
+ return false;
+}
+
bool ValidateGetProgramResourceLocationIndexEXT(Context *context,
GLuint program,
GLenum programInterface,
diff --git a/chromium/third_party/angle/src/libANGLE/validationES3_autogen.h b/chromium/third_party/angle/src/libANGLE/validationES3_autogen.h
index d2ba1fca3e7..89836ccc9fe 100644
--- a/chromium/third_party/angle/src/libANGLE/validationES3_autogen.h
+++ b/chromium/third_party/angle/src/libANGLE/validationES3_autogen.h
@@ -53,7 +53,7 @@ bool ValidateClearBufferiv(Context *context, GLenum buffer, GLint drawbuffer, co
bool ValidateClearBufferuiv(Context *context, GLenum buffer, GLint drawbuffer, const GLuint *value);
bool ValidateClientWaitSync(Context *context, GLsync sync, GLbitfield flags, GLuint64 timeout);
bool ValidateCompressedTexImage3D(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -63,7 +63,7 @@ bool ValidateCompressedTexImage3D(Context *context,
GLsizei imageSize,
const void *data);
bool ValidateCompressedTexSubImage3D(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -81,7 +81,7 @@ bool ValidateCopyBufferSubData(Context *context,
GLintptr writeOffset,
GLsizeiptr size);
bool ValidateCopyTexSubImage3D(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -245,7 +245,7 @@ bool ValidateSamplerParameterfv(Context *context,
bool ValidateSamplerParameteri(Context *context, GLuint sampler, GLenum pname, GLint param);
bool ValidateSamplerParameteriv(Context *context, GLuint sampler, GLenum pname, const GLint *param);
bool ValidateTexImage3D(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLint internalformat,
GLsizei width,
@@ -269,7 +269,7 @@ bool ValidateTexStorage3D(Context *context,
GLsizei height,
GLsizei depth);
bool ValidateTexSubImage3D(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLint xoffset,
GLint yoffset,
diff --git a/chromium/third_party/angle/src/libANGLE/validationESEXT_autogen.h b/chromium/third_party/angle/src/libANGLE/validationESEXT_autogen.h
index b6a246913ea..84c0efa8967 100644
--- a/chromium/third_party/angle/src/libANGLE/validationESEXT_autogen.h
+++ b/chromium/third_party/angle/src/libANGLE/validationESEXT_autogen.h
@@ -109,22 +109,6 @@ bool ValidateMultiDrawElementsInstancedANGLE(Context *context,
const GLsizei *instanceCounts,
GLsizei drawcount);
-// GL_ANGLE_multiview
-bool ValidateFramebufferTextureMultiviewLayeredANGLE(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews);
-bool ValidateFramebufferTextureMultiviewSideBySideANGLE(Context *context,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets);
-
// GL_ANGLE_provoking_vertex
bool ValidateProvokingVertexANGLE(Context *context, ProvokingVertex modePacked);
@@ -265,7 +249,7 @@ bool ValidateTexSubImage2DRobustANGLE(Context *context,
GLsizei bufSize,
const void *pixels);
bool ValidateTexImage3DRobustANGLE(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLint internalformat,
GLsizei width,
@@ -277,7 +261,7 @@ bool ValidateTexImage3DRobustANGLE(Context *context,
GLsizei bufSize,
const void *pixels);
bool ValidateTexSubImage3DRobustANGLE(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -311,7 +295,7 @@ bool ValidateCompressedTexSubImage2DRobustANGLE(Context *context,
GLsizei dataSize,
const GLvoid *data);
bool ValidateCompressedTexImage3DRobustANGLE(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLenum internalformat,
GLsizei width,
@@ -322,7 +306,7 @@ bool ValidateCompressedTexImage3DRobustANGLE(Context *context,
GLsizei dataSize,
const GLvoid *data);
bool ValidateCompressedTexSubImage3DRobustANGLE(Context *context,
- TextureType targetPacked,
+ TextureTarget targetPacked,
GLint level,
GLint xoffset,
GLint yoffset,
@@ -636,6 +620,11 @@ bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components);
bool ValidateMatrixLoadfCHROMIUM(Context *context, GLenum matrixMode, const GLfloat *matrix);
bool ValidateMatrixLoadIdentityCHROMIUM(Context *context, GLenum matrixMode);
+// GL_CHROMIUM_lose_context
+bool ValidateLoseContextCHROMIUM(Context *context,
+ GraphicsResetStatus currentPacked,
+ GraphicsResetStatus otherPacked);
+
// GL_CHROMIUM_path_rendering
bool ValidateGenPathsCHROMIUM(Context *context, GLsizei range);
bool ValidateDeletePathsCHROMIUM(Context *context, GLuint first, GLsizei range);
@@ -809,6 +798,69 @@ bool ValidateMapBufferRangeEXT(Context *context,
GLsizeiptr length,
GLbitfield access);
+// GL_EXT_memory_object
+bool ValidateBufferStorageMemEXT(Context *context,
+ TextureType targetPacked,
+ GLsizeiptr size,
+ GLuint memory,
+ GLuint64 offset);
+bool ValidateCreateMemoryObjectsEXT(Context *context, GLsizei n, GLuint *memoryObjects);
+bool ValidateDeleteMemoryObjectsEXT(Context *context, GLsizei n, const GLuint *memoryObjects);
+bool ValidateGetMemoryObjectParameterivEXT(Context *context,
+ GLuint memoryObject,
+ GLenum pname,
+ GLint *params);
+bool ValidateGetUnsignedBytevEXT(Context *context, GLenum pname, GLubyte *data);
+bool ValidateGetUnsignedBytei_vEXT(Context *context, GLenum target, GLuint index, GLubyte *data);
+bool ValidateIsMemoryObjectEXT(Context *context, GLuint memoryObject);
+bool ValidateMemoryObjectParameterivEXT(Context *context,
+ GLuint memoryObject,
+ GLenum pname,
+ const GLint *params);
+bool ValidateTexStorageMem2DEXT(Context *context,
+ TextureType targetPacked,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset);
+bool ValidateTexStorageMem2DMultisampleEXT(Context *context,
+ TextureType targetPacked,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
+bool ValidateTexStorageMem3DEXT(Context *context,
+ TextureType targetPacked,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset);
+bool ValidateTexStorageMem3DMultisampleEXT(Context *context,
+ TextureType targetPacked,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
+
+// GL_EXT_memory_object_fd
+bool ValidateImportMemoryFdEXT(Context *context,
+ GLuint memory,
+ GLuint64 size,
+ HandleType handleTypePacked,
+ GLint fd);
+
// GL_EXT_occlusion_query_boolean
// GL_EXT_robustness
@@ -833,6 +885,39 @@ bool ValidateReadnPixelsEXT(Context *context,
GLsizei bufSize,
void *data);
+// GL_EXT_semaphore
+bool ValidateDeleteSemaphoresEXT(Context *context, GLsizei n, const GLuint *semaphores);
+bool ValidateGenSemaphoresEXT(Context *context, GLsizei n, GLuint *semaphores);
+bool ValidateGetSemaphoreParameterui64vEXT(Context *context,
+ GLuint semaphore,
+ GLenum pname,
+ GLuint64 *params);
+bool ValidateIsSemaphoreEXT(Context *context, GLuint semaphore);
+bool ValidateSemaphoreParameterui64vEXT(Context *context,
+ GLuint semaphore,
+ GLenum pname,
+ const GLuint64 *params);
+bool ValidateSignalSemaphoreEXT(Context *context,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts);
+bool ValidateWaitSemaphoreEXT(Context *context,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts);
+
+// GL_EXT_semaphore_fd
+bool ValidateImportSemaphoreFdEXT(Context *context,
+ GLuint semaphore,
+ HandleType handleTypePacked,
+ GLint fd);
+
// GL_EXT_texture_storage
bool ValidateTexStorage1DEXT(Context *context,
GLenum target,
@@ -1094,6 +1179,17 @@ bool ValidateBindVertexArrayOES(Context *context, GLuint array);
bool ValidateDeleteVertexArraysOES(Context *context, GLsizei n, const GLuint *arrays);
bool ValidateGenVertexArraysOES(Context *context, GLsizei n, GLuint *arrays);
bool ValidateIsVertexArrayOES(Context *context, GLuint array);
+
+// GL_OVR_multiview
+bool ValidateFramebufferTextureMultiviewOVR(Context *context,
+ GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews);
+
+// GL_OVR_multiview2
} // namespace gl
#endif // LIBANGLE_VALIDATION_ESEXT_AUTOGEN_H_
diff --git a/chromium/third_party/angle/src/libGLESv2.gni b/chromium/third_party/angle/src/libGLESv2.gni
index dd4be32e6f4..1a69ae89d0b 100644
--- a/chromium/third_party/angle/src/libGLESv2.gni
+++ b/chromium/third_party/angle/src/libGLESv2.gni
@@ -213,6 +213,8 @@ libangle_sources = [
"src/libANGLE/IndexRangeCache.h",
"src/libANGLE/LoggingAnnotator.cpp",
"src/libANGLE/LoggingAnnotator.h",
+ "src/libANGLE/MemoryObject.cpp",
+ "src/libANGLE/MemoryObject.h",
"src/libANGLE/MemoryProgramCache.cpp",
"src/libANGLE/MemoryProgramCache.h",
"src/libANGLE/Observer.cpp",
@@ -298,6 +300,7 @@ libangle_sources = [
"src/libANGLE/renderer/FramebufferImpl.h",
"src/libANGLE/renderer/GLImplFactory.h",
"src/libANGLE/renderer/ImageImpl.h",
+ "src/libANGLE/renderer/MemoryObjectImpl.h",
"src/libANGLE/renderer/PathImpl.h",
"src/libANGLE/renderer/ProgramImpl.h",
"src/libANGLE/renderer/ProgramPipelineImpl.h",
@@ -306,6 +309,7 @@ libangle_sources = [
"src/libANGLE/renderer/RenderbufferImpl.h",
"src/libANGLE/renderer/RenderTargetCache.h",
"src/libANGLE/renderer/SamplerImpl.h",
+ "src/libANGLE/renderer/ShaderImpl.cpp",
"src/libANGLE/renderer/ShaderImpl.h",
"src/libANGLE/renderer/StreamProducerImpl.h",
"src/libANGLE/renderer/SurfaceImpl.cpp",
@@ -316,7 +320,7 @@ libangle_sources = [
"src/libANGLE/renderer/TransformFeedbackImpl.h",
"src/libANGLE/renderer/VertexArrayImpl.h",
"src/libANGLE/renderer/copyvertex.h",
- "src/libANGLE/renderer/copyvertex.inc",
+ "src/libANGLE/renderer/copyvertex.inc.h",
"src/libANGLE/renderer/load_functions_table.h",
"src/libANGLE/renderer/load_functions_table_autogen.cpp",
"src/libANGLE/renderer/renderer_utils.cpp",
@@ -464,7 +468,7 @@ libangle_d3d11_sources = [
"src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.cpp",
"src/libANGLE/renderer/d3d/d3d11/DebugAnnotator11.h",
"src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp",
- "src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp",
+ "src/libANGLE/renderer/d3d/d3d11/dxgi_support_table_autogen.cpp",
"src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.h",
"src/libANGLE/renderer/d3d/d3d11/Fence11.cpp",
"src/libANGLE/renderer/d3d/d3d11/Fence11.h",
@@ -776,6 +780,8 @@ libangle_vulkan_sources = [
"src/libANGLE/renderer/vulkan/GlslangWrapper.h",
"src/libANGLE/renderer/vulkan/ImageVk.cpp",
"src/libANGLE/renderer/vulkan/ImageVk.h",
+ "src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp",
+ "src/libANGLE/renderer/vulkan/MemoryObjectVk.h",
"src/libANGLE/renderer/vulkan/ProgramVk.cpp",
"src/libANGLE/renderer/vulkan/ProgramVk.h",
"src/libANGLE/renderer/vulkan/ProgramPipelineVk.cpp",
diff --git a/chromium/third_party/angle/src/libGLESv2/entry_points_egl.cpp b/chromium/third_party/angle/src/libGLESv2/entry_points_egl.cpp
index 095d97a9747..49266d80be0 100644
--- a/chromium/third_party/angle/src/libGLESv2/entry_points_egl.cpp
+++ b/chromium/third_party/angle/src/libGLESv2/entry_points_egl.cpp
@@ -13,6 +13,7 @@
#include "common/version.h"
#include "libANGLE/Context.h"
#include "libANGLE/Display.h"
+#include "libANGLE/EGLSync.h"
#include "libANGLE/Surface.h"
#include "libANGLE/Texture.h"
#include "libANGLE/Thread.h"
@@ -205,7 +206,7 @@ EGLBoolean EGLAPIENTRY EGL_ChooseConfig(EGLDisplay dpy,
ANGLE_EGL_TRY_RETURN(thread, ValidateChooseConfig(display, attribMap, config_size, num_config),
"eglChooseConfig", GetDisplayIfValid(display), EGL_FALSE);
- ClipConfigs(display->getConfigs(attribMap), configs, config_size, num_config);
+ ClipConfigs(display->chooseConfig(attribMap), configs, config_size, num_config);
thread->setSuccess();
return EGL_TRUE;
@@ -496,7 +497,7 @@ EGLDisplay EGLAPIENTRY EGL_GetCurrentDisplay(void)
thread->setSuccess();
if (thread->getContext() != nullptr)
{
- return thread->getContext()->getCurrentDisplay();
+ return thread->getContext()->getDisplay();
}
return EGL_NO_DISPLAY;
}
@@ -531,7 +532,7 @@ EGLBoolean EGLAPIENTRY EGL_WaitGL(void)
EVENT("()");
Thread *thread = egl::GetCurrentThread();
- egl::Display *display = thread->getCurrentDisplay();
+ egl::Display *display = thread->getDisplay();
ANGLE_EGL_TRY_RETURN(thread, ValidateDisplay(display), "eglWaitGL", GetDisplayIfValid(display),
EGL_FALSE);
@@ -551,7 +552,7 @@ EGLBoolean EGLAPIENTRY EGL_WaitNative(EGLint engine)
EVENT("(EGLint engine = %d)", engine);
Thread *thread = egl::GetCurrentThread();
- egl::Display *display = thread->getCurrentDisplay();
+ egl::Display *display = thread->getDisplay();
ANGLE_EGL_TRY_RETURN(thread, ValidateWaitNative(display, engine), "eglWaitNative",
GetThreadIfValid(thread), EGL_FALSE);
@@ -778,7 +779,7 @@ EGLBoolean EGLAPIENTRY EGL_ReleaseThread(void)
Surface *previousDraw = thread->getCurrentDrawSurface();
Surface *previousRead = thread->getCurrentReadSurface();
gl::Context *previousContext = thread->getContext();
- egl::Display *previousDisplay = thread->getCurrentDisplay();
+ egl::Display *previousDisplay = thread->getDisplay();
// Only call makeCurrent if the context or surfaces have changed.
if (previousDraw != EGL_NO_SURFACE || previousRead != EGL_NO_SURFACE ||
@@ -811,7 +812,7 @@ EGLBoolean EGLAPIENTRY EGL_WaitClient(void)
EVENT("()");
Thread *thread = egl::GetCurrentThread();
- egl::Display *display = thread->getCurrentDisplay();
+ egl::Display *display = thread->getDisplay();
gl::Context *context = thread->getContext();
ANGLE_EGL_TRY_RETURN(thread, ValidateDisplay(display), "eglWaitClient",
@@ -850,14 +851,14 @@ EGLSync EGLAPIENTRY EGL_CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib
AttributeMap attributes = AttributeMap::CreateFromAttribArray(attrib_list);
gl::Context *currentContext = thread->getContext();
- egl::Display *currentDisplay = currentContext ? currentContext->getCurrentDisplay() : nullptr;
+ egl::Display *currentDisplay = currentContext ? currentContext->getDisplay() : nullptr;
ANGLE_EGL_TRY_RETURN(
thread, ValidateCreateSyncKHR(display, type, attributes, currentDisplay, currentContext),
"eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
egl::Sync *syncObject = nullptr;
- ANGLE_EGL_TRY_RETURN(thread, display->createSync(type, attributes, &syncObject),
+ ANGLE_EGL_TRY_RETURN(thread, display->createSync(currentContext, type, attributes, &syncObject),
"eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
thread->setSuccess();
@@ -898,9 +899,11 @@ EGLint EGLAPIENTRY EGL_ClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags
ANGLE_EGL_TRY_RETURN(thread, ValidateClientWaitSync(display, syncObject, flags, timeout),
"eglClientWaitSync", GetDisplayIfValid(display), EGL_FALSE);
+ gl::Context *currentContext = thread->getContext();
EGLint syncStatus = EGL_FALSE;
- ANGLE_EGL_TRY_RETURN(thread, display->clientWaitSync(syncObject, flags, timeout, &syncStatus),
- "eglClientWaitSync", GetDisplayIfValid(display), EGL_FALSE);
+ ANGLE_EGL_TRY_RETURN(
+ thread, syncObject->clientWait(display, currentContext, flags, timeout, &syncStatus),
+ "eglClientWaitSync", GetDisplayIfValid(display), EGL_FALSE);
thread->setSuccess();
return syncStatus;
@@ -1056,8 +1059,9 @@ EGLBoolean EGLAPIENTRY EGL_WaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
ANGLE_EGL_TRY_RETURN(thread, ValidateWaitSync(display, context, syncObject, flags),
"eglWaitSync", GetDisplayIfValid(display), EGL_FALSE);
- ANGLE_EGL_TRY_RETURN(thread, display->waitSync(syncObject, flags), "eglWaitSync",
- GetDisplayIfValid(display), EGL_FALSE);
+ gl::Context *currentContext = thread->getContext();
+ ANGLE_EGL_TRY_RETURN(thread, syncObject->serverWait(display, currentContext, flags),
+ "eglWaitSync", GetDisplayIfValid(display), EGL_FALSE);
thread->setSuccess();
return EGL_TRUE;
diff --git a/chromium/third_party/angle/src/libGLESv2/entry_points_egl_ext.cpp b/chromium/third_party/angle/src/libGLESv2/entry_points_egl_ext.cpp
index 1386a19c37f..a8e442a59f7 100644
--- a/chromium/third_party/angle/src/libGLESv2/entry_points_egl_ext.cpp
+++ b/chromium/third_party/angle/src/libGLESv2/entry_points_egl_ext.cpp
@@ -12,6 +12,7 @@
#include "libANGLE/Context.h"
#include "libANGLE/Device.h"
#include "libANGLE/Display.h"
+#include "libANGLE/EGLSync.h"
#include "libANGLE/Stream.h"
#include "libANGLE/Surface.h"
#include "libANGLE/Thread.h"
@@ -890,14 +891,14 @@ ANGLE_EXPORT EGLSync EGLAPIENTRY EGL_CreateSyncKHR(EGLDisplay dpy,
AttributeMap attributes = AttributeMap::CreateFromIntArray(attrib_list);
gl::Context *currentContext = thread->getContext();
- egl::Display *currentDisplay = currentContext ? currentContext->getCurrentDisplay() : nullptr;
+ egl::Display *currentDisplay = currentContext ? currentContext->getDisplay() : nullptr;
ANGLE_EGL_TRY_RETURN(
thread, ValidateCreateSyncKHR(display, type, attributes, currentDisplay, currentContext),
"eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
egl::Sync *syncObject = nullptr;
- ANGLE_EGL_TRY_RETURN(thread, display->createSync(type, attributes, &syncObject),
+ ANGLE_EGL_TRY_RETURN(thread, display->createSync(currentContext, type, attributes, &syncObject),
"eglCreateSync", GetDisplayIfValid(display), EGL_NO_SYNC);
thread->setSuccess();
@@ -941,9 +942,11 @@ ANGLE_EXPORT EGLint EGLAPIENTRY EGL_ClientWaitSyncKHR(EGLDisplay dpy,
ANGLE_EGL_TRY_RETURN(thread, ValidateClientWaitSync(display, syncObject, flags, timeout),
"eglClientWaitSync", GetDisplayIfValid(display), EGL_FALSE);
+ gl::Context *currentContext = thread->getContext();
EGLint syncStatus = EGL_FALSE;
- ANGLE_EGL_TRY_RETURN(thread, display->clientWaitSync(syncObject, flags, timeout, &syncStatus),
- "eglClientWaitSync", GetDisplayIfValid(display), EGL_FALSE);
+ ANGLE_EGL_TRY_RETURN(
+ thread, syncObject->clientWait(display, currentContext, flags, timeout, &syncStatus),
+ "eglClientWaitSync", GetDisplayIfValid(display), EGL_FALSE);
thread->setSuccess();
return syncStatus;
@@ -990,8 +993,9 @@ ANGLE_EXPORT EGLBoolean EGLAPIENTRY EGL_WaitSyncKHR(EGLDisplay dpy, EGLSync sync
ANGLE_EGL_TRY_RETURN(thread, ValidateWaitSync(display, context, syncObject, flags),
"eglWaitSync", GetDisplayIfValid(display), EGL_FALSE);
- ANGLE_EGL_TRY_RETURN(thread, display->waitSync(syncObject, flags), "eglWaitSync",
- GetDisplayIfValid(display), EGL_FALSE);
+ gl::Context *currentContext = thread->getContext();
+ ANGLE_EGL_TRY_RETURN(thread, syncObject->serverWait(display, currentContext, flags),
+ "eglWaitSync", GetDisplayIfValid(display), EGL_FALSE);
thread->setSuccess();
return EGL_TRUE;
diff --git a/chromium/third_party/angle/src/libGLESv2/entry_points_enum_autogen.h b/chromium/third_party/angle/src/libGLESv2/entry_points_enum_autogen.h
index ec59029b0ca..5dc34fe4fc9 100644
--- a/chromium/third_party/angle/src/libGLESv2/entry_points_enum_autogen.h
+++ b/chromium/third_party/angle/src/libGLESv2/entry_points_enum_autogen.h
@@ -52,6 +52,7 @@ enum class EntryPoint
BlitFramebuffer,
BlitFramebufferANGLE,
BufferData,
+ BufferStorageMemEXT,
BufferSubData,
CheckFramebufferStatus,
CheckFramebufferStatusOES,
@@ -97,6 +98,7 @@ enum class EntryPoint
CoverStrokePathCHROMIUM,
CoverStrokePathInstancedCHROMIUM,
CoverageModulationCHROMIUM,
+ CreateMemoryObjectsEXT,
CreateProgram,
CreateShader,
CreateShaderProgramv,
@@ -109,6 +111,7 @@ enum class EntryPoint
DeleteFencesNV,
DeleteFramebuffers,
DeleteFramebuffersOES,
+ DeleteMemoryObjectsEXT,
DeletePathsCHROMIUM,
DeleteProgram,
DeleteProgramPipelines,
@@ -117,6 +120,7 @@ enum class EntryPoint
DeleteRenderbuffers,
DeleteRenderbuffersOES,
DeleteSamplers,
+ DeleteSemaphoresEXT,
DeleteShader,
DeleteSync,
DeleteTextures,
@@ -180,8 +184,7 @@ enum class EntryPoint
FramebufferTexture2DOES,
FramebufferTextureEXT,
FramebufferTextureLayer,
- FramebufferTextureMultiviewLayeredANGLE,
- FramebufferTextureMultiviewSideBySideANGLE,
+ FramebufferTextureMultiviewOVR,
FrontFace,
Frustumf,
Frustumx,
@@ -196,6 +199,7 @@ enum class EntryPoint
GenRenderbuffers,
GenRenderbuffersOES,
GenSamplers,
+ GenSemaphoresEXT,
GenTextures,
GenTransformFeedbacks,
GenVertexArrays,
@@ -251,6 +255,7 @@ enum class EntryPoint
GetLightxv,
GetMaterialfv,
GetMaterialxv,
+ GetMemoryObjectParameterivEXT,
GetMultisamplefv,
GetMultisamplefvANGLE,
GetMultisamplefvRobustANGLE,
@@ -298,6 +303,7 @@ enum class EntryPoint
GetSamplerParameterfvRobustANGLE,
GetSamplerParameteriv,
GetSamplerParameterivRobustANGLE,
+ GetSemaphoreParameterui64vEXT,
GetShaderInfoLog,
GetShaderPrecisionFormat,
GetShaderSource,
@@ -338,6 +344,8 @@ enum class EntryPoint
GetUniformivRobustANGLE,
GetUniformuiv,
GetUniformuivRobustANGLE,
+ GetUnsignedBytei_vEXT,
+ GetUnsignedBytevEXT,
GetVertexAttribIiv,
GetVertexAttribIivRobustANGLE,
GetVertexAttribIuiv,
@@ -354,6 +362,8 @@ enum class EntryPoint
GetnUniformivRobustANGLE,
GetnUniformuivRobustANGLE,
Hint,
+ ImportMemoryFdEXT,
+ ImportSemaphoreFdEXT,
InsertEventMarkerEXT,
InvalidateFramebuffer,
InvalidateSubFramebuffer,
@@ -362,6 +372,7 @@ enum class EntryPoint
IsFenceNV,
IsFramebuffer,
IsFramebufferOES,
+ IsMemoryObjectEXT,
IsPathCHROMIUM,
IsProgram,
IsProgramPipeline,
@@ -370,6 +381,7 @@ enum class EntryPoint
IsRenderbuffer,
IsRenderbufferOES,
IsSampler,
+ IsSemaphoreEXT,
IsShader,
IsSync,
IsTexture,
@@ -392,6 +404,7 @@ enum class EntryPoint
LoadMatrixx,
LoadPaletteFromModelViewMatrixOES,
LogicOp,
+ LoseContextCHROMIUM,
MapBufferOES,
MapBufferRange,
MapBufferRangeEXT,
@@ -406,6 +419,7 @@ enum class EntryPoint
MaxShaderCompilerThreadsKHR,
MemoryBarrier,
MemoryBarrierByRegion,
+ MemoryObjectParameterivEXT,
MultMatrixf,
MultMatrixx,
MultiDrawArraysANGLE,
@@ -513,10 +527,12 @@ enum class EntryPoint
Scalef,
Scalex,
Scissor,
+ SemaphoreParameterui64vEXT,
SetFenceNV,
ShadeModel,
ShaderBinary,
ShaderSource,
+ SignalSemaphoreEXT,
StencilFillPathCHROMIUM,
StencilFillPathInstancedCHROMIUM,
StencilFunc,
@@ -569,6 +585,10 @@ enum class EntryPoint
TexStorage3D,
TexStorage3DEXT,
TexStorage3DMultisampleOES,
+ TexStorageMem2DEXT,
+ TexStorageMem2DMultisampleEXT,
+ TexStorageMem3DEXT,
+ TexStorageMem3DMultisampleEXT,
TexSubImage2D,
TexSubImage2DRobustANGLE,
TexSubImage3D,
@@ -639,6 +659,7 @@ enum class EntryPoint
VertexBindingDivisor,
VertexPointer,
Viewport,
+ WaitSemaphoreEXT,
WaitSync,
WeightPointerOES
};
diff --git a/chromium/third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp b/chromium/third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
index c8d5eceb6a6..03f51ffb363 100644
--- a/chromium/third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
+++ b/chromium/third_party/angle/src/libGLESv2/entry_points_gles_3_0_autogen.cpp
@@ -269,7 +269,7 @@ void GL_APIENTRY CompressedTexImage3D(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCompressedTexImage3D(context, targetPacked, level, internalformat, width,
height, depth, border, imageSize, data))
@@ -303,7 +303,7 @@ void GL_APIENTRY CompressedTexSubImage3D(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCompressedTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset,
width, height, depth, format, imageSize, data))
@@ -361,7 +361,7 @@ void GL_APIENTRY CopyTexSubImage3D(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCopyTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, x, y,
width, height))
@@ -1464,7 +1464,7 @@ void GL_APIENTRY TexImage3D(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexImage3D(context, targetPacked, level, internalformat, width, height, depth,
border, format, type, pixels))
@@ -1544,7 +1544,7 @@ void GL_APIENTRY TexSubImage3D(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, width,
height, depth, format, type, pixels))
diff --git a/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp b/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp
index 9ee4137eafc..532c3173223 100644
--- a/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp
+++ b/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.cpp
@@ -329,59 +329,6 @@ void GL_APIENTRY MultiDrawElementsInstancedANGLE(GLenum mode,
}
}
-// GL_ANGLE_multiview
-void GL_APIENTRY FramebufferTextureMultiviewLayeredANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
-{
- ANGLE_SCOPED_GLOBAL_LOCK();
- EVENT(
- "(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, "
- "GLint baseViewIndex = %d, GLsizei numViews = %d)",
- target, attachment, texture, level, baseViewIndex, numViews);
-
- Context *context = GetValidGlobalContext();
- if (context)
- {
- if (context->skipValidation() ||
- ValidateFramebufferTextureMultiviewLayeredANGLE(context, target, attachment, texture,
- level, baseViewIndex, numViews))
- {
- context->framebufferTextureMultiviewLayered(target, attachment, texture, level,
- baseViewIndex, numViews);
- }
- }
-}
-
-void GL_APIENTRY FramebufferTextureMultiviewSideBySideANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- ANGLE_SCOPED_GLOBAL_LOCK();
- EVENT(
- "(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, "
- "GLsizei numViews = %d, const GLint * viewportOffsets = 0x%016" PRIxPTR ")",
- target, attachment, texture, level, numViews, (uintptr_t)viewportOffsets);
-
- Context *context = GetValidGlobalContext();
- if (context)
- {
- if (context->skipValidation() ||
- ValidateFramebufferTextureMultiviewSideBySideANGLE(context, target, attachment, texture,
- level, numViews, viewportOffsets))
- {
- context->framebufferTextureMultiviewSideBySide(target, attachment, texture, level,
- numViews, viewportOffsets);
- }
- }
-}
-
// GL_ANGLE_provoking_vertex
void GL_APIENTRY ProvokingVertexANGLE(GLenum mode)
{
@@ -923,7 +870,7 @@ void GL_APIENTRY TexImage3DRobustANGLE(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexImage3DRobustANGLE(context, targetPacked, level, internalformat, width,
height, depth, border, format, type, bufSize, pixels))
@@ -959,7 +906,7 @@ void GL_APIENTRY TexSubImage3DRobustANGLE(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexSubImage3DRobustANGLE(context, targetPacked, level, xoffset, yoffset,
zoffset, width, height, depth, format, type, bufSize,
@@ -1057,7 +1004,7 @@ void GL_APIENTRY CompressedTexImage3DRobustANGLE(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() || ValidateCompressedTexImage3DRobustANGLE(
context, targetPacked, level, internalformat, width,
height, depth, border, imageSize, dataSize, data))
@@ -1093,7 +1040,7 @@ void GL_APIENTRY CompressedTexSubImage3DRobustANGLE(GLenum target,
Context *context = GetValidGlobalContext();
if (context)
{
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCompressedTexSubImage3DRobustANGLE(context, targetPacked, level, xoffset,
yoffset, zoffset, width, height, depth,
@@ -2286,6 +2233,25 @@ void GL_APIENTRY MatrixLoadIdentityCHROMIUM(GLenum matrixMode)
}
}
+// GL_CHROMIUM_lose_context
+void GL_APIENTRY LoseContextCHROMIUM(GLenum current, GLenum other)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLenum current = 0x%X, GLenum other = 0x%X)", current, other);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ GraphicsResetStatus currentPacked = FromGLenum<GraphicsResetStatus>(current);
+ GraphicsResetStatus otherPacked = FromGLenum<GraphicsResetStatus>(other);
+ if (context->skipValidation() ||
+ ValidateLoseContextCHROMIUM(context, currentPacked, otherPacked))
+ {
+ context->loseContext(currentPacked, otherPacked);
+ }
+ }
+}
+
// GL_CHROMIUM_path_rendering
GLuint GL_APIENTRY GenPathsCHROMIUM(GLsizei range)
{
@@ -3242,6 +3208,286 @@ void *GL_APIENTRY MapBufferRangeEXT(GLenum target,
return GetDefaultReturnValue<EntryPoint::MapBufferRangeEXT, void *>();
}
+// GL_EXT_memory_object
+void GL_APIENTRY BufferStorageMemEXT(GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizeiptr size = %llu, GLuint memory = %u, GLuint64 offset = "
+ "%llu)",
+ target, static_cast<unsigned long long>(size), memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() ||
+ ValidateBufferStorageMemEXT(context, targetPacked, size, memory, offset))
+ {
+ context->bufferStorageMem(targetPacked, size, memory, offset);
+ }
+ }
+}
+
+void GL_APIENTRY CreateMemoryObjectsEXT(GLsizei n, GLuint *memoryObjects)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, GLuint *memoryObjects = 0x%016" PRIxPTR ")", n,
+ (uintptr_t)memoryObjects);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() || ValidateCreateMemoryObjectsEXT(context, n, memoryObjects))
+ {
+ context->createMemoryObjects(n, memoryObjects);
+ }
+ }
+}
+
+void GL_APIENTRY DeleteMemoryObjectsEXT(GLsizei n, const GLuint *memoryObjects)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, const GLuint *memoryObjects = 0x%016" PRIxPTR ")", n,
+ (uintptr_t)memoryObjects);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() || ValidateDeleteMemoryObjectsEXT(context, n, memoryObjects))
+ {
+ context->deleteMemoryObjects(n, memoryObjects);
+ }
+ }
+}
+
+void GL_APIENTRY GetMemoryObjectParameterivEXT(GLuint memoryObject, GLenum pname, GLint *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memoryObject = %u, GLenum pname = 0x%X, GLint *params = 0x%016" PRIxPTR ")",
+ memoryObject, pname, (uintptr_t)params);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateGetMemoryObjectParameterivEXT(context, memoryObject, pname, params))
+ {
+ context->getMemoryObjectParameteriv(memoryObject, pname, params);
+ }
+ }
+}
+
+void GL_APIENTRY GetUnsignedBytevEXT(GLenum pname, GLubyte *data)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLenum pname = 0x%X, GLubyte *data = 0x%016" PRIxPTR ")", pname, (uintptr_t)data);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() || ValidateGetUnsignedBytevEXT(context, pname, data))
+ {
+ context->getUnsignedBytev(pname, data);
+ }
+ }
+}
+
+void GL_APIENTRY GetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte *data)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLenum target = 0x%X, GLuint index = %u, GLubyte *data = 0x%016" PRIxPTR ")", target,
+ index, (uintptr_t)data);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateGetUnsignedBytei_vEXT(context, target, index, data))
+ {
+ context->getUnsignedBytei_v(target, index, data);
+ }
+ }
+}
+
+GLboolean GL_APIENTRY IsMemoryObjectEXT(GLuint memoryObject)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memoryObject = %u)", memoryObject);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() || ValidateIsMemoryObjectEXT(context, memoryObject))
+ {
+ return context->isMemoryObject(memoryObject);
+ }
+ }
+
+ return GetDefaultReturnValue<EntryPoint::IsMemoryObjectEXT, GLboolean>();
+}
+
+void GL_APIENTRY MemoryObjectParameterivEXT(GLuint memoryObject, GLenum pname, const GLint *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memoryObject = %u, GLenum pname = 0x%X, const GLint *params = 0x%016" PRIxPTR
+ ")",
+ memoryObject, pname, (uintptr_t)params);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateMemoryObjectParameterivEXT(context, memoryObject, pname, params))
+ {
+ context->memoryObjectParameteriv(memoryObject, pname, params);
+ }
+ }
+}
+
+void GL_APIENTRY TexStorageMem2DEXT(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalFormat = 0x%X, GLsizei width = "
+ "%d, GLsizei height = %d, GLuint memory = %u, GLuint64 offset = %llu)",
+ target, levels, internalFormat, width, height, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() ||
+ ValidateTexStorageMem2DEXT(context, targetPacked, levels, internalFormat, width, height,
+ memory, offset))
+ {
+ context->texStorageMem2D(targetPacked, levels, internalFormat, width, height, memory,
+ offset);
+ }
+ }
+}
+
+void GL_APIENTRY TexStorageMem2DMultisampleEXT(GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalFormat = 0x%X, GLsizei width "
+ "= %d, GLsizei height = %d, GLboolean fixedSampleLocations = %u, GLuint memory = %u, "
+ "GLuint64 offset = %llu)",
+ target, samples, internalFormat, width, height, fixedSampleLocations, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() || ValidateTexStorageMem2DMultisampleEXT(
+ context, targetPacked, samples, internalFormat, width,
+ height, fixedSampleLocations, memory, offset))
+ {
+ context->texStorageMem2DMultisample(targetPacked, samples, internalFormat, width,
+ height, fixedSampleLocations, memory, offset);
+ }
+ }
+}
+
+void GL_APIENTRY TexStorageMem3DEXT(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalFormat = 0x%X, GLsizei width = "
+ "%d, GLsizei height = %d, GLsizei depth = %d, GLuint memory = %u, GLuint64 offset = %llu)",
+ target, levels, internalFormat, width, height, depth, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() ||
+ ValidateTexStorageMem3DEXT(context, targetPacked, levels, internalFormat, width, height,
+ depth, memory, offset))
+ {
+ context->texStorageMem3D(targetPacked, levels, internalFormat, width, height, depth,
+ memory, offset);
+ }
+ }
+}
+
+void GL_APIENTRY TexStorageMem3DMultisampleEXT(GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalFormat = 0x%X, GLsizei width "
+ "= %d, GLsizei height = %d, GLsizei depth = %d, GLboolean fixedSampleLocations = %u, "
+ "GLuint memory = %u, GLuint64 offset = %llu)",
+ target, samples, internalFormat, width, height, depth, fixedSampleLocations, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() || ValidateTexStorageMem3DMultisampleEXT(
+ context, targetPacked, samples, internalFormat, width,
+ height, depth, fixedSampleLocations, memory, offset))
+ {
+ context->texStorageMem3DMultisample(targetPacked, samples, internalFormat, width,
+ height, depth, fixedSampleLocations, memory,
+ offset);
+ }
+ }
+}
+
+// GL_EXT_memory_object_fd
+void GL_APIENTRY ImportMemoryFdEXT(GLuint memory, GLuint64 size, GLenum handleType, GLint fd)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memory = %u, GLuint64 size = %llu, GLenum handleType = 0x%X, GLint fd = %d)",
+ memory, static_cast<unsigned long long>(size), handleType, fd);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ HandleType handleTypePacked = FromGLenum<HandleType>(handleType);
+ if (context->skipValidation() ||
+ ValidateImportMemoryFdEXT(context, memory, size, handleTypePacked, fd))
+ {
+ context->importMemoryFd(memory, size, handleTypePacked, fd);
+ }
+ }
+}
+
// GL_EXT_occlusion_query_boolean
// BeginQueryEXT is already defined.
@@ -3263,7 +3509,7 @@ GLenum GL_APIENTRY GetGraphicsResetStatusEXT()
ANGLE_SCOPED_GLOBAL_LOCK();
EVENT("()");
- Context *context = GetValidGlobalContext();
+ Context *context = GetGlobalContext();
if (context)
{
if (context->skipValidation() || ValidateGetGraphicsResetStatusEXT(context))
@@ -3339,6 +3585,169 @@ void GL_APIENTRY ReadnPixelsEXT(GLint x,
}
}
+// GL_EXT_semaphore
+void GL_APIENTRY DeleteSemaphoresEXT(GLsizei n, const GLuint *semaphores)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, const GLuint *semaphores = 0x%016" PRIxPTR ")", n,
+ (uintptr_t)semaphores);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() || ValidateDeleteSemaphoresEXT(context, n, semaphores))
+ {
+ context->deleteSemaphores(n, semaphores);
+ }
+ }
+}
+
+void GL_APIENTRY GenSemaphoresEXT(GLsizei n, GLuint *semaphores)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, GLuint *semaphores = 0x%016" PRIxPTR ")", n, (uintptr_t)semaphores);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() || ValidateGenSemaphoresEXT(context, n, semaphores))
+ {
+ context->genSemaphores(n, semaphores);
+ }
+ }
+}
+
+void GL_APIENTRY GetSemaphoreParameterui64vEXT(GLuint semaphore, GLenum pname, GLuint64 *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u, GLenum pname = 0x%X, GLuint64 *params = 0x%016" PRIxPTR ")",
+ semaphore, pname, (uintptr_t)params);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateGetSemaphoreParameterui64vEXT(context, semaphore, pname, params))
+ {
+ context->getSemaphoreParameterui64v(semaphore, pname, params);
+ }
+ }
+}
+
+GLboolean GL_APIENTRY IsSemaphoreEXT(GLuint semaphore)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u)", semaphore);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() || ValidateIsSemaphoreEXT(context, semaphore))
+ {
+ return context->isSemaphore(semaphore);
+ }
+ }
+
+ return GetDefaultReturnValue<EntryPoint::IsSemaphoreEXT, GLboolean>();
+}
+
+void GL_APIENTRY SemaphoreParameterui64vEXT(GLuint semaphore, GLenum pname, const GLuint64 *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u, GLenum pname = 0x%X, const GLuint64 *params = 0x%016" PRIxPTR
+ ")",
+ semaphore, pname, (uintptr_t)params);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateSemaphoreParameterui64vEXT(context, semaphore, pname, params))
+ {
+ context->semaphoreParameterui64v(semaphore, pname, params);
+ }
+ }
+}
+
+void GL_APIENTRY SignalSemaphoreEXT(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLuint semaphore = %u, GLuint numBufferBarriers = %u, const GLuint *buffers = "
+ "0x%016" PRIxPTR ", GLuint numTextureBarriers = %u, const GLuint *textures = 0x%016" PRIxPTR
+ ", const GLenum *dstLayouts = 0x%016" PRIxPTR ")",
+ semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers, (uintptr_t)textures,
+ (uintptr_t)dstLayouts);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateSignalSemaphoreEXT(context, semaphore, numBufferBarriers, buffers,
+ numTextureBarriers, textures, dstLayouts))
+ {
+ context->signalSemaphore(semaphore, numBufferBarriers, buffers, numTextureBarriers,
+ textures, dstLayouts);
+ }
+ }
+}
+
+void GL_APIENTRY WaitSemaphoreEXT(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLuint semaphore = %u, GLuint numBufferBarriers = %u, const GLuint *buffers = "
+ "0x%016" PRIxPTR ", GLuint numTextureBarriers = %u, const GLuint *textures = 0x%016" PRIxPTR
+ ", const GLenum *srcLayouts = 0x%016" PRIxPTR ")",
+ semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers, (uintptr_t)textures,
+ (uintptr_t)srcLayouts);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateWaitSemaphoreEXT(context, semaphore, numBufferBarriers, buffers,
+ numTextureBarriers, textures, srcLayouts))
+ {
+ context->waitSemaphore(semaphore, numBufferBarriers, buffers, numTextureBarriers,
+ textures, srcLayouts);
+ }
+ }
+}
+
+// GetUnsignedBytei_vEXT is already defined.
+
+// GetUnsignedBytevEXT is already defined.
+
+// GL_EXT_semaphore_fd
+void GL_APIENTRY ImportSemaphoreFdEXT(GLuint semaphore, GLenum handleType, GLint fd)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u, GLenum handleType = 0x%X, GLint fd = %d)", semaphore, handleType,
+ fd);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ HandleType handleTypePacked = FromGLenum<HandleType>(handleType);
+ if (context->skipValidation() ||
+ ValidateImportSemaphoreFdEXT(context, semaphore, handleTypePacked, fd))
+ {
+ context->importSemaphoreFd(semaphore, handleTypePacked, fd);
+ }
+ }
+}
+
// GL_EXT_texture_storage
void GL_APIENTRY TexStorage1DEXT(GLenum target,
GLsizei levels,
@@ -4779,6 +5188,35 @@ GLboolean GL_APIENTRY IsVertexArrayOES(GLuint array)
return GetDefaultReturnValue<EntryPoint::IsVertexArrayOES, GLboolean>();
}
+// GL_OVR_multiview
+void GL_APIENTRY FramebufferTextureMultiviewOVR(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, "
+ "GLint baseViewIndex = %d, GLsizei numViews = %d)",
+ target, attachment, texture, level, baseViewIndex, numViews);
+
+ Context *context = GetValidGlobalContext();
+ if (context)
+ {
+ if (context->skipValidation() ||
+ ValidateFramebufferTextureMultiviewOVR(context, target, attachment, texture, level,
+ baseViewIndex, numViews))
+ {
+ context->framebufferTextureMultiview(target, attachment, texture, level, baseViewIndex,
+ numViews);
+ }
+ }
+}
+
+// GL_OVR_multiview2
+
// EGL_ANGLE_explicit_context
void GL_APIENTRY ActiveShaderProgramContextANGLE(GLeglContext ctx, GLuint pipeline, GLuint program)
{
@@ -5441,6 +5879,32 @@ void GL_APIENTRY BufferDataContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY BufferStorageMemEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizeiptr size,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizeiptr size = %llu, GLuint memory = %u, GLuint64 offset = "
+ "%llu)",
+ target, static_cast<unsigned long long>(size), memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() ||
+ ValidateBufferStorageMemEXT(context, targetPacked, size, memory, offset))
+ {
+ context->bufferStorageMem(targetPacked, size, memory, offset);
+ }
+ }
+}
+
void GL_APIENTRY BufferSubDataContextANGLE(GLeglContext ctx,
GLenum target,
GLintptr offset,
@@ -5926,7 +6390,7 @@ void GL_APIENTRY CompressedTexImage3DContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCompressedTexImage3D(context, targetPacked, level, internalformat, width,
height, depth, border, imageSize, data))
@@ -5995,7 +6459,7 @@ void GL_APIENTRY CompressedTexSubImage3DContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCompressedTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset,
width, height, depth, format, imageSize, data))
@@ -6118,7 +6582,7 @@ void GL_APIENTRY CopyTexSubImage3DContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCopyTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, x, y,
width, height))
@@ -6129,6 +6593,25 @@ void GL_APIENTRY CopyTexSubImage3DContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY CreateMemoryObjectsEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ GLuint *memoryObjects)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, GLuint *memoryObjects = 0x%016" PRIxPTR ")", n,
+ (uintptr_t)memoryObjects);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() || ValidateCreateMemoryObjectsEXT(context, n, memoryObjects))
+ {
+ context->createMemoryObjects(n, memoryObjects);
+ }
+ }
+}
+
GLuint GL_APIENTRY CreateProgramContextANGLE(GLeglContext ctx)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -6368,6 +6851,25 @@ void GL_APIENTRY DeleteFramebuffersOESContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY DeleteMemoryObjectsEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ const GLuint *memoryObjects)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, const GLuint *memoryObjects = 0x%016" PRIxPTR ")", n,
+ (uintptr_t)memoryObjects);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() || ValidateDeleteMemoryObjectsEXT(context, n, memoryObjects))
+ {
+ context->deleteMemoryObjects(n, memoryObjects);
+ }
+ }
+}
+
void GL_APIENTRY DeleteProgramContextANGLE(GLeglContext ctx, GLuint program)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -6489,6 +6991,25 @@ void GL_APIENTRY DeleteSamplersContextANGLE(GLeglContext ctx, GLsizei count, con
}
}
+void GL_APIENTRY DeleteSemaphoresEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ const GLuint *semaphores)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, const GLuint *semaphores = 0x%016" PRIxPTR ")", n,
+ (uintptr_t)semaphores);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() || ValidateDeleteSemaphoresEXT(context, n, semaphores))
+ {
+ context->deleteSemaphores(n, semaphores);
+ }
+ }
+}
+
void GL_APIENTRY DeleteShaderContextANGLE(GLeglContext ctx, GLuint shader)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -7714,6 +8235,34 @@ void GL_APIENTRY FramebufferTextureLayerContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY FramebufferTextureMultiviewOVRContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, "
+ "GLint baseViewIndex = %d, GLsizei numViews = %d)",
+ target, attachment, texture, level, baseViewIndex, numViews);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateFramebufferTextureMultiviewOVR(context, target, attachment, texture, level,
+ baseViewIndex, numViews))
+ {
+ context->framebufferTextureMultiview(target, attachment, texture, level, baseViewIndex,
+ numViews);
+ }
+ }
+}
+
void GL_APIENTRY FrontFaceContextANGLE(GLeglContext ctx, GLenum mode)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -7942,6 +8491,22 @@ void GL_APIENTRY GenSamplersContextANGLE(GLeglContext ctx, GLsizei count, GLuint
}
}
+void GL_APIENTRY GenSemaphoresEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *semaphores)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLsizei n = %d, GLuint *semaphores = 0x%016" PRIxPTR ")", n, (uintptr_t)semaphores);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() || ValidateGenSemaphoresEXT(context, n, semaphores))
+ {
+ context->genSemaphores(n, semaphores);
+ }
+ }
+}
+
void GL_APIENTRY GenTexturesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *textures)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -8596,7 +9161,7 @@ GLenum GL_APIENTRY GetGraphicsResetStatusEXTContextANGLE(GLeglContext ctx)
ANGLE_SCOPED_GLOBAL_LOCK();
EVENT("()");
- Context *context = static_cast<gl::Context *>(ctx);
+ Context *context = GetGlobalContext();
if (context)
{
ASSERT(context == GetValidGlobalContext());
@@ -8790,6 +9355,27 @@ void GL_APIENTRY GetMaterialxvContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY GetMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx,
+ GLuint memoryObject,
+ GLenum pname,
+ GLint *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memoryObject = %u, GLenum pname = 0x%X, GLint *params = 0x%016" PRIxPTR ")",
+ memoryObject, pname, (uintptr_t)params);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateGetMemoryObjectParameterivEXT(context, memoryObject, pname, params))
+ {
+ context->getMemoryObjectParameteriv(memoryObject, pname, params);
+ }
+ }
+}
+
void GL_APIENTRY GetMultisamplefvContextANGLE(GLeglContext ctx,
GLenum pname,
GLuint index,
@@ -9455,6 +10041,27 @@ void GL_APIENTRY GetSamplerParameterivContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY GetSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum pname,
+ GLuint64 *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u, GLenum pname = 0x%X, GLuint64 *params = 0x%016" PRIxPTR ")",
+ semaphore, pname, (uintptr_t)params);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateGetSemaphoreParameterui64vEXT(context, semaphore, pname, params))
+ {
+ context->getSemaphoreParameterui64v(semaphore, pname, params);
+ }
+ }
+}
+
void GL_APIENTRY GetShaderInfoLogContextANGLE(GLeglContext ctx,
GLuint shader,
GLsizei bufSize,
@@ -10074,6 +10681,43 @@ void GL_APIENTRY GetUniformuivContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY GetUnsignedBytevEXTContextANGLE(GLeglContext ctx, GLenum pname, GLubyte *data)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLenum pname = 0x%X, GLubyte *data = 0x%016" PRIxPTR ")", pname, (uintptr_t)data);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() || ValidateGetUnsignedBytevEXT(context, pname, data))
+ {
+ context->getUnsignedBytev(pname, data);
+ }
+ }
+}
+
+void GL_APIENTRY GetUnsignedBytei_vEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLuint index,
+ GLubyte *data)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLenum target = 0x%X, GLuint index = %u, GLubyte *data = 0x%016" PRIxPTR ")", target,
+ index, (uintptr_t)data);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateGetUnsignedBytei_vEXT(context, target, index, data))
+ {
+ context->getUnsignedBytei_v(target, index, data);
+ }
+ }
+}
+
void GL_APIENTRY GetVertexAttribIivContextANGLE(GLeglContext ctx,
GLuint index,
GLenum pname,
@@ -10239,6 +10883,51 @@ void GL_APIENTRY HintContextANGLE(GLeglContext ctx, GLenum target, GLenum mode)
}
}
+void GL_APIENTRY ImportMemoryFdEXTContextANGLE(GLeglContext ctx,
+ GLuint memory,
+ GLuint64 size,
+ GLenum handleType,
+ GLint fd)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memory = %u, GLuint64 size = %llu, GLenum handleType = 0x%X, GLint fd = %d)",
+ memory, static_cast<unsigned long long>(size), handleType, fd);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ HandleType handleTypePacked = FromGLenum<HandleType>(handleType);
+ if (context->skipValidation() ||
+ ValidateImportMemoryFdEXT(context, memory, size, handleTypePacked, fd))
+ {
+ context->importMemoryFd(memory, size, handleTypePacked, fd);
+ }
+ }
+}
+
+void GL_APIENTRY ImportSemaphoreFdEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum handleType,
+ GLint fd)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u, GLenum handleType = 0x%X, GLint fd = %d)", semaphore, handleType,
+ fd);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ HandleType handleTypePacked = FromGLenum<HandleType>(handleType);
+ if (context->skipValidation() ||
+ ValidateImportSemaphoreFdEXT(context, semaphore, handleTypePacked, fd))
+ {
+ context->importSemaphoreFd(semaphore, handleTypePacked, fd);
+ }
+ }
+}
+
void GL_APIENTRY InsertEventMarkerEXTContextANGLE(GLeglContext ctx,
GLsizei length,
const GLchar *marker)
@@ -10402,6 +11091,24 @@ GLboolean GL_APIENTRY IsFramebufferOESContextANGLE(GLeglContext ctx, GLuint fram
return GetDefaultReturnValue<EntryPoint::IsFramebufferOES, GLboolean>();
}
+GLboolean GL_APIENTRY IsMemoryObjectEXTContextANGLE(GLeglContext ctx, GLuint memoryObject)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memoryObject = %u)", memoryObject);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() || ValidateIsMemoryObjectEXT(context, memoryObject))
+ {
+ return context->isMemoryObject(memoryObject);
+ }
+ }
+
+ return GetDefaultReturnValue<EntryPoint::IsMemoryObjectEXT, GLboolean>();
+}
+
GLboolean GL_APIENTRY IsProgramContextANGLE(GLeglContext ctx, GLuint program)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -10510,6 +11217,24 @@ GLboolean GL_APIENTRY IsRenderbufferOESContextANGLE(GLeglContext ctx, GLuint ren
return GetDefaultReturnValue<EntryPoint::IsRenderbufferOES, GLboolean>();
}
+GLboolean GL_APIENTRY IsSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u)", semaphore);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() || ValidateIsSemaphoreEXT(context, semaphore))
+ {
+ return context->isSemaphore(semaphore);
+ }
+ }
+
+ return GetDefaultReturnValue<EntryPoint::IsSemaphoreEXT, GLboolean>();
+}
+
GLboolean GL_APIENTRY IsSamplerContextANGLE(GLeglContext ctx, GLuint sampler)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -11147,6 +11872,28 @@ void GL_APIENTRY MemoryBarrierByRegionContextANGLE(GLeglContext ctx, GLbitfield
}
}
+void GL_APIENTRY MemoryObjectParameterivEXTContextANGLE(GLeglContext ctx,
+ GLuint memoryObject,
+ GLenum pname,
+ const GLint *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint memoryObject = %u, GLenum pname = 0x%X, const GLint *params = 0x%016" PRIxPTR
+ ")",
+ memoryObject, pname, (uintptr_t)params);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateMemoryObjectParameterivEXT(context, memoryObject, pname, params))
+ {
+ context->memoryObjectParameteriv(memoryObject, pname, params);
+ }
+ }
+}
+
void GL_APIENTRY MultMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -13016,6 +13763,28 @@ ScissorContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei h
}
}
+void GL_APIENTRY SemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum pname,
+ const GLuint64 *params)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLuint semaphore = %u, GLenum pname = 0x%X, const GLuint64 *params = 0x%016" PRIxPTR
+ ")",
+ semaphore, pname, (uintptr_t)params);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateSemaphoreParameterui64vEXT(context, semaphore, pname, params))
+ {
+ context->semaphoreParameterui64v(semaphore, pname, params);
+ }
+ }
+}
+
void GL_APIENTRY SetFenceNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum condition)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -13097,6 +13866,36 @@ void GL_APIENTRY ShaderSourceContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY SignalSemaphoreEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLuint semaphore = %u, GLuint numBufferBarriers = %u, const GLuint *buffers = "
+ "0x%016" PRIxPTR ", GLuint numTextureBarriers = %u, const GLuint *textures = 0x%016" PRIxPTR
+ ", const GLenum *dstLayouts = 0x%016" PRIxPTR ")",
+ semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers, (uintptr_t)textures,
+ (uintptr_t)dstLayouts);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateSignalSemaphoreEXT(context, semaphore, numBufferBarriers, buffers,
+ numTextureBarriers, textures, dstLayouts))
+ {
+ context->signalSemaphore(semaphore, numBufferBarriers, buffers, numTextureBarriers,
+ textures, dstLayouts);
+ }
+ }
+}
+
void GL_APIENTRY StencilFuncContextANGLE(GLeglContext ctx, GLenum func, GLint ref, GLuint mask)
{
ANGLE_SCOPED_GLOBAL_LOCK();
@@ -13534,7 +14333,7 @@ void GL_APIENTRY TexImage3DContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexImage3D(context, targetPacked, level, internalformat, width, height, depth,
border, format, type, pixels))
@@ -13906,6 +14705,137 @@ void GL_APIENTRY TexStorage3DMultisampleOESContextANGLE(GLeglContext ctx,
}
}
+void GL_APIENTRY TexStorageMem2DEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalFormat = 0x%X, GLsizei width = "
+ "%d, GLsizei height = %d, GLuint memory = %u, GLuint64 offset = %llu)",
+ target, levels, internalFormat, width, height, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() ||
+ ValidateTexStorageMem2DEXT(context, targetPacked, levels, internalFormat, width, height,
+ memory, offset))
+ {
+ context->texStorageMem2D(targetPacked, levels, internalFormat, width, height, memory,
+ offset);
+ }
+ }
+}
+
+void GL_APIENTRY TexStorageMem2DMultisampleEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalFormat = 0x%X, GLsizei width "
+ "= %d, GLsizei height = %d, GLboolean fixedSampleLocations = %u, GLuint memory = %u, "
+ "GLuint64 offset = %llu)",
+ target, samples, internalFormat, width, height, fixedSampleLocations, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() || ValidateTexStorageMem2DMultisampleEXT(
+ context, targetPacked, samples, internalFormat, width,
+ height, fixedSampleLocations, memory, offset))
+ {
+ context->texStorageMem2DMultisample(targetPacked, samples, internalFormat, width,
+ height, fixedSampleLocations, memory, offset);
+ }
+ }
+}
+
+void GL_APIENTRY TexStorageMem3DEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalFormat = 0x%X, GLsizei width = "
+ "%d, GLsizei height = %d, GLsizei depth = %d, GLuint memory = %u, GLuint64 offset = %llu)",
+ target, levels, internalFormat, width, height, depth, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() ||
+ ValidateTexStorageMem3DEXT(context, targetPacked, levels, internalFormat, width, height,
+ depth, memory, offset))
+ {
+ context->texStorageMem3D(targetPacked, levels, internalFormat, width, height, depth,
+ memory, offset);
+ }
+ }
+}
+
+void GL_APIENTRY TexStorageMem3DMultisampleEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalFormat = 0x%X, GLsizei width "
+ "= %d, GLsizei height = %d, GLsizei depth = %d, GLboolean fixedSampleLocations = %u, "
+ "GLuint memory = %u, GLuint64 offset = %llu)",
+ target, samples, internalFormat, width, height, depth, fixedSampleLocations, memory,
+ static_cast<unsigned long long>(offset));
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ TextureType targetPacked = FromGLenum<TextureType>(target);
+ if (context->skipValidation() || ValidateTexStorageMem3DMultisampleEXT(
+ context, targetPacked, samples, internalFormat, width,
+ height, depth, fixedSampleLocations, memory, offset))
+ {
+ context->texStorageMem3DMultisample(targetPacked, samples, internalFormat, width,
+ height, depth, fixedSampleLocations, memory,
+ offset);
+ }
+ }
+}
+
void GL_APIENTRY TexSubImage2DContextANGLE(GLeglContext ctx,
GLenum target,
GLint level,
@@ -13964,7 +14894,7 @@ void GL_APIENTRY TexSubImage3DContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexSubImage3D(context, targetPacked, level, xoffset, yoffset, zoffset, width,
height, depth, format, type, pixels))
@@ -15263,6 +16193,36 @@ ViewportContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei
}
}
+void GL_APIENTRY WaitSemaphoreEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT(
+ "(GLuint semaphore = %u, GLuint numBufferBarriers = %u, const GLuint *buffers = "
+ "0x%016" PRIxPTR ", GLuint numTextureBarriers = %u, const GLuint *textures = 0x%016" PRIxPTR
+ ", const GLenum *srcLayouts = 0x%016" PRIxPTR ")",
+ semaphore, numBufferBarriers, (uintptr_t)buffers, numTextureBarriers, (uintptr_t)textures,
+ (uintptr_t)srcLayouts);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ if (context->skipValidation() ||
+ ValidateWaitSemaphoreEXT(context, semaphore, numBufferBarriers, buffers,
+ numTextureBarriers, textures, srcLayouts))
+ {
+ context->waitSemaphore(semaphore, numBufferBarriers, buffers, numTextureBarriers,
+ textures, srcLayouts);
+ }
+ }
+}
+
void GL_APIENTRY WaitSyncContextANGLE(GLeglContext ctx,
GLsync sync,
GLbitfield flags,
@@ -16587,7 +17547,7 @@ void GL_APIENTRY TexImage3DRobustANGLEContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexImage3DRobustANGLE(context, targetPacked, level, internalformat, width,
height, depth, border, format, type, bufSize, pixels))
@@ -16625,7 +17585,7 @@ void GL_APIENTRY TexSubImage3DRobustANGLEContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateTexSubImage3DRobustANGLE(context, targetPacked, level, xoffset, yoffset,
zoffset, width, height, depth, format, type, bufSize,
@@ -16729,7 +17689,7 @@ void GL_APIENTRY CompressedTexImage3DRobustANGLEContextANGLE(GLeglContext ctx,
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() || ValidateCompressedTexImage3DRobustANGLE(
context, targetPacked, level, internalformat, width,
height, depth, border, imageSize, dataSize, data))
@@ -16767,7 +17727,7 @@ void GL_APIENTRY CompressedTexSubImage3DRobustANGLEContextANGLE(GLeglContext ctx
if (context)
{
ASSERT(context == GetValidGlobalContext());
- TextureType targetPacked = FromGLenum<TextureType>(target);
+ TextureTarget targetPacked = FromGLenum<TextureTarget>(target);
if (context->skipValidation() ||
ValidateCompressedTexSubImage3DRobustANGLE(context, targetPacked, level, xoffset,
yoffset, zoffset, width, height, depth,
@@ -17755,63 +18715,6 @@ void GL_APIENTRY GetQueryObjectui64vRobustANGLEContextANGLE(GLeglContext ctx,
}
}
-void GL_APIENTRY FramebufferTextureMultiviewLayeredANGLEContextANGLE(GLeglContext ctx,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
-{
- ANGLE_SCOPED_GLOBAL_LOCK();
- EVENT(
- "(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, "
- "GLint baseViewIndex = %d, GLsizei numViews = %d)",
- target, attachment, texture, level, baseViewIndex, numViews);
-
- Context *context = static_cast<gl::Context *>(ctx);
- if (context)
- {
- ASSERT(context == GetValidGlobalContext());
- if (context->skipValidation() ||
- ValidateFramebufferTextureMultiviewLayeredANGLE(context, target, attachment, texture,
- level, baseViewIndex, numViews))
- {
- context->framebufferTextureMultiviewLayered(target, attachment, texture, level,
- baseViewIndex, numViews);
- }
- }
-}
-
-void GL_APIENTRY
-FramebufferTextureMultiviewSideBySideANGLEContextANGLE(GLeglContext ctx,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- ANGLE_SCOPED_GLOBAL_LOCK();
- EVENT(
- "(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, "
- "GLsizei numViews = %d, const GLint * viewportOffsets = 0x%016" PRIxPTR ")",
- target, attachment, texture, level, numViews, (uintptr_t)viewportOffsets);
-
- Context *context = static_cast<gl::Context *>(ctx);
- if (context)
- {
- ASSERT(context == GetValidGlobalContext());
- if (context->skipValidation() ||
- ValidateFramebufferTextureMultiviewSideBySideANGLE(context, target, attachment, texture,
- level, numViews, viewportOffsets))
- {
- context->framebufferTextureMultiviewSideBySide(target, attachment, texture, level,
- numViews, viewportOffsets);
- }
- }
-}
-
void GL_APIENTRY CopyTexture3DANGLEContextANGLE(GLeglContext ctx,
GLuint sourceId,
GLint sourceLevel,
@@ -18138,4 +19041,23 @@ void GL_APIENTRY ProvokingVertexANGLEContextANGLE(GLeglContext ctx, GLenum mode)
}
}
}
+
+void GL_APIENTRY LoseContextCHROMIUMContextANGLE(GLeglContext ctx, GLenum current, GLenum other)
+{
+ ANGLE_SCOPED_GLOBAL_LOCK();
+ EVENT("(GLenum current = 0x%X, GLenum other = 0x%X)", current, other);
+
+ Context *context = static_cast<gl::Context *>(ctx);
+ if (context)
+ {
+ ASSERT(context == GetValidGlobalContext());
+ GraphicsResetStatus currentPacked = FromGLenum<GraphicsResetStatus>(current);
+ GraphicsResetStatus otherPacked = FromGLenum<GraphicsResetStatus>(other);
+ if (context->skipValidation() ||
+ ValidateLoseContextCHROMIUM(context, currentPacked, otherPacked))
+ {
+ context->loseContext(currentPacked, otherPacked);
+ }
+ }
+}
} // namespace gl
diff --git a/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.h b/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.h
index 0b7fbab8580..530a89c74a1 100644
--- a/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.h
+++ b/chromium/third_party/angle/src/libGLESv2/entry_points_gles_ext_autogen.h
@@ -102,21 +102,6 @@ ANGLE_EXPORT void GL_APIENTRY MultiDrawElementsInstancedANGLE(GLenum mode,
const GLsizei *instanceCounts,
GLsizei drawcount);
-// GL_ANGLE_multiview
-ANGLE_EXPORT void GL_APIENTRY FramebufferTextureMultiviewLayeredANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews);
-ANGLE_EXPORT void GL_APIENTRY
-FramebufferTextureMultiviewSideBySideANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets);
-
// GL_ANGLE_provoking_vertex
ANGLE_EXPORT void GL_APIENTRY ProvokingVertexANGLE(GLenum mode);
@@ -554,6 +539,9 @@ ANGLE_EXPORT void GL_APIENTRY CoverageModulationCHROMIUM(GLenum components);
ANGLE_EXPORT void GL_APIENTRY MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat *matrix);
ANGLE_EXPORT void GL_APIENTRY MatrixLoadIdentityCHROMIUM(GLenum matrixMode);
+// GL_CHROMIUM_lose_context
+ANGLE_EXPORT void GL_APIENTRY LoseContextCHROMIUM(GLenum current, GLenum other);
+
// GL_CHROMIUM_path_rendering
ANGLE_EXPORT GLuint GL_APIENTRY GenPathsCHROMIUM(GLsizei range);
ANGLE_EXPORT void GL_APIENTRY DeletePathsCHROMIUM(GLuint first, GLsizei range);
@@ -706,6 +694,61 @@ ANGLE_EXPORT void *GL_APIENTRY MapBufferRangeEXT(GLenum target,
GLsizeiptr length,
GLbitfield access);
+// GL_EXT_memory_object
+ANGLE_EXPORT void GL_APIENTRY BufferStorageMemEXT(GLenum target,
+ GLsizeiptr size,
+ GLuint memory,
+ GLuint64 offset);
+ANGLE_EXPORT void GL_APIENTRY CreateMemoryObjectsEXT(GLsizei n, GLuint *memoryObjects);
+ANGLE_EXPORT void GL_APIENTRY DeleteMemoryObjectsEXT(GLsizei n, const GLuint *memoryObjects);
+ANGLE_EXPORT void GL_APIENTRY GetMemoryObjectParameterivEXT(GLuint memoryObject,
+ GLenum pname,
+ GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetUnsignedBytevEXT(GLenum pname, GLubyte *data);
+ANGLE_EXPORT void GL_APIENTRY GetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte *data);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsMemoryObjectEXT(GLuint memoryObject);
+ANGLE_EXPORT void GL_APIENTRY MemoryObjectParameterivEXT(GLuint memoryObject,
+ GLenum pname,
+ const GLint *params);
+ANGLE_EXPORT void GL_APIENTRY TexStorageMem2DEXT(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset);
+ANGLE_EXPORT void GL_APIENTRY TexStorageMem2DMultisampleEXT(GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
+ANGLE_EXPORT void GL_APIENTRY TexStorageMem3DEXT(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset);
+ANGLE_EXPORT void GL_APIENTRY TexStorageMem3DMultisampleEXT(GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
+
+// GL_EXT_memory_object_fd
+ANGLE_EXPORT void GL_APIENTRY ImportMemoryFdEXT(GLuint memory,
+ GLuint64 size,
+ GLenum handleType,
+ GLint fd);
+
// GL_EXT_occlusion_query_boolean
// GL_EXT_robustness
@@ -727,6 +770,32 @@ ANGLE_EXPORT void GL_APIENTRY ReadnPixelsEXT(GLint x,
GLsizei bufSize,
void *data);
+// GL_EXT_semaphore
+ANGLE_EXPORT void GL_APIENTRY DeleteSemaphoresEXT(GLsizei n, const GLuint *semaphores);
+ANGLE_EXPORT void GL_APIENTRY GenSemaphoresEXT(GLsizei n, GLuint *semaphores);
+ANGLE_EXPORT void GL_APIENTRY GetSemaphoreParameterui64vEXT(GLuint semaphore,
+ GLenum pname,
+ GLuint64 *params);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsSemaphoreEXT(GLuint semaphore);
+ANGLE_EXPORT void GL_APIENTRY SemaphoreParameterui64vEXT(GLuint semaphore,
+ GLenum pname,
+ const GLuint64 *params);
+ANGLE_EXPORT void GL_APIENTRY SignalSemaphoreEXT(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts);
+ANGLE_EXPORT void GL_APIENTRY WaitSemaphoreEXT(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts);
+
+// GL_EXT_semaphore_fd
+ANGLE_EXPORT void GL_APIENTRY ImportSemaphoreFdEXT(GLuint semaphore, GLenum handleType, GLint fd);
+
// GL_EXT_texture_storage
ANGLE_EXPORT void GL_APIENTRY TexStorage1DEXT(GLenum target,
GLsizei levels,
@@ -929,6 +998,16 @@ ANGLE_EXPORT void GL_APIENTRY DeleteVertexArraysOES(GLsizei n, const GLuint *arr
ANGLE_EXPORT void GL_APIENTRY GenVertexArraysOES(GLsizei n, GLuint *arrays);
ANGLE_EXPORT GLboolean GL_APIENTRY IsVertexArrayOES(GLuint array);
+// GL_OVR_multiview
+ANGLE_EXPORT void GL_APIENTRY FramebufferTextureMultiviewOVR(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews);
+
+// GL_OVR_multiview2
+
// EGL_ANGLE_explicit_context
ANGLE_EXPORT void GL_APIENTRY ActiveShaderProgramContextANGLE(GLeglContext ctx,
GLuint pipeline,
@@ -1047,6 +1126,11 @@ ANGLE_EXPORT void GL_APIENTRY BufferDataContextANGLE(GLeglContext ctx,
GLsizeiptr size,
const void *data,
GLenum usage);
+ANGLE_EXPORT void GL_APIENTRY BufferStorageMemEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizeiptr size,
+ GLuint memory,
+ GLuint64 offset);
ANGLE_EXPORT void GL_APIENTRY BufferSubDataContextANGLE(GLeglContext ctx,
GLenum target,
GLintptr offset,
@@ -1183,6 +1267,9 @@ ANGLE_EXPORT void GL_APIENTRY CopyTexSubImage3DContextANGLE(GLeglContext ctx,
GLint y,
GLsizei width,
GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY CreateMemoryObjectsEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ GLuint *memoryObjects);
ANGLE_EXPORT GLuint GL_APIENTRY CreateProgramContextANGLE(GLeglContext ctx);
ANGLE_EXPORT GLuint GL_APIENTRY CreateShaderContextANGLE(GLeglContext ctx, GLenum type);
ANGLE_EXPORT GLuint GL_APIENTRY CreateShaderProgramvContextANGLE(GLeglContext ctx,
@@ -1221,6 +1308,9 @@ ANGLE_EXPORT void GL_APIENTRY DeleteFramebuffersContextANGLE(GLeglContext ctx,
ANGLE_EXPORT void GL_APIENTRY DeleteFramebuffersOESContextANGLE(GLeglContext ctx,
GLsizei n,
const GLuint *framebuffers);
+ANGLE_EXPORT void GL_APIENTRY DeleteMemoryObjectsEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ const GLuint *memoryObjects);
ANGLE_EXPORT void GL_APIENTRY DeleteProgramContextANGLE(GLeglContext ctx, GLuint program);
ANGLE_EXPORT void GL_APIENTRY DeleteProgramPipelinesContextANGLE(GLeglContext ctx,
GLsizei n,
@@ -1240,6 +1330,9 @@ ANGLE_EXPORT void GL_APIENTRY DeleteRenderbuffersOESContextANGLE(GLeglContext ct
ANGLE_EXPORT void GL_APIENTRY DeleteSamplersContextANGLE(GLeglContext ctx,
GLsizei count,
const GLuint *samplers);
+ANGLE_EXPORT void GL_APIENTRY DeleteSemaphoresEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ const GLuint *semaphores);
ANGLE_EXPORT void GL_APIENTRY DeleteShaderContextANGLE(GLeglContext ctx, GLuint shader);
ANGLE_EXPORT void GL_APIENTRY DeleteSyncContextANGLE(GLeglContext ctx, GLsync sync);
ANGLE_EXPORT void GL_APIENTRY DeleteTexturesContextANGLE(GLeglContext ctx,
@@ -1431,6 +1524,13 @@ ANGLE_EXPORT void GL_APIENTRY FramebufferTextureLayerContextANGLE(GLeglContext c
GLuint texture,
GLint level,
GLint layer);
+ANGLE_EXPORT void GL_APIENTRY FramebufferTextureMultiviewOVRContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews);
ANGLE_EXPORT void GL_APIENTRY FrontFaceContextANGLE(GLeglContext ctx, GLenum mode);
ANGLE_EXPORT void GL_APIENTRY FrustumfContextANGLE(GLeglContext ctx,
GLfloat l,
@@ -1468,6 +1568,9 @@ ANGLE_EXPORT void GL_APIENTRY GenRenderbuffersOESContextANGLE(GLeglContext ctx,
ANGLE_EXPORT void GL_APIENTRY GenSamplersContextANGLE(GLeglContext ctx,
GLsizei count,
GLuint *samplers);
+ANGLE_EXPORT void GL_APIENTRY GenSemaphoresEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ GLuint *semaphores);
ANGLE_EXPORT void GL_APIENTRY GenTexturesContextANGLE(GLeglContext ctx,
GLsizei n,
GLuint *textures);
@@ -1625,6 +1728,10 @@ ANGLE_EXPORT void GL_APIENTRY GetMaterialxvContextANGLE(GLeglContext ctx,
GLenum face,
GLenum pname,
GLfixed *params);
+ANGLE_EXPORT void GL_APIENTRY GetMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx,
+ GLuint memoryObject,
+ GLenum pname,
+ GLint *params);
ANGLE_EXPORT void GL_APIENTRY GetMultisamplefvContextANGLE(GLeglContext ctx,
GLenum pname,
GLuint index,
@@ -1762,6 +1869,10 @@ ANGLE_EXPORT void GL_APIENTRY GetSamplerParameterivContextANGLE(GLeglContext ctx
GLuint sampler,
GLenum pname,
GLint *params);
+ANGLE_EXPORT void GL_APIENTRY GetSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum pname,
+ GLuint64 *params);
ANGLE_EXPORT void GL_APIENTRY GetShaderInfoLogContextANGLE(GLeglContext ctx,
GLuint shader,
GLsizei bufSize,
@@ -1881,6 +1992,13 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformuivContextANGLE(GLeglContext ctx,
GLuint program,
GLint location,
GLuint *params);
+ANGLE_EXPORT void GL_APIENTRY GetUnsignedBytevEXTContextANGLE(GLeglContext ctx,
+ GLenum pname,
+ GLubyte *data);
+ANGLE_EXPORT void GL_APIENTRY GetUnsignedBytei_vEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLuint index,
+ GLubyte *data);
ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIivContextANGLE(GLeglContext ctx,
GLuint index,
GLenum pname,
@@ -1912,6 +2030,15 @@ ANGLE_EXPORT void GL_APIENTRY GetnUniformivEXTContextANGLE(GLeglContext ctx,
GLsizei bufSize,
GLint *params);
ANGLE_EXPORT void GL_APIENTRY HintContextANGLE(GLeglContext ctx, GLenum target, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY ImportMemoryFdEXTContextANGLE(GLeglContext ctx,
+ GLuint memory,
+ GLuint64 size,
+ GLenum handleType,
+ GLint fd);
+ANGLE_EXPORT void GL_APIENTRY ImportSemaphoreFdEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum handleType,
+ GLint fd);
ANGLE_EXPORT void GL_APIENTRY InsertEventMarkerEXTContextANGLE(GLeglContext ctx,
GLsizei length,
const GLchar *marker);
@@ -1933,6 +2060,8 @@ ANGLE_EXPORT GLboolean GL_APIENTRY IsFenceNVContextANGLE(GLeglContext ctx, GLuin
ANGLE_EXPORT GLboolean GL_APIENTRY IsFramebufferContextANGLE(GLeglContext ctx, GLuint framebuffer);
ANGLE_EXPORT GLboolean GL_APIENTRY IsFramebufferOESContextANGLE(GLeglContext ctx,
GLuint framebuffer);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsMemoryObjectEXTContextANGLE(GLeglContext ctx,
+ GLuint memoryObject);
ANGLE_EXPORT GLboolean GL_APIENTRY IsProgramContextANGLE(GLeglContext ctx, GLuint program);
ANGLE_EXPORT GLboolean GL_APIENTRY IsProgramPipelineContextANGLE(GLeglContext ctx, GLuint pipeline);
ANGLE_EXPORT GLboolean GL_APIENTRY IsQueryContextANGLE(GLeglContext ctx, GLuint id);
@@ -1941,6 +2070,7 @@ ANGLE_EXPORT GLboolean GL_APIENTRY IsRenderbufferContextANGLE(GLeglContext ctx,
GLuint renderbuffer);
ANGLE_EXPORT GLboolean GL_APIENTRY IsRenderbufferOESContextANGLE(GLeglContext ctx,
GLuint renderbuffer);
+ANGLE_EXPORT GLboolean GL_APIENTRY IsSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore);
ANGLE_EXPORT GLboolean GL_APIENTRY IsSamplerContextANGLE(GLeglContext ctx, GLuint sampler);
ANGLE_EXPORT GLboolean GL_APIENTRY IsShaderContextANGLE(GLeglContext ctx, GLuint shader);
ANGLE_EXPORT GLboolean GL_APIENTRY IsSyncContextANGLE(GLeglContext ctx, GLsync sync);
@@ -2024,6 +2154,10 @@ ANGLE_EXPORT void GL_APIENTRY MaxShaderCompilerThreadsKHRContextANGLE(GLeglConte
ANGLE_EXPORT void GL_APIENTRY MemoryBarrierContextANGLE(GLeglContext ctx, GLbitfield barriers);
ANGLE_EXPORT void GL_APIENTRY MemoryBarrierByRegionContextANGLE(GLeglContext ctx,
GLbitfield barriers);
+ANGLE_EXPORT void GL_APIENTRY MemoryObjectParameterivEXTContextANGLE(GLeglContext ctx,
+ GLuint memoryObject,
+ GLenum pname,
+ const GLint *params);
ANGLE_EXPORT void GL_APIENTRY MultMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m);
ANGLE_EXPORT void GL_APIENTRY MultMatrixxContextANGLE(GLeglContext ctx, const GLfixed *m);
ANGLE_EXPORT void GL_APIENTRY MultiTexCoord4fContextANGLE(GLeglContext ctx,
@@ -2391,6 +2525,10 @@ ANGLE_EXPORT void GL_APIENTRY ScalefContextANGLE(GLeglContext ctx, GLfloat x, GL
ANGLE_EXPORT void GL_APIENTRY ScalexContextANGLE(GLeglContext ctx, GLfixed x, GLfixed y, GLfixed z);
ANGLE_EXPORT void GL_APIENTRY
ScissorContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY SemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum pname,
+ const GLuint64 *params);
ANGLE_EXPORT void GL_APIENTRY SetFenceNVContextANGLE(GLeglContext ctx,
GLuint fence,
GLenum condition);
@@ -2406,6 +2544,13 @@ ANGLE_EXPORT void GL_APIENTRY ShaderSourceContextANGLE(GLeglContext ctx,
GLsizei count,
const GLchar *const *string,
const GLint *length);
+ANGLE_EXPORT void GL_APIENTRY SignalSemaphoreEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts);
ANGLE_EXPORT void GL_APIENTRY StencilFuncContextANGLE(GLeglContext ctx,
GLenum func,
GLint ref,
@@ -2579,6 +2724,44 @@ TexStorage3DMultisampleOESContextANGLE(GLeglContext ctx,
GLsizei height,
GLsizei depth,
GLboolean fixedsamplelocations);
+ANGLE_EXPORT void GL_APIENTRY TexStorageMem2DEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset);
+ANGLE_EXPORT void GL_APIENTRY
+TexStorageMem2DMultisampleEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
+ANGLE_EXPORT void GL_APIENTRY TexStorageMem3DEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset);
+ANGLE_EXPORT void GL_APIENTRY
+TexStorageMem3DMultisampleEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset);
ANGLE_EXPORT void GL_APIENTRY TexSubImage2DContextANGLE(GLeglContext ctx,
GLenum target,
GLint level,
@@ -2841,6 +3024,13 @@ ANGLE_EXPORT void GL_APIENTRY VertexPointerContextANGLE(GLeglContext ctx,
const void *pointer);
ANGLE_EXPORT void GL_APIENTRY
ViewportContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei height);
+ANGLE_EXPORT void GL_APIENTRY WaitSemaphoreEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts);
ANGLE_EXPORT void GL_APIENTRY WaitSyncContextANGLE(GLeglContext ctx,
GLsync sync,
GLbitfield flags,
@@ -3454,22 +3644,6 @@ ANGLE_EXPORT void GL_APIENTRY GetQueryObjectui64vRobustANGLEContextANGLE(GLeglCo
GLsizei bufSize,
GLsizei *length,
GLuint64 *params);
-ANGLE_EXPORT void GL_APIENTRY
-FramebufferTextureMultiviewLayeredANGLEContextANGLE(GLeglContext ctx,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews);
-ANGLE_EXPORT void GL_APIENTRY
-FramebufferTextureMultiviewSideBySideANGLEContextANGLE(GLeglContext ctx,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets);
ANGLE_EXPORT void GL_APIENTRY CopyTexture3DANGLEContextANGLE(GLeglContext ctx,
GLuint sourceId,
GLint sourceLevel,
@@ -3551,6 +3725,9 @@ ANGLE_EXPORT void GL_APIENTRY SampleMaskiANGLEContextANGLE(GLeglContext ctx,
GLuint maskNumber,
GLbitfield mask);
ANGLE_EXPORT void GL_APIENTRY ProvokingVertexANGLEContextANGLE(GLeglContext ctx, GLenum mode);
+ANGLE_EXPORT void GL_APIENTRY LoseContextCHROMIUMContextANGLE(GLeglContext ctx,
+ GLenum current,
+ GLenum other);
} // namespace gl
#endif // LIBGLESV2_ENTRY_POINTS_GLES_EXT_AUTOGEN_H_
diff --git a/chromium/third_party/angle/src/libGLESv2/gen_proc_table.py b/chromium/third_party/angle/src/libGLESv2/gen_proc_table.py
index 671758f0c63..834222f86d1 100644
--- a/chromium/third_party/angle/src/libGLESv2/gen_proc_table.py
+++ b/chromium/third_party/angle/src/libGLESv2/gen_proc_table.py
@@ -5,6 +5,7 @@
#
# gen_proc_table.py:
# Code generation for entry point loading tables.
+# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
# TODO(jmadill): Should be part of entry point generation.
@@ -55,30 +56,51 @@ size_t g_numProcs = {num_procs};
sys.path.append('../libANGLE/renderer')
import angle_format
-json_data = angle_format.load_json(data_source_name)
+def main():
-all_functions = {}
+ # auto_script parameters.
+ if len(sys.argv) > 1:
+ inputs = [data_source_name]
+ outputs = [out_file_name]
-for description, functions in json_data.iteritems():
- for function in functions:
- if function.startswith("gl"):
- all_functions[function] = "gl::" + function[2:]
- # Special handling for EGL_ANGLE_explicit_context extension
- if support_egl_ANGLE_explicit_context:
- all_functions[function + "ContextANGLE"] = "gl::" + function[2:] + "ContextANGLE"
- elif function.startswith("egl"):
- all_functions[function] = "EGL_" + function[3:]
+ if sys.argv[1] == 'inputs':
+ print ','.join(inputs)
+ elif sys.argv[1] == 'outputs':
+ print ','.join(outputs)
else:
- all_functions[function] = function
-
-proc_data = [(' {"%s", P(%s)}' % (func, angle_func)) for func, angle_func in sorted(all_functions.iteritems())]
-
-with open(out_file_name, 'wb') as out_file:
- output_cpp = template_cpp.format(
- script_name = sys.argv[0],
- data_source_name = data_source_name,
- copyright_year = date.today().year,
- proc_data = ",\n".join(proc_data),
- num_procs = len(proc_data))
- out_file.write(output_cpp)
- out_file.close() \ No newline at end of file
+ print('Invalid script parameters')
+ return 1
+ return 0
+
+ json_data = angle_format.load_json(data_source_name)
+
+ all_functions = {}
+
+ for description, functions in json_data.iteritems():
+ for function in functions:
+ if function.startswith("gl"):
+ all_functions[function] = "gl::" + function[2:]
+ # Special handling for EGL_ANGLE_explicit_context extension
+ if support_egl_ANGLE_explicit_context:
+ all_functions[function + "ContextANGLE"] = "gl::" + function[2:] + "ContextANGLE"
+ elif function.startswith("egl"):
+ all_functions[function] = "EGL_" + function[3:]
+ else:
+ all_functions[function] = function
+
+ proc_data = [(' {"%s", P(%s)}' % (func, angle_func)) for func, angle_func in sorted(all_functions.iteritems())]
+
+ with open(out_file_name, 'w') as out_file:
+ output_cpp = template_cpp.format(
+ script_name = sys.argv[0],
+ data_source_name = data_source_name,
+ copyright_year = date.today().year,
+ proc_data = ",\n".join(proc_data),
+ num_procs = len(proc_data))
+ out_file.write(output_cpp)
+ out_file.close()
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.cpp b/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.cpp
index 00dad7edbc4..3ad9afabda6 100644
--- a/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.cpp
+++ b/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.cpp
@@ -2545,29 +2545,6 @@ void GL_APIENTRY glMultiDrawElementsInstancedANGLE(GLenum mode,
drawcount);
}
-// GL_ANGLE_multiview
-void GL_APIENTRY glFramebufferTextureMultiviewLayeredANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
-{
- return gl::FramebufferTextureMultiviewLayeredANGLE(target, attachment, texture, level,
- baseViewIndex, numViews);
-}
-
-void GL_APIENTRY glFramebufferTextureMultiviewSideBySideANGLE(GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- return gl::FramebufferTextureMultiviewSideBySideANGLE(target, attachment, texture, level,
- numViews, viewportOffsets);
-}
-
// GL_ANGLE_provoking_vertex
void GL_APIENTRY glProvokingVertexANGLE(GLenum mode)
{
@@ -3332,6 +3309,12 @@ void GL_APIENTRY glMatrixLoadIdentityCHROMIUM(GLenum matrixMode)
return gl::MatrixLoadIdentityCHROMIUM(matrixMode);
}
+// GL_CHROMIUM_lose_context
+void GL_APIENTRY glLoseContextCHROMIUM(GLenum current, GLenum other)
+{
+ return gl::LoseContextCHROMIUM(current, other);
+}
+
// GL_CHROMIUM_path_rendering
GLuint GL_APIENTRY glGenPathsCHROMIUM(GLsizei range)
{
@@ -3673,6 +3656,109 @@ void *GL_APIENTRY glMapBufferRangeEXT(GLenum target,
return gl::MapBufferRangeEXT(target, offset, length, access);
}
+// GL_EXT_memory_object
+void GL_APIENTRY glBufferStorageMemEXT(GLenum target,
+ GLsizeiptr size,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::BufferStorageMemEXT(target, size, memory, offset);
+}
+
+void GL_APIENTRY glCreateMemoryObjectsEXT(GLsizei n, GLuint *memoryObjects)
+{
+ return gl::CreateMemoryObjectsEXT(n, memoryObjects);
+}
+
+void GL_APIENTRY glDeleteMemoryObjectsEXT(GLsizei n, const GLuint *memoryObjects)
+{
+ return gl::DeleteMemoryObjectsEXT(n, memoryObjects);
+}
+
+void GL_APIENTRY glGetMemoryObjectParameterivEXT(GLuint memoryObject, GLenum pname, GLint *params)
+{
+ return gl::GetMemoryObjectParameterivEXT(memoryObject, pname, params);
+}
+
+void GL_APIENTRY glGetUnsignedBytevEXT(GLenum pname, GLubyte *data)
+{
+ return gl::GetUnsignedBytevEXT(pname, data);
+}
+
+void GL_APIENTRY glGetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte *data)
+{
+ return gl::GetUnsignedBytei_vEXT(target, index, data);
+}
+
+GLboolean GL_APIENTRY glIsMemoryObjectEXT(GLuint memoryObject)
+{
+ return gl::IsMemoryObjectEXT(memoryObject);
+}
+
+void GL_APIENTRY glMemoryObjectParameterivEXT(GLuint memoryObject,
+ GLenum pname,
+ const GLint *params)
+{
+ return gl::MemoryObjectParameterivEXT(memoryObject, pname, params);
+}
+
+void GL_APIENTRY glTexStorageMem2DEXT(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem2DEXT(target, levels, internalFormat, width, height, memory, offset);
+}
+
+void GL_APIENTRY glTexStorageMem2DMultisampleEXT(GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem2DMultisampleEXT(target, samples, internalFormat, width, height,
+ fixedSampleLocations, memory, offset);
+}
+
+void GL_APIENTRY glTexStorageMem3DEXT(GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem3DEXT(target, levels, internalFormat, width, height, depth, memory,
+ offset);
+}
+
+void GL_APIENTRY glTexStorageMem3DMultisampleEXT(GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem3DMultisampleEXT(target, samples, internalFormat, width, height, depth,
+ fixedSampleLocations, memory, offset);
+}
+
+// GL_EXT_memory_object_fd
+void GL_APIENTRY glImportMemoryFdEXT(GLuint memory, GLuint64 size, GLenum handleType, GLint fd)
+{
+ return gl::ImportMemoryFdEXT(memory, size, handleType, fd);
+}
+
// GL_EXT_occlusion_query_boolean
// GL_EXT_robustness
@@ -3706,6 +3792,62 @@ void GL_APIENTRY glReadnPixelsEXT(GLint x,
return gl::ReadnPixelsEXT(x, y, width, height, format, type, bufSize, data);
}
+// GL_EXT_semaphore
+void GL_APIENTRY glDeleteSemaphoresEXT(GLsizei n, const GLuint *semaphores)
+{
+ return gl::DeleteSemaphoresEXT(n, semaphores);
+}
+
+void GL_APIENTRY glGenSemaphoresEXT(GLsizei n, GLuint *semaphores)
+{
+ return gl::GenSemaphoresEXT(n, semaphores);
+}
+
+void GL_APIENTRY glGetSemaphoreParameterui64vEXT(GLuint semaphore, GLenum pname, GLuint64 *params)
+{
+ return gl::GetSemaphoreParameterui64vEXT(semaphore, pname, params);
+}
+
+GLboolean GL_APIENTRY glIsSemaphoreEXT(GLuint semaphore)
+{
+ return gl::IsSemaphoreEXT(semaphore);
+}
+
+void GL_APIENTRY glSemaphoreParameterui64vEXT(GLuint semaphore,
+ GLenum pname,
+ const GLuint64 *params)
+{
+ return gl::SemaphoreParameterui64vEXT(semaphore, pname, params);
+}
+
+void GL_APIENTRY glSignalSemaphoreEXT(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts)
+{
+ return gl::SignalSemaphoreEXT(semaphore, numBufferBarriers, buffers, numTextureBarriers,
+ textures, dstLayouts);
+}
+
+void GL_APIENTRY glWaitSemaphoreEXT(GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts)
+{
+ return gl::WaitSemaphoreEXT(semaphore, numBufferBarriers, buffers, numTextureBarriers, textures,
+ srcLayouts);
+}
+
+// GL_EXT_semaphore_fd
+void GL_APIENTRY glImportSemaphoreFdEXT(GLuint semaphore, GLenum handleType, GLint fd)
+{
+ return gl::ImportSemaphoreFdEXT(semaphore, handleType, fd);
+}
+
// GL_EXT_texture_storage
void GL_APIENTRY glTexStorage1DEXT(GLenum target,
GLsizei levels,
@@ -4192,6 +4334,20 @@ GLboolean GL_APIENTRY glIsVertexArrayOES(GLuint array)
return gl::IsVertexArrayOES(array);
}
+// GL_OVR_multiview
+void GL_APIENTRY glFramebufferTextureMultiviewOVR(GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews)
+{
+ return gl::FramebufferTextureMultiviewOVR(target, attachment, texture, level, baseViewIndex,
+ numViews);
+}
+
+// GL_OVR_multiview2
+
// EGL_ANGLE_explicit_context
void GL_APIENTRY glActiveShaderProgramContextANGLE(GLeglContext ctx,
GLuint pipeline,
@@ -4435,6 +4591,15 @@ void GL_APIENTRY glBufferDataContextANGLE(GLeglContext ctx,
return gl::BufferDataContextANGLE(ctx, target, size, data, usage);
}
+void GL_APIENTRY glBufferStorageMemEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizeiptr size,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::BufferStorageMemEXTContextANGLE(ctx, target, size, memory, offset);
+}
+
void GL_APIENTRY glBufferSubDataContextANGLE(GLeglContext ctx,
GLenum target,
GLintptr offset,
@@ -4698,6 +4863,13 @@ void GL_APIENTRY glCopyTexSubImage3DContextANGLE(GLeglContext ctx,
width, height);
}
+void GL_APIENTRY glCreateMemoryObjectsEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ GLuint *memoryObjects)
+{
+ return gl::CreateMemoryObjectsEXTContextANGLE(ctx, n, memoryObjects);
+}
+
GLuint GL_APIENTRY glCreateProgramContextANGLE(GLeglContext ctx)
{
return gl::CreateProgramContextANGLE(ctx);
@@ -4779,6 +4951,13 @@ void GL_APIENTRY glDeleteFramebuffersOESContextANGLE(GLeglContext ctx,
return gl::DeleteFramebuffersOESContextANGLE(ctx, n, framebuffers);
}
+void GL_APIENTRY glDeleteMemoryObjectsEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ const GLuint *memoryObjects)
+{
+ return gl::DeleteMemoryObjectsEXTContextANGLE(ctx, n, memoryObjects);
+}
+
void GL_APIENTRY glDeleteProgramContextANGLE(GLeglContext ctx, GLuint program)
{
return gl::DeleteProgramContextANGLE(ctx, program);
@@ -4822,6 +5001,13 @@ void GL_APIENTRY glDeleteSamplersContextANGLE(GLeglContext ctx,
return gl::DeleteSamplersContextANGLE(ctx, count, samplers);
}
+void GL_APIENTRY glDeleteSemaphoresEXTContextANGLE(GLeglContext ctx,
+ GLsizei n,
+ const GLuint *semaphores)
+{
+ return gl::DeleteSemaphoresEXTContextANGLE(ctx, n, semaphores);
+}
+
void GL_APIENTRY glDeleteShaderContextANGLE(GLeglContext ctx, GLuint shader)
{
return gl::DeleteShaderContextANGLE(ctx, shader);
@@ -5248,6 +5434,18 @@ void GL_APIENTRY glFramebufferTextureLayerContextANGLE(GLeglContext ctx,
return gl::FramebufferTextureLayerContextANGLE(ctx, target, attachment, texture, level, layer);
}
+void GL_APIENTRY glFramebufferTextureMultiviewOVRContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint baseViewIndex,
+ GLsizei numViews)
+{
+ return gl::FramebufferTextureMultiviewOVRContextANGLE(ctx, target, attachment, texture, level,
+ baseViewIndex, numViews);
+}
+
void GL_APIENTRY glFrontFaceContextANGLE(GLeglContext ctx, GLenum mode)
{
return gl::FrontFaceContextANGLE(ctx, mode);
@@ -5327,6 +5525,11 @@ void GL_APIENTRY glGenSamplersContextANGLE(GLeglContext ctx, GLsizei count, GLui
return gl::GenSamplersContextANGLE(ctx, count, samplers);
}
+void GL_APIENTRY glGenSemaphoresEXTContextANGLE(GLeglContext ctx, GLsizei n, GLuint *semaphores)
+{
+ return gl::GenSemaphoresEXTContextANGLE(ctx, n, semaphores);
+}
+
void GL_APIENTRY glGenTexturesContextANGLE(GLeglContext ctx, GLsizei n, GLuint *textures)
{
return gl::GenTexturesContextANGLE(ctx, n, textures);
@@ -5635,6 +5838,14 @@ void GL_APIENTRY glGetMaterialxvContextANGLE(GLeglContext ctx,
return gl::GetMaterialxvContextANGLE(ctx, face, pname, params);
}
+void GL_APIENTRY glGetMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx,
+ GLuint memoryObject,
+ GLenum pname,
+ GLint *params)
+{
+ return gl::GetMemoryObjectParameterivEXTContextANGLE(ctx, memoryObject, pname, params);
+}
+
void GL_APIENTRY glGetMultisamplefvContextANGLE(GLeglContext ctx,
GLenum pname,
GLuint index,
@@ -5889,6 +6100,14 @@ void GL_APIENTRY glGetSamplerParameterivContextANGLE(GLeglContext ctx,
return gl::GetSamplerParameterivContextANGLE(ctx, sampler, pname, params);
}
+void GL_APIENTRY glGetSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum pname,
+ GLuint64 *params)
+{
+ return gl::GetSemaphoreParameterui64vEXTContextANGLE(ctx, semaphore, pname, params);
+}
+
void GL_APIENTRY glGetShaderInfoLogContextANGLE(GLeglContext ctx,
GLuint shader,
GLsizei bufSize,
@@ -6121,6 +6340,19 @@ void GL_APIENTRY glGetUniformuivContextANGLE(GLeglContext ctx,
return gl::GetUniformuivContextANGLE(ctx, program, location, params);
}
+void GL_APIENTRY glGetUnsignedBytevEXTContextANGLE(GLeglContext ctx, GLenum pname, GLubyte *data)
+{
+ return gl::GetUnsignedBytevEXTContextANGLE(ctx, pname, data);
+}
+
+void GL_APIENTRY glGetUnsignedBytei_vEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLuint index,
+ GLubyte *data)
+{
+ return gl::GetUnsignedBytei_vEXTContextANGLE(ctx, target, index, data);
+}
+
void GL_APIENTRY glGetVertexAttribIivContextANGLE(GLeglContext ctx,
GLuint index,
GLenum pname,
@@ -6184,6 +6416,23 @@ void GL_APIENTRY glHintContextANGLE(GLeglContext ctx, GLenum target, GLenum mode
return gl::HintContextANGLE(ctx, target, mode);
}
+void GL_APIENTRY glImportMemoryFdEXTContextANGLE(GLeglContext ctx,
+ GLuint memory,
+ GLuint64 size,
+ GLenum handleType,
+ GLint fd)
+{
+ return gl::ImportMemoryFdEXTContextANGLE(ctx, memory, size, handleType, fd);
+}
+
+void GL_APIENTRY glImportSemaphoreFdEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum handleType,
+ GLint fd)
+{
+ return gl::ImportSemaphoreFdEXTContextANGLE(ctx, semaphore, handleType, fd);
+}
+
void GL_APIENTRY glInsertEventMarkerEXTContextANGLE(GLeglContext ctx,
GLsizei length,
const GLchar *marker)
@@ -6237,6 +6486,11 @@ GLboolean GL_APIENTRY glIsFramebufferOESContextANGLE(GLeglContext ctx, GLuint fr
return gl::IsFramebufferOESContextANGLE(ctx, framebuffer);
}
+GLboolean GL_APIENTRY glIsMemoryObjectEXTContextANGLE(GLeglContext ctx, GLuint memoryObject)
+{
+ return gl::IsMemoryObjectEXTContextANGLE(ctx, memoryObject);
+}
+
GLboolean GL_APIENTRY glIsProgramContextANGLE(GLeglContext ctx, GLuint program)
{
return gl::IsProgramContextANGLE(ctx, program);
@@ -6267,6 +6521,11 @@ GLboolean GL_APIENTRY glIsRenderbufferOESContextANGLE(GLeglContext ctx, GLuint r
return gl::IsRenderbufferOESContextANGLE(ctx, renderbuffer);
}
+GLboolean GL_APIENTRY glIsSemaphoreEXTContextANGLE(GLeglContext ctx, GLuint semaphore)
+{
+ return gl::IsSemaphoreEXTContextANGLE(ctx, semaphore);
+}
+
GLboolean GL_APIENTRY glIsSamplerContextANGLE(GLeglContext ctx, GLuint sampler)
{
return gl::IsSamplerContextANGLE(ctx, sampler);
@@ -6466,6 +6725,14 @@ void GL_APIENTRY glMemoryBarrierByRegionContextANGLE(GLeglContext ctx, GLbitfiel
return gl::MemoryBarrierByRegionContextANGLE(ctx, barriers);
}
+void GL_APIENTRY glMemoryObjectParameterivEXTContextANGLE(GLeglContext ctx,
+ GLuint memoryObject,
+ GLenum pname,
+ const GLint *params)
+{
+ return gl::MemoryObjectParameterivEXTContextANGLE(ctx, memoryObject, pname, params);
+}
+
void GL_APIENTRY glMultMatrixfContextANGLE(GLeglContext ctx, const GLfloat *m)
{
return gl::MultMatrixfContextANGLE(ctx, m);
@@ -7175,6 +7442,14 @@ glScissorContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsizei
return gl::ScissorContextANGLE(ctx, x, y, width, height);
}
+void GL_APIENTRY glSemaphoreParameterui64vEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLenum pname,
+ const GLuint64 *params)
+{
+ return gl::SemaphoreParameterui64vEXTContextANGLE(ctx, semaphore, pname, params);
+}
+
void GL_APIENTRY glSetFenceNVContextANGLE(GLeglContext ctx, GLuint fence, GLenum condition)
{
return gl::SetFenceNVContextANGLE(ctx, fence, condition);
@@ -7204,6 +7479,18 @@ void GL_APIENTRY glShaderSourceContextANGLE(GLeglContext ctx,
return gl::ShaderSourceContextANGLE(ctx, shader, count, string, length);
}
+void GL_APIENTRY glSignalSemaphoreEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *dstLayouts)
+{
+ return gl::SignalSemaphoreEXTContextANGLE(ctx, semaphore, numBufferBarriers, buffers,
+ numTextureBarriers, textures, dstLayouts);
+}
+
void GL_APIENTRY glStencilFuncContextANGLE(GLeglContext ctx, GLenum func, GLint ref, GLuint mask)
{
return gl::StencilFuncContextANGLE(ctx, func, ref, mask);
@@ -7512,6 +7799,63 @@ void GL_APIENTRY glTexStorage3DMultisampleOESContextANGLE(GLeglContext ctx,
height, depth, fixedsamplelocations);
}
+void GL_APIENTRY glTexStorageMem2DEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem2DEXTContextANGLE(ctx, target, levels, internalFormat, width, height,
+ memory, offset);
+}
+
+void GL_APIENTRY glTexStorageMem2DMultisampleEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem2DMultisampleEXTContextANGLE(
+ ctx, target, samples, internalFormat, width, height, fixedSampleLocations, memory, offset);
+}
+
+void GL_APIENTRY glTexStorageMem3DEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei levels,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem3DEXTContextANGLE(ctx, target, levels, internalFormat, width, height,
+ depth, memory, offset);
+}
+
+void GL_APIENTRY glTexStorageMem3DMultisampleEXTContextANGLE(GLeglContext ctx,
+ GLenum target,
+ GLsizei samples,
+ GLenum internalFormat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLboolean fixedSampleLocations,
+ GLuint memory,
+ GLuint64 offset)
+{
+ return gl::TexStorageMem3DMultisampleEXTContextANGLE(ctx, target, samples, internalFormat,
+ width, height, depth, fixedSampleLocations,
+ memory, offset);
+}
+
void GL_APIENTRY glTexSubImage2DContextANGLE(GLeglContext ctx,
GLenum target,
GLint level,
@@ -8017,6 +8361,18 @@ glViewportContextANGLE(GLeglContext ctx, GLint x, GLint y, GLsizei width, GLsize
return gl::ViewportContextANGLE(ctx, x, y, width, height);
}
+void GL_APIENTRY glWaitSemaphoreEXTContextANGLE(GLeglContext ctx,
+ GLuint semaphore,
+ GLuint numBufferBarriers,
+ const GLuint *buffers,
+ GLuint numTextureBarriers,
+ const GLuint *textures,
+ const GLenum *srcLayouts)
+{
+ return gl::WaitSemaphoreEXTContextANGLE(ctx, semaphore, numBufferBarriers, buffers,
+ numTextureBarriers, textures, srcLayouts);
+}
+
void GL_APIENTRY glWaitSyncContextANGLE(GLeglContext ctx,
GLsync sync,
GLbitfield flags,
@@ -9062,31 +9418,6 @@ void GL_APIENTRY glGetQueryObjectui64vRobustANGLEContextANGLE(GLeglContext ctx,
return gl::GetQueryObjectui64vRobustANGLEContextANGLE(ctx, id, pname, bufSize, length, params);
}
-void GL_APIENTRY glFramebufferTextureMultiviewLayeredANGLEContextANGLE(GLeglContext ctx,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLint baseViewIndex,
- GLsizei numViews)
-{
- return gl::FramebufferTextureMultiviewLayeredANGLEContextANGLE(ctx, target, attachment, texture,
- level, baseViewIndex, numViews);
-}
-
-void GL_APIENTRY
-glFramebufferTextureMultiviewSideBySideANGLEContextANGLE(GLeglContext ctx,
- GLenum target,
- GLenum attachment,
- GLuint texture,
- GLint level,
- GLsizei numViews,
- const GLint *viewportOffsets)
-{
- return gl::FramebufferTextureMultiviewSideBySideANGLEContextANGLE(
- ctx, target, attachment, texture, level, numViews, viewportOffsets);
-}
-
void GL_APIENTRY glCopyTexture3DANGLEContextANGLE(GLeglContext ctx,
GLuint sourceId,
GLint sourceLevel,
@@ -9220,4 +9551,9 @@ void GL_APIENTRY glProvokingVertexANGLEContextANGLE(GLeglContext ctx, GLenum mod
return gl::ProvokingVertexANGLEContextANGLE(ctx, mode);
}
+void GL_APIENTRY glLoseContextCHROMIUMContextANGLE(GLeglContext ctx, GLenum current, GLenum other)
+{
+ return gl::LoseContextCHROMIUMContextANGLE(ctx, current, other);
+}
+
} // extern "C"
diff --git a/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.def b/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.def
index 9ddec122bea..5f33d74b67f 100644
--- a/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.def
+++ b/chromium/third_party/angle/src/libGLESv2/libGLESv2_autogen.def
@@ -436,10 +436,6 @@ EXPORTS
glMultiDrawElementsANGLE
glMultiDrawElementsInstancedANGLE
- ; GL_ANGLE_multiview
- glFramebufferTextureMultiviewLayeredANGLE
- glFramebufferTextureMultiviewSideBySideANGLE
-
; GL_ANGLE_provoking_vertex
glProvokingVertexANGLE
@@ -537,6 +533,9 @@ EXPORTS
glMatrixLoadIdentityCHROMIUM
glMatrixLoadfCHROMIUM
+ ; GL_CHROMIUM_lose_context
+ glLoseContextCHROMIUM
+
; GL_CHROMIUM_path_rendering
glBindFragmentInputLocationCHROMIUM
glCoverFillPathCHROMIUM
@@ -604,6 +603,23 @@ EXPORTS
glFlushMappedBufferRangeEXT
glMapBufferRangeEXT
+ ; GL_EXT_memory_object
+ glBufferStorageMemEXT
+ glCreateMemoryObjectsEXT
+ glDeleteMemoryObjectsEXT
+ glGetMemoryObjectParameterivEXT
+ glGetUnsignedBytei_vEXT
+ glGetUnsignedBytevEXT
+ glIsMemoryObjectEXT
+ glMemoryObjectParameterivEXT
+ glTexStorageMem2DEXT
+ glTexStorageMem2DMultisampleEXT
+ glTexStorageMem3DEXT
+ glTexStorageMem3DMultisampleEXT
+
+ ; GL_EXT_memory_object_fd
+ glImportMemoryFdEXT
+
; GL_EXT_occlusion_query_boolean
; GL_EXT_robustness
@@ -612,6 +628,18 @@ EXPORTS
glGetnUniformivEXT
glReadnPixelsEXT
+ ; GL_EXT_semaphore
+ glDeleteSemaphoresEXT
+ glGenSemaphoresEXT
+ glGetSemaphoreParameterui64vEXT
+ glIsSemaphoreEXT
+ glSemaphoreParameterui64vEXT
+ glSignalSemaphoreEXT
+ glWaitSemaphoreEXT
+
+ ; GL_EXT_semaphore_fd
+ glImportSemaphoreFdEXT
+
; GL_EXT_texture_storage
glTexStorage1DEXT
glTexStorage2DEXT
@@ -724,6 +752,11 @@ EXPORTS
glGenVertexArraysOES
glIsVertexArrayOES
+ ; GL_OVR_multiview
+ glFramebufferTextureMultiviewOVR
+
+ ; GL_OVR_multiview2
+
; EGL_ANGLE_explicit_context
glActiveShaderProgramContextANGLE
glActiveTextureContextANGLE
@@ -761,6 +794,7 @@ EXPORTS
glBlitFramebufferContextANGLE
glBlitFramebufferANGLEContextANGLE
glBufferDataContextANGLE
+ glBufferStorageMemEXTContextANGLE
glBufferSubDataContextANGLE
glCheckFramebufferStatusContextANGLE
glCheckFramebufferStatusOESContextANGLE
@@ -806,6 +840,7 @@ EXPORTS
glCoverStrokePathCHROMIUMContextANGLE
glCoverStrokePathInstancedCHROMIUMContextANGLE
glCoverageModulationCHROMIUMContextANGLE
+ glCreateMemoryObjectsEXTContextANGLE
glCreateProgramContextANGLE
glCreateShaderContextANGLE
glCreateShaderProgramvContextANGLE
@@ -818,6 +853,7 @@ EXPORTS
glDeleteFencesNVContextANGLE
glDeleteFramebuffersContextANGLE
glDeleteFramebuffersOESContextANGLE
+ glDeleteMemoryObjectsEXTContextANGLE
glDeletePathsCHROMIUMContextANGLE
glDeleteProgramContextANGLE
glDeleteProgramPipelinesContextANGLE
@@ -826,6 +862,7 @@ EXPORTS
glDeleteRenderbuffersContextANGLE
glDeleteRenderbuffersOESContextANGLE
glDeleteSamplersContextANGLE
+ glDeleteSemaphoresEXTContextANGLE
glDeleteShaderContextANGLE
glDeleteSyncContextANGLE
glDeleteTexturesContextANGLE
@@ -889,8 +926,7 @@ EXPORTS
glFramebufferTexture2DOESContextANGLE
glFramebufferTextureEXTContextANGLE
glFramebufferTextureLayerContextANGLE
- glFramebufferTextureMultiviewLayeredANGLEContextANGLE
- glFramebufferTextureMultiviewSideBySideANGLEContextANGLE
+ glFramebufferTextureMultiviewOVRContextANGLE
glFrontFaceContextANGLE
glFrustumfContextANGLE
glFrustumxContextANGLE
@@ -905,6 +941,7 @@ EXPORTS
glGenRenderbuffersContextANGLE
glGenRenderbuffersOESContextANGLE
glGenSamplersContextANGLE
+ glGenSemaphoresEXTContextANGLE
glGenTexturesContextANGLE
glGenTransformFeedbacksContextANGLE
glGenVertexArraysContextANGLE
@@ -960,6 +997,7 @@ EXPORTS
glGetLightxvContextANGLE
glGetMaterialfvContextANGLE
glGetMaterialxvContextANGLE
+ glGetMemoryObjectParameterivEXTContextANGLE
glGetMultisamplefvContextANGLE
glGetMultisamplefvANGLEContextANGLE
glGetMultisamplefvRobustANGLEContextANGLE
@@ -1007,6 +1045,7 @@ EXPORTS
glGetSamplerParameterfvRobustANGLEContextANGLE
glGetSamplerParameterivContextANGLE
glGetSamplerParameterivRobustANGLEContextANGLE
+ glGetSemaphoreParameterui64vEXTContextANGLE
glGetShaderInfoLogContextANGLE
glGetShaderPrecisionFormatContextANGLE
glGetShaderSourceContextANGLE
@@ -1047,6 +1086,8 @@ EXPORTS
glGetUniformivRobustANGLEContextANGLE
glGetUniformuivContextANGLE
glGetUniformuivRobustANGLEContextANGLE
+ glGetUnsignedBytei_vEXTContextANGLE
+ glGetUnsignedBytevEXTContextANGLE
glGetVertexAttribIivContextANGLE
glGetVertexAttribIivRobustANGLEContextANGLE
glGetVertexAttribIuivContextANGLE
@@ -1063,6 +1104,8 @@ EXPORTS
glGetnUniformivRobustANGLEContextANGLE
glGetnUniformuivRobustANGLEContextANGLE
glHintContextANGLE
+ glImportMemoryFdEXTContextANGLE
+ glImportSemaphoreFdEXTContextANGLE
glInsertEventMarkerEXTContextANGLE
glInvalidateFramebufferContextANGLE
glInvalidateSubFramebufferContextANGLE
@@ -1071,6 +1114,7 @@ EXPORTS
glIsFenceNVContextANGLE
glIsFramebufferContextANGLE
glIsFramebufferOESContextANGLE
+ glIsMemoryObjectEXTContextANGLE
glIsPathCHROMIUMContextANGLE
glIsProgramContextANGLE
glIsProgramPipelineContextANGLE
@@ -1079,6 +1123,7 @@ EXPORTS
glIsRenderbufferContextANGLE
glIsRenderbufferOESContextANGLE
glIsSamplerContextANGLE
+ glIsSemaphoreEXTContextANGLE
glIsShaderContextANGLE
glIsSyncContextANGLE
glIsTextureContextANGLE
@@ -1101,6 +1146,7 @@ EXPORTS
glLoadMatrixxContextANGLE
glLoadPaletteFromModelViewMatrixOESContextANGLE
glLogicOpContextANGLE
+ glLoseContextCHROMIUMContextANGLE
glMapBufferOESContextANGLE
glMapBufferRangeContextANGLE
glMapBufferRangeEXTContextANGLE
@@ -1115,6 +1161,7 @@ EXPORTS
glMaxShaderCompilerThreadsKHRContextANGLE
glMemoryBarrierContextANGLE
glMemoryBarrierByRegionContextANGLE
+ glMemoryObjectParameterivEXTContextANGLE
glMultMatrixfContextANGLE
glMultMatrixxContextANGLE
glMultiDrawArraysANGLEContextANGLE
@@ -1222,10 +1269,12 @@ EXPORTS
glScalefContextANGLE
glScalexContextANGLE
glScissorContextANGLE
+ glSemaphoreParameterui64vEXTContextANGLE
glSetFenceNVContextANGLE
glShadeModelContextANGLE
glShaderBinaryContextANGLE
glShaderSourceContextANGLE
+ glSignalSemaphoreEXTContextANGLE
glStencilFillPathCHROMIUMContextANGLE
glStencilFillPathInstancedCHROMIUMContextANGLE
glStencilFuncContextANGLE
@@ -1278,6 +1327,10 @@ EXPORTS
glTexStorage3DContextANGLE
glTexStorage3DEXTContextANGLE
glTexStorage3DMultisampleOESContextANGLE
+ glTexStorageMem2DEXTContextANGLE
+ glTexStorageMem2DMultisampleEXTContextANGLE
+ glTexStorageMem3DEXTContextANGLE
+ glTexStorageMem3DMultisampleEXTContextANGLE
glTexSubImage2DContextANGLE
glTexSubImage2DRobustANGLEContextANGLE
glTexSubImage3DContextANGLE
@@ -1348,6 +1401,7 @@ EXPORTS
glVertexBindingDivisorContextANGLE
glVertexPointerContextANGLE
glViewportContextANGLE
+ glWaitSemaphoreEXTContextANGLE
glWaitSyncContextANGLE
glWeightPointerOESContextANGLE
diff --git a/chromium/third_party/angle/src/libGLESv2/proc_table_autogen.cpp b/chromium/third_party/angle/src/libGLESv2/proc_table_autogen.cpp
index 0e7e8d07abe..dfb2438f46c 100644
--- a/chromium/third_party/angle/src/libGLESv2/proc_table_autogen.cpp
+++ b/chromium/third_party/angle/src/libGLESv2/proc_table_autogen.cpp
@@ -186,6 +186,8 @@ ProcEntry g_procTable[] = {
{"glBlitFramebufferContextANGLE", P(gl::BlitFramebufferContextANGLE)},
{"glBufferData", P(gl::BufferData)},
{"glBufferDataContextANGLE", P(gl::BufferDataContextANGLE)},
+ {"glBufferStorageMemEXT", P(gl::BufferStorageMemEXT)},
+ {"glBufferStorageMemEXTContextANGLE", P(gl::BufferStorageMemEXTContextANGLE)},
{"glBufferSubData", P(gl::BufferSubData)},
{"glBufferSubDataContextANGLE", P(gl::BufferSubDataContextANGLE)},
{"glCheckFramebufferStatus", P(gl::CheckFramebufferStatus)},
@@ -281,6 +283,8 @@ ProcEntry g_procTable[] = {
P(gl::CoverStrokePathInstancedCHROMIUMContextANGLE)},
{"glCoverageModulationCHROMIUM", P(gl::CoverageModulationCHROMIUM)},
{"glCoverageModulationCHROMIUMContextANGLE", P(gl::CoverageModulationCHROMIUMContextANGLE)},
+ {"glCreateMemoryObjectsEXT", P(gl::CreateMemoryObjectsEXT)},
+ {"glCreateMemoryObjectsEXTContextANGLE", P(gl::CreateMemoryObjectsEXTContextANGLE)},
{"glCreateProgram", P(gl::CreateProgram)},
{"glCreateProgramContextANGLE", P(gl::CreateProgramContextANGLE)},
{"glCreateShader", P(gl::CreateShader)},
@@ -303,6 +307,8 @@ ProcEntry g_procTable[] = {
{"glDeleteFencesNVContextANGLE", P(gl::DeleteFencesNVContextANGLE)},
{"glDeleteFramebuffers", P(gl::DeleteFramebuffers)},
{"glDeleteFramebuffersContextANGLE", P(gl::DeleteFramebuffersContextANGLE)},
+ {"glDeleteMemoryObjectsEXT", P(gl::DeleteMemoryObjectsEXT)},
+ {"glDeleteMemoryObjectsEXTContextANGLE", P(gl::DeleteMemoryObjectsEXTContextANGLE)},
{"glDeletePathsCHROMIUM", P(gl::DeletePathsCHROMIUM)},
{"glDeletePathsCHROMIUMContextANGLE", P(gl::DeletePathsCHROMIUMContextANGLE)},
{"glDeleteProgram", P(gl::DeleteProgram)},
@@ -317,6 +323,8 @@ ProcEntry g_procTable[] = {
{"glDeleteRenderbuffersContextANGLE", P(gl::DeleteRenderbuffersContextANGLE)},
{"glDeleteSamplers", P(gl::DeleteSamplers)},
{"glDeleteSamplersContextANGLE", P(gl::DeleteSamplersContextANGLE)},
+ {"glDeleteSemaphoresEXT", P(gl::DeleteSemaphoresEXT)},
+ {"glDeleteSemaphoresEXTContextANGLE", P(gl::DeleteSemaphoresEXTContextANGLE)},
{"glDeleteShader", P(gl::DeleteShader)},
{"glDeleteShaderContextANGLE", P(gl::DeleteShaderContextANGLE)},
{"glDeleteSync", P(gl::DeleteSync)},
@@ -440,13 +448,9 @@ ProcEntry g_procTable[] = {
{"glFramebufferTextureEXTContextANGLE", P(gl::FramebufferTextureEXTContextANGLE)},
{"glFramebufferTextureLayer", P(gl::FramebufferTextureLayer)},
{"glFramebufferTextureLayerContextANGLE", P(gl::FramebufferTextureLayerContextANGLE)},
- {"glFramebufferTextureMultiviewLayeredANGLE", P(gl::FramebufferTextureMultiviewLayeredANGLE)},
- {"glFramebufferTextureMultiviewLayeredANGLEContextANGLE",
- P(gl::FramebufferTextureMultiviewLayeredANGLEContextANGLE)},
- {"glFramebufferTextureMultiviewSideBySideANGLE",
- P(gl::FramebufferTextureMultiviewSideBySideANGLE)},
- {"glFramebufferTextureMultiviewSideBySideANGLEContextANGLE",
- P(gl::FramebufferTextureMultiviewSideBySideANGLEContextANGLE)},
+ {"glFramebufferTextureMultiviewOVR", P(gl::FramebufferTextureMultiviewOVR)},
+ {"glFramebufferTextureMultiviewOVRContextANGLE",
+ P(gl::FramebufferTextureMultiviewOVRContextANGLE)},
{"glFrontFace", P(gl::FrontFace)},
{"glFrontFaceContextANGLE", P(gl::FrontFaceContextANGLE)},
{"glFrustumf", P(gl::Frustumf)},
@@ -471,6 +475,8 @@ ProcEntry g_procTable[] = {
{"glGenRenderbuffersContextANGLE", P(gl::GenRenderbuffersContextANGLE)},
{"glGenSamplers", P(gl::GenSamplers)},
{"glGenSamplersContextANGLE", P(gl::GenSamplersContextANGLE)},
+ {"glGenSemaphoresEXT", P(gl::GenSemaphoresEXT)},
+ {"glGenSemaphoresEXTContextANGLE", P(gl::GenSemaphoresEXTContextANGLE)},
{"glGenTextures", P(gl::GenTextures)},
{"glGenTexturesContextANGLE", P(gl::GenTexturesContextANGLE)},
{"glGenTransformFeedbacks", P(gl::GenTransformFeedbacks)},
@@ -585,6 +591,9 @@ ProcEntry g_procTable[] = {
{"glGetMaterialfvContextANGLE", P(gl::GetMaterialfvContextANGLE)},
{"glGetMaterialxv", P(gl::GetMaterialxv)},
{"glGetMaterialxvContextANGLE", P(gl::GetMaterialxvContextANGLE)},
+ {"glGetMemoryObjectParameterivEXT", P(gl::GetMemoryObjectParameterivEXT)},
+ {"glGetMemoryObjectParameterivEXTContextANGLE",
+ P(gl::GetMemoryObjectParameterivEXTContextANGLE)},
{"glGetMultisamplefv", P(gl::GetMultisamplefv)},
{"glGetMultisamplefvANGLE", P(gl::GetMultisamplefvANGLE)},
{"glGetMultisamplefvANGLEContextANGLE", P(gl::GetMultisamplefvANGLEContextANGLE)},
@@ -687,6 +696,9 @@ ProcEntry g_procTable[] = {
{"glGetSamplerParameterivRobustANGLE", P(gl::GetSamplerParameterivRobustANGLE)},
{"glGetSamplerParameterivRobustANGLEContextANGLE",
P(gl::GetSamplerParameterivRobustANGLEContextANGLE)},
+ {"glGetSemaphoreParameterui64vEXT", P(gl::GetSemaphoreParameterui64vEXT)},
+ {"glGetSemaphoreParameterui64vEXTContextANGLE",
+ P(gl::GetSemaphoreParameterui64vEXTContextANGLE)},
{"glGetShaderInfoLog", P(gl::GetShaderInfoLog)},
{"glGetShaderInfoLogContextANGLE", P(gl::GetShaderInfoLogContextANGLE)},
{"glGetShaderPrecisionFormat", P(gl::GetShaderPrecisionFormat)},
@@ -766,6 +778,10 @@ ProcEntry g_procTable[] = {
{"glGetUniformuivContextANGLE", P(gl::GetUniformuivContextANGLE)},
{"glGetUniformuivRobustANGLE", P(gl::GetUniformuivRobustANGLE)},
{"glGetUniformuivRobustANGLEContextANGLE", P(gl::GetUniformuivRobustANGLEContextANGLE)},
+ {"glGetUnsignedBytei_vEXT", P(gl::GetUnsignedBytei_vEXT)},
+ {"glGetUnsignedBytei_vEXTContextANGLE", P(gl::GetUnsignedBytei_vEXTContextANGLE)},
+ {"glGetUnsignedBytevEXT", P(gl::GetUnsignedBytevEXT)},
+ {"glGetUnsignedBytevEXTContextANGLE", P(gl::GetUnsignedBytevEXTContextANGLE)},
{"glGetVertexAttribIiv", P(gl::GetVertexAttribIiv)},
{"glGetVertexAttribIivContextANGLE", P(gl::GetVertexAttribIivContextANGLE)},
{"glGetVertexAttribIivRobustANGLE", P(gl::GetVertexAttribIivRobustANGLE)},
@@ -801,6 +817,10 @@ ProcEntry g_procTable[] = {
{"glGetnUniformuivRobustANGLEContextANGLE", P(gl::GetnUniformuivRobustANGLEContextANGLE)},
{"glHint", P(gl::Hint)},
{"glHintContextANGLE", P(gl::HintContextANGLE)},
+ {"glImportMemoryFdEXT", P(gl::ImportMemoryFdEXT)},
+ {"glImportMemoryFdEXTContextANGLE", P(gl::ImportMemoryFdEXTContextANGLE)},
+ {"glImportSemaphoreFdEXT", P(gl::ImportSemaphoreFdEXT)},
+ {"glImportSemaphoreFdEXTContextANGLE", P(gl::ImportSemaphoreFdEXTContextANGLE)},
{"glInsertEventMarkerEXT", P(gl::InsertEventMarkerEXT)},
{"glInsertEventMarkerEXTContextANGLE", P(gl::InsertEventMarkerEXTContextANGLE)},
{"glInvalidateFramebuffer", P(gl::InvalidateFramebuffer)},
@@ -815,6 +835,8 @@ ProcEntry g_procTable[] = {
{"glIsFenceNVContextANGLE", P(gl::IsFenceNVContextANGLE)},
{"glIsFramebuffer", P(gl::IsFramebuffer)},
{"glIsFramebufferContextANGLE", P(gl::IsFramebufferContextANGLE)},
+ {"glIsMemoryObjectEXT", P(gl::IsMemoryObjectEXT)},
+ {"glIsMemoryObjectEXTContextANGLE", P(gl::IsMemoryObjectEXTContextANGLE)},
{"glIsPathCHROMIUM", P(gl::IsPathCHROMIUM)},
{"glIsPathCHROMIUMContextANGLE", P(gl::IsPathCHROMIUMContextANGLE)},
{"glIsProgram", P(gl::IsProgram)},
@@ -829,6 +851,8 @@ ProcEntry g_procTable[] = {
{"glIsRenderbufferContextANGLE", P(gl::IsRenderbufferContextANGLE)},
{"glIsSampler", P(gl::IsSampler)},
{"glIsSamplerContextANGLE", P(gl::IsSamplerContextANGLE)},
+ {"glIsSemaphoreEXT", P(gl::IsSemaphoreEXT)},
+ {"glIsSemaphoreEXTContextANGLE", P(gl::IsSemaphoreEXTContextANGLE)},
{"glIsShader", P(gl::IsShader)},
{"glIsShaderContextANGLE", P(gl::IsShaderContextANGLE)},
{"glIsSync", P(gl::IsSync)},
@@ -874,6 +898,8 @@ ProcEntry g_procTable[] = {
P(gl::LoadPaletteFromModelViewMatrixOESContextANGLE)},
{"glLogicOp", P(gl::LogicOp)},
{"glLogicOpContextANGLE", P(gl::LogicOpContextANGLE)},
+ {"glLoseContextCHROMIUM", P(gl::LoseContextCHROMIUM)},
+ {"glLoseContextCHROMIUMContextANGLE", P(gl::LoseContextCHROMIUMContextANGLE)},
{"glMapBufferOES", P(gl::MapBufferOES)},
{"glMapBufferOESContextANGLE", P(gl::MapBufferOESContextANGLE)},
{"glMapBufferRange", P(gl::MapBufferRange)},
@@ -902,6 +928,8 @@ ProcEntry g_procTable[] = {
{"glMemoryBarrierByRegion", P(gl::MemoryBarrierByRegion)},
{"glMemoryBarrierByRegionContextANGLE", P(gl::MemoryBarrierByRegionContextANGLE)},
{"glMemoryBarrierContextANGLE", P(gl::MemoryBarrierContextANGLE)},
+ {"glMemoryObjectParameterivEXT", P(gl::MemoryObjectParameterivEXT)},
+ {"glMemoryObjectParameterivEXTContextANGLE", P(gl::MemoryObjectParameterivEXTContextANGLE)},
{"glMultMatrixf", P(gl::MultMatrixf)},
{"glMultMatrixfContextANGLE", P(gl::MultMatrixfContextANGLE)},
{"glMultMatrixx", P(gl::MultMatrixx)},
@@ -1123,6 +1151,8 @@ ProcEntry g_procTable[] = {
{"glScalexContextANGLE", P(gl::ScalexContextANGLE)},
{"glScissor", P(gl::Scissor)},
{"glScissorContextANGLE", P(gl::ScissorContextANGLE)},
+ {"glSemaphoreParameterui64vEXT", P(gl::SemaphoreParameterui64vEXT)},
+ {"glSemaphoreParameterui64vEXTContextANGLE", P(gl::SemaphoreParameterui64vEXTContextANGLE)},
{"glSetFenceNV", P(gl::SetFenceNV)},
{"glSetFenceNVContextANGLE", P(gl::SetFenceNVContextANGLE)},
{"glShadeModel", P(gl::ShadeModel)},
@@ -1131,6 +1161,8 @@ ProcEntry g_procTable[] = {
{"glShaderBinaryContextANGLE", P(gl::ShaderBinaryContextANGLE)},
{"glShaderSource", P(gl::ShaderSource)},
{"glShaderSourceContextANGLE", P(gl::ShaderSourceContextANGLE)},
+ {"glSignalSemaphoreEXT", P(gl::SignalSemaphoreEXT)},
+ {"glSignalSemaphoreEXTContextANGLE", P(gl::SignalSemaphoreEXTContextANGLE)},
{"glStencilFillPathCHROMIUM", P(gl::StencilFillPathCHROMIUM)},
{"glStencilFillPathCHROMIUMContextANGLE", P(gl::StencilFillPathCHROMIUMContextANGLE)},
{"glStencilFillPathInstancedCHROMIUM", P(gl::StencilFillPathInstancedCHROMIUM)},
@@ -1229,6 +1261,16 @@ ProcEntry g_procTable[] = {
{"glTexStorage3DEXTContextANGLE", P(gl::TexStorage3DEXTContextANGLE)},
{"glTexStorage3DMultisampleOES", P(gl::TexStorage3DMultisampleOES)},
{"glTexStorage3DMultisampleOESContextANGLE", P(gl::TexStorage3DMultisampleOESContextANGLE)},
+ {"glTexStorageMem2DEXT", P(gl::TexStorageMem2DEXT)},
+ {"glTexStorageMem2DEXTContextANGLE", P(gl::TexStorageMem2DEXTContextANGLE)},
+ {"glTexStorageMem2DMultisampleEXT", P(gl::TexStorageMem2DMultisampleEXT)},
+ {"glTexStorageMem2DMultisampleEXTContextANGLE",
+ P(gl::TexStorageMem2DMultisampleEXTContextANGLE)},
+ {"glTexStorageMem3DEXT", P(gl::TexStorageMem3DEXT)},
+ {"glTexStorageMem3DEXTContextANGLE", P(gl::TexStorageMem3DEXTContextANGLE)},
+ {"glTexStorageMem3DMultisampleEXT", P(gl::TexStorageMem3DMultisampleEXT)},
+ {"glTexStorageMem3DMultisampleEXTContextANGLE",
+ P(gl::TexStorageMem3DMultisampleEXTContextANGLE)},
{"glTexSubImage2D", P(gl::TexSubImage2D)},
{"glTexSubImage2DContextANGLE", P(gl::TexSubImage2DContextANGLE)},
{"glTexSubImage2DRobustANGLE", P(gl::TexSubImage2DRobustANGLE)},
@@ -1369,10 +1411,12 @@ ProcEntry g_procTable[] = {
{"glVertexPointerContextANGLE", P(gl::VertexPointerContextANGLE)},
{"glViewport", P(gl::Viewport)},
{"glViewportContextANGLE", P(gl::ViewportContextANGLE)},
+ {"glWaitSemaphoreEXT", P(gl::WaitSemaphoreEXT)},
+ {"glWaitSemaphoreEXTContextANGLE", P(gl::WaitSemaphoreEXTContextANGLE)},
{"glWaitSync", P(gl::WaitSync)},
{"glWaitSyncContextANGLE", P(gl::WaitSyncContextANGLE)},
{"glWeightPointerOES", P(gl::WeightPointerOES)},
{"glWeightPointerOESContextANGLE", P(gl::WeightPointerOESContextANGLE)}};
-size_t g_numProcs = 1290;
+size_t g_numProcs = 1332;
} // namespace egl
diff --git a/chromium/third_party/angle/src/libGLESv2/proc_table_data.json b/chromium/third_party/angle/src/libGLESv2/proc_table_data.json
index ed52c1eae68..397691539c2 100644
--- a/chromium/third_party/angle/src/libGLESv2/proc_table_data.json
+++ b/chromium/third_party/angle/src/libGLESv2/proc_table_data.json
@@ -578,9 +578,8 @@
"glMultiDrawElementsInstancedANGLE"
],
- "GL_ANGLE_multiview": [
- "glFramebufferTextureMultiviewLayeredANGLE",
- "glFramebufferTextureMultiviewSideBySideANGLE"
+ "GL_OVR_multiview2": [
+ "glFramebufferTextureMultiviewOVR"
],
"GL_KHR_parallel_shader_compile": [
@@ -957,5 +956,45 @@
"angle::Platform related entry points": [
"ANGLEGetDisplayPlatform",
"ANGLEResetDisplayPlatform"
+ ],
+
+ "GL_EXT_memory_object/GL_EXT_semaphore": [
+ "glGetUnsignedBytevEXT",
+ "glGetUnsignedBytei_vEXT"
+ ],
+
+ "GL_EXT_memory_object": [
+ "glDeleteMemoryObjectsEXT",
+ "glIsMemoryObjectEXT",
+ "glCreateMemoryObjectsEXT",
+ "glMemoryObjectParameterivEXT",
+ "glGetMemoryObjectParameterivEXT",
+ "glTexStorageMem2DEXT",
+ "glTexStorageMem2DMultisampleEXT",
+ "glTexStorageMem3DEXT",
+ "glTexStorageMem3DMultisampleEXT",
+ "glBufferStorageMemEXT"
+ ],
+
+ "GL_EXT_memory_object_fd": [
+ "glImportMemoryFdEXT"
+ ],
+
+ "GL_EXT_semaphore": [
+ "glGenSemaphoresEXT",
+ "glDeleteSemaphoresEXT",
+ "glIsSemaphoreEXT",
+ "glSemaphoreParameterui64vEXT",
+ "glGetSemaphoreParameterui64vEXT",
+ "glWaitSemaphoreEXT",
+ "glSignalSemaphoreEXT"
+ ],
+
+ "GL_EXT_semaphore_fd": [
+ "glImportSemaphoreFdEXT"
+ ],
+
+ "GL_CHROMIUM_lose_context": [
+ "glLoseContextCHROMIUM"
]
}
diff --git a/chromium/third_party/angle/src/tests/BUILD.gn b/chromium/third_party/angle/src/tests/BUILD.gn
index 5a2c06aff68..24ec46812c1 100644
--- a/chromium/third_party/angle/src/tests/BUILD.gn
+++ b/chromium/third_party/angle/src/tests/BUILD.gn
@@ -51,13 +51,6 @@ if (build_with_chromium) {
if (build_angle_gles1_conform_tests) {
deps += [ "//src/tests:angle_gles1_conformance_tests" ]
}
-
- if (is_win) {
- deps += [
- "//third_party/glmark2:glmark2_angle",
- "//third_party/glmark2:glmark2_wgl",
- ]
- }
}
}
@@ -105,6 +98,37 @@ angle_test("angle_unittests_helper") {
]
}
+test_expectations_sources = [
+ "test_expectations/GPUTestConfig.cpp",
+ "test_expectations/GPUTestConfig.h",
+ "test_expectations/GPUTestExpectationsParser.cpp",
+ "test_expectations/GPUTestExpectationsParser.h",
+]
+if (is_mac) {
+ test_expectations_sources_mac = [
+ "test_expectations/GPUTestConfig_mac.mm",
+ "test_expectations/GPUTestConfig_mac.h",
+ ]
+}
+
+config("angle_test_expectations_config") {
+ include_dirs = [ "${angle_root}:angle_common" ]
+}
+
+angle_static_library("angle_test_expectations") {
+ public_configs += [ ":angle_test_expectations_config" ]
+ public_deps = [
+ "${angle_root}:angle_common",
+ "${angle_root}:angle_gpu_info_util",
+ "${angle_root}:angle_util",
+ ]
+ sources = test_expectations_sources
+ if (is_mac) {
+ sources += test_expectations_sources_mac
+ libs = [ "Cocoa.framework" ]
+ }
+}
+
angle_test("angle_unittests") {
sources = angle_unittests_sources
@@ -115,6 +139,7 @@ angle_test("angle_unittests") {
deps = googletest_deps + [
"${angle_root}:libANGLE",
+ ":angle_test_expectations",
"${angle_root}:preprocessor",
"${angle_root}:translator",
"${angle_root}:libfeature_support${angle_libs_suffix}",
@@ -151,6 +176,9 @@ if (is_win || is_linux || is_mac || is_android || is_fuchsia) {
if (use_x11) {
sources += angle_end2end_tests_x11_sources
}
+ if (angle_enable_vulkan) {
+ sources += angle_end2end_tests_vulkan_sources
+ }
configs += [
"${angle_root}:libANGLE_config",
@@ -159,6 +187,7 @@ if (is_win || is_linux || is_mac || is_android || is_fuchsia) {
deps = [
":angle_end2end_tests_main",
+ ":angle_test_expectations",
"${angle_root}:angle_gpu_info_util",
"${angle_root}:angle_image_util",
"${angle_root}:angle_util",
@@ -174,6 +203,9 @@ if (is_win || is_linux || is_mac || is_android || is_fuchsia) {
if (is_android) {
use_native_activity = true
}
+ if (angle_enable_vulkan) {
+ deps += [ "${angle_root}:angle_vulkan" ]
+ }
}
}
@@ -282,6 +314,16 @@ if (is_win || is_linux || is_android || is_mac || is_fuchsia) {
if (is_android) {
use_native_activity = true
}
+
+ if (is_win || is_linux) {
+ data_deps += [ "${angle_root}/third_party/glmark2:glmark2_angle" ]
+ }
+ if (is_win && target_cpu != "arm64") {
+ data_deps += [ "${angle_root}/third_party/glmark2:glmark2_wgl" ]
+ }
+ if (is_linux) {
+ data_deps += [ "${angle_root}/third_party/glmark2:glmark2_glx" ]
+ }
}
}
@@ -656,30 +698,17 @@ if (build_angle_deqp_tests && !is_fuchsia) {
}
}
- config("angle_deqp_gtest_support_config") {
- include_dirs = [ "third_party/gpu_test_expectations" ]
- }
-
angle_source_set("angle_deqp_gtest_support") {
testonly = true
public_deps = [
":angle_deqp_tests_main",
+ ":angle_test_expectations",
"${angle_root}:angle_common",
"${angle_root}:angle_util",
]
- public_configs += [ ":angle_deqp_gtest_support_config" ]
-
- sources = deqp_gpu_test_expectations_sources
- if (is_mac) {
- sources += deqp_gpu_test_expectations_sources_mac
- libs = [ "Cocoa.framework" ]
- }
-
- if (!is_android) {
- public_deps += [ "${angle_root}:angle_gpu_info_util" ]
- }
+ libs = []
}
api_names = [
@@ -755,10 +784,16 @@ if (build_angle_deqp_tests && !is_fuchsia) {
"deqp_support/angle_deqp_gtest.cpp",
]
+ # Use the master lists from the Khronos version for GLES. For EGL the Khronos lists use wildcards.
+ mustpass_dir = "external/openglcts/data/mustpass/gles/aosp_mustpass"
+ if (api_name == "egl") {
+ mustpass_dir = "android/cts"
+ }
+
data = [
- "deqp_support/deqp_${api_name}_test_expectations.txt",
- "$angle_root/third_party/deqp/src/android/cts/master/${api_name}-master.txt",
+ "$angle_root/third_party/deqp/src/$mustpass_dir/master/${api_name}-master.txt",
"$angle_root/third_party/deqp/src/data/",
+ "deqp_support/deqp_${api_name}_test_expectations.txt",
]
if (is_android) {
diff --git a/chromium/third_party/angle/src/tests/angle_end2end_tests.gni b/chromium/third_party/angle/src/tests/angle_end2end_tests.gni
index fa096f86732..01441458b68 100644
--- a/chromium/third_party/angle/src/tests/angle_end2end_tests.gni
+++ b/chromium/third_party/angle/src/tests/angle_end2end_tests.gni
@@ -17,6 +17,7 @@ angle_end2end_tests_sources = [
"gl_tests/ClientArraysTest.cpp",
"gl_tests/ColorMaskTest.cpp",
"gl_tests/ComputeShaderTest.cpp",
+ "gl_tests/ContextLostTest.cpp",
"gl_tests/CopyCompressedTextureTest.cpp",
"gl_tests/CopyTexImageTest.cpp",
"gl_tests/CopyTextureTest.cpp",
@@ -75,6 +76,7 @@ angle_end2end_tests_sources = [
"gl_tests/LinkAndRelinkTest.cpp",
"gl_tests/MaxTextureSizeTest.cpp",
"gl_tests/MemorySizeTest.cpp",
+ "gl_tests/MemoryObjectTest.cpp",
"gl_tests/MipmapTest.cpp",
"gl_tests/MultiDrawTest.cpp",
"gl_tests/MultisampleCompatibilityTest.cpp",
@@ -126,6 +128,7 @@ angle_end2end_tests_sources = [
"gl_tests/WebGLFramebufferTest.cpp",
"gl_tests/WebGLReadOutsideFramebufferTest.cpp",
"egl_tests/EGLBlobCacheTest.cpp",
+ "egl_tests/EGLChooseConfigTest.cpp",
"egl_tests/EGLContextCompatibilityTest.cpp",
"egl_tests/EGLContextSharingTest.cpp",
"egl_tests/EGLDebugTest.cpp",
@@ -137,7 +140,7 @@ angle_end2end_tests_sources = [
"egl_tests/EGLSurfacelessContextTest.cpp",
"egl_tests/EGLSurfaceTest.cpp",
"egl_tests/EGLSyncTest.cpp",
- "egl_tests/EGLThreadTest.cpp",
+ "test_expectations/GPUTestExpectationsTest.cpp",
"test_utils/ANGLETest.cpp",
"test_utils/ANGLETest.h",
"test_utils/MultiviewTest.cpp",
@@ -159,3 +162,8 @@ angle_end2end_tests_win_sources = [
"egl_tests/media/yuvtest.inl",
]
angle_end2end_tests_x11_sources = [ "egl_tests/EGLX11VisualTest.cpp" ]
+angle_end2end_tests_vulkan_sources = [
+ "gl_tests/VulkanExternalImageTest.cpp",
+ "test_utils/VulkanExternalHelper.cpp",
+ "test_utils/VulkanExternalHelper.h",
+]
diff --git a/chromium/third_party/angle/src/tests/angle_perftests.gni b/chromium/third_party/angle/src/tests/angle_perftests.gni
index 08d2cb44f89..c63b02ca173 100644
--- a/chromium/third_party/angle/src/tests/angle_perftests.gni
+++ b/chromium/third_party/angle/src/tests/angle_perftests.gni
@@ -5,9 +5,12 @@
angle_perf_tests_sources = [
"perf_tests/ANGLEPerfTest.cpp",
"perf_tests/ANGLEPerfTest.h",
+ "perf_tests/ANGLEPerfTestArgs.cpp",
+ "perf_tests/ANGLEPerfTestArgs.h",
"perf_tests/BlitFramebufferPerf.cpp",
"perf_tests/BindingPerf.cpp",
"perf_tests/BufferSubData.cpp",
+ "perf_tests/ClearPerf.cpp",
"perf_tests/DispatchComputePerf.cpp",
"perf_tests/DrawCallPerf.cpp",
"perf_tests/DrawCallPerfParams.cpp",
@@ -21,11 +24,12 @@ angle_perf_tests_sources = [
"perf_tests/LinkProgramPerfTest.cpp",
"perf_tests/MultiviewPerf.cpp",
"perf_tests/PointSprites.cpp",
- "perf_tests/TexSubImage.cpp",
"perf_tests/TextureSampling.cpp",
+ "perf_tests/TextureUploadPerf.cpp",
"perf_tests/TexturesPerf.cpp",
"perf_tests/UniformsPerf.cpp",
"perf_tests/VulkanBarriersPerf.cpp",
+ "perf_tests/glmark2Benchmark.cpp",
"perf_tests/third_party/perf/perf_test.cc",
"perf_tests/third_party/perf/perf_test.h",
"test_utils/angle_test_configs.cpp",
@@ -41,6 +45,8 @@ angle_white_box_perf_tests_sources = [
"angle_unittests_utils.h",
"perf_tests/ANGLEPerfTest.cpp",
"perf_tests/ANGLEPerfTest.h",
+ "perf_tests/ANGLEPerfTestArgs.cpp",
+ "perf_tests/ANGLEPerfTestArgs.h",
"perf_tests/BitSetIteratorPerf.cpp",
"perf_tests/CompilerPerf.cpp",
"perf_tests/EGLInitializePerf.cpp", # Uses ANGLEGetDisplayPlatform, a non-standard EP.
diff --git a/chromium/third_party/angle/src/tests/angle_unittests.gni b/chromium/third_party/angle/src/tests/angle_unittests.gni
index 25750167ce2..15847ebea1f 100644
--- a/chromium/third_party/angle/src/tests/angle_unittests.gni
+++ b/chromium/third_party/angle/src/tests/angle_unittests.gni
@@ -100,8 +100,9 @@ angle_unittests_sources = [
"../tests/compiler_tests/UnfoldShortCircuitAST_test.cpp",
"../tests/compiler_tests/VariablePacker_test.cpp",
"../tests/compiler_tests/VectorizeVectorScalarArithmetic_test.cpp",
- "../tests/compiler_tests/WEBGL_multiview_test.cpp",
+ "../tests/compiler_tests/OVR_multiview2_test.cpp",
"../tests/compiler_tests/WorkGroupSize_test.cpp",
+ "../tests/test_expectations/GPUTestExpectationsParser_unittest.cpp",
"../tests/preprocessor_tests/char_test.cpp",
"../tests/preprocessor_tests/comment_test.cpp",
"../tests/preprocessor_tests/define_test.cpp",
diff --git a/chromium/third_party/angle/src/tests/deqp.gni b/chromium/third_party/angle/src/tests/deqp.gni
index 96abc97f28a..91d0c3b1b7d 100644
--- a/chromium/third_party/angle/src/tests/deqp.gni
+++ b/chromium/third_party/angle/src/tests/deqp.gni
@@ -1143,15 +1143,3 @@ deqp_libtester_sources_android = [
"$_deqp_path/framework/platform/android/tcuAndroidInternals.cpp",
"$_deqp_path/framework/platform/android/tcuAndroidInternals.hpp",
]
-deqp_gpu_test_expectations_sources = [
- "third_party/gpu_test_expectations/gpu_info.cc",
- "third_party/gpu_test_expectations/gpu_info.h",
- "third_party/gpu_test_expectations/gpu_test_config.cc",
- "third_party/gpu_test_expectations/gpu_test_config.h",
- "third_party/gpu_test_expectations/gpu_test_expectations_parser.cc",
- "third_party/gpu_test_expectations/gpu_test_expectations_parser.h",
-]
-deqp_gpu_test_expectations_sources_mac = [
- "third_party/gpu_test_expectations/gpu_test_config_mac.mm",
- "third_party/gpu_test_expectations/gpu_test_config_mac.h",
-]
diff --git a/chromium/third_party/angle/third_party/glmark2/BUILD.gn b/chromium/third_party/angle/third_party/glmark2/BUILD.gn
index 427234dff89..ddd7f2aa11a 100644
--- a/chromium/third_party/angle/third_party/glmark2/BUILD.gn
+++ b/chromium/third_party/angle/third_party/glmark2/BUILD.gn
@@ -109,6 +109,9 @@ source_set("glmark2_headers") {
"src/src/texture.h",
]
+ if (is_linux) {
+ sources += [ "src/src/gl-state-glx.h" ]
+ }
if (is_win) {
sources += [
"src/src/gl-state-wgl.h",
@@ -338,7 +341,7 @@ template("glmark2_exe") {
"src/src/main.cpp",
]
data = [
- "src/data",
+ "src/data/",
]
defines += [ "GLMARK_VERSION=\"${glmark2_version}\"" ]
@@ -377,9 +380,30 @@ glmark2_exe("glmark2_angle") {
"EGL_EGL_PROTOTYPES=1",
"GLMARK2_USE_EGL",
]
+
+ if (is_linux && !is_component_build) {
+ # Set rpath to find shared libs in a non-component build.
+ public_configs = [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
+ }
+}
+
+if (is_linux) {
+ glmark2_exe("glmark2_glx") {
+ sources = [
+ "src/src/gl-state-glx.cpp",
+ "src/src/glad/include/glad/glx.h",
+ "src/src/glad/src/glx.c",
+ ]
+ deps = [
+ ":glmark2_common_gl",
+ ]
+
+ defines = [ "GLMARK2_USE_GLX" ]
+ }
}
-if (is_win) {
+# opengl32.lib/opengl32.dll are not available on Windows ARM64.
+if (is_win && target_cpu != "arm64") {
glmark2_exe("glmark2_wgl") {
sources = [
"src/src/gl-state-wgl.cpp",
diff --git a/chromium/third_party/angle/third_party/vulkan-headers/BUILD.gn b/chromium/third_party/angle/third_party/vulkan-headers/BUILD.gn
index d71b3ceeabe..e61be5643f2 100644
--- a/chromium/third_party/angle/third_party/vulkan-headers/BUILD.gn
+++ b/chromium/third_party/angle/third_party/vulkan-headers/BUILD.gn
@@ -10,6 +10,19 @@ import("../../gni/angle.gni")
config("vulkan_headers_config") {
include_dirs = [ "src/include" ]
+
+ if (is_win) {
+ defines = [ "VK_USE_PLATFORM_WIN32_KHR" ]
+ }
+ if (is_linux) {
+ defines = [ "VK_USE_PLATFORM_XCB_KHR" ]
+ }
+ if (is_android) {
+ defines = [ "VK_USE_PLATFORM_ANDROID_KHR" ]
+ }
+ if (is_fuchsia) {
+ defines = [ "VK_USE_PLATFORM_FUCHSIA" ]
+ }
}
# Vulkan headers only, no compiled sources.
diff --git a/chromium/third_party/angle/third_party/vulkan-validation-layers/BUILD.gn b/chromium/third_party/angle/third_party/vulkan-validation-layers/BUILD.gn
index aa0863098dd..4934c7a034c 100644
--- a/chromium/third_party/angle/third_party/vulkan-validation-layers/BUILD.gn
+++ b/chromium/third_party/angle/third_party/vulkan-validation-layers/BUILD.gn
@@ -302,7 +302,6 @@ core_validation_sources = [
"$vulkan_gen_dir/vk_safe_struct.h",
"src/layers/buffer_validation.cpp",
"src/layers/buffer_validation.h",
- "src/layers/core_dispatch.cpp",
"src/layers/core_validation.cpp",
"src/layers/core_validation.h",
"src/layers/convert_to_renderpass2.cpp",
@@ -368,9 +367,9 @@ chassis_deps = [
layers = [
[
"core_validation",
- core_validation_sources,
- core_validation_deps,
- [],
+ core_validation_sources + chassis_sources,
+ core_validation_deps + chassis_deps,
+ [ "BUILD_CORE_VALIDATION" ],
],
[
"object_lifetimes",
diff --git a/chromium/third_party/angle/tools/empty b/chromium/third_party/angle/tools/empty
deleted file mode 100644
index d1cb09eb0a8..00000000000
--- a/chromium/third_party/angle/tools/empty
+++ /dev/null
@@ -1 +0,0 @@
-An empty file to make git happy. \ No newline at end of file
diff --git a/chromium/third_party/angle/tools/glslang/README.md b/chromium/third_party/angle/tools/glslang/README.md
new file mode 100644
index 00000000000..5d944797245
--- /dev/null
+++ b/chromium/third_party/angle/tools/glslang/README.md
@@ -0,0 +1,20 @@
+# Standalone glslang validator
+
+This folder contains a standalone glslang validator binary. We use this binary
+for offline compilation of internal Vulkan shaders. See [the internal shader
+docs](../../src/libANGLE/renderer/vulkan/shaders/README.md) for more info on
+offline shader compilation.
+
+Use the script [`update_glslang_binary.py`](update_glslang_binary.py) to update
+the versions of the validator in cloud storage. It must be run on Linux or
+Windows. It will update the SHA for your platform. After running the script run
+`git commit` and then `git cl upload` to code review using the normal review
+process. Note that if the version of glslang has been updated you will also want
+to run [`scripts/run_code_generation.py`](../../scripts/run_code_generation.py)
+to update the compiled shader binaries.
+
+Please update both Windows and Linux binaries at the same time. Use two CLs. One
+for each platform. Note that we don't currently suport Mac on Vulkan. If we do
+we should add a glslang download for Mac as well.
+
+Contact jmadill or syouseffi for any help with the validator or updating the binaries.
diff --git a/chromium/third_party/angle/tools/glslang/glslang_validator.exe.sha1 b/chromium/third_party/angle/tools/glslang/glslang_validator.exe.sha1
new file mode 100644
index 00000000000..8a80c3b399c
--- /dev/null
+++ b/chromium/third_party/angle/tools/glslang/glslang_validator.exe.sha1
@@ -0,0 +1 @@
+1320cd7889b936808e6badd9e0c40d3c5db5b5f2 \ No newline at end of file
diff --git a/chromium/third_party/angle/tools/glslang/glslang_validator.sha1 b/chromium/third_party/angle/tools/glslang/glslang_validator.sha1
new file mode 100644
index 00000000000..267c658bf61
--- /dev/null
+++ b/chromium/third_party/angle/tools/glslang/glslang_validator.sha1
@@ -0,0 +1 @@
+063f4ee998bfa5fea1b2471a2621c7a3107885d6 \ No newline at end of file
diff --git a/chromium/third_party/angle/tools/glslang/update_glslang_binary.py b/chromium/third_party/angle/tools/glslang/update_glslang_binary.py
new file mode 100755
index 00000000000..6e94408ef3b
--- /dev/null
+++ b/chromium/third_party/angle/tools/glslang/update_glslang_binary.py
@@ -0,0 +1,118 @@
+#!/usr/bin/python2
+#
+# Copyright 2019 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# update_glslang_binary.py:
+# Helper script to update the version of glslang in cloud storage.
+# This glslang is used to precompile Vulkan shaders. This script builds
+# glslang and uploads it to the bucket for Windows or Linux. It
+# currently only works on Windows and Linux. It also will update the
+# hashes stored in the tree. For more info see README.md in this folder.
+
+import os
+import platform
+import re
+import shutil
+import subprocess
+import sys
+
+
+gn_args = """is_clang = true
+is_debug = false
+angle_enable_vulkan = true"""
+
+
+is_windows = platform.system() == 'Windows'
+is_linux = platform.system() == 'Linux'
+
+
+def find_file_in_path(filename):
+ """ Finds |filename| by searching the environment paths """
+ path_delimiter = ';' if is_windows else ':'
+ for env_path in os.environ['PATH'].split(path_delimiter):
+ full_path = os.path.join(env_path, filename)
+ if os.path.isfile(full_path):
+ return full_path
+ raise Exception('Cannot find %s in environment' % filename)
+
+
+def main():
+ if not is_windows and not is_linux:
+ print('Script must be run on Linux or Windows.')
+ return 1
+
+ # Step 1: Generate an output directory
+ out_dir = os.path.join('out', 'glslang_release')
+
+ if not os.path.isdir(out_dir):
+ os.mkdir(out_dir)
+
+ args_gn = os.path.join(out_dir, 'args.gn')
+ if not os.path.isfile(args_gn):
+ with open(args_gn, 'w') as f:
+ f.write(gn_args)
+ f.close()
+
+ gn_exe = 'gn'
+ if is_windows:
+ gn_exe += '.bat'
+
+ # Step 2: Generate the ninja build files in the output directory
+ if subprocess.call([gn_exe, 'gen', out_dir]) != 0:
+ print('Error calling gn')
+ return 2
+
+ # Step 3: Compile glslang_validator
+ if subprocess.call(['ninja', '-C', out_dir, 'glslang_validator']) != 0:
+ print('Error calling ninja')
+ return 3
+
+ # Step 4: Copy glslang_validator to the tools/glslang directory
+ glslang_exe = 'glslang_validator'
+ if is_windows:
+ glslang_exe += '.exe'
+
+ glslang_src = os.path.join(out_dir, glslang_exe)
+ glslang_dst = os.path.join(sys.path[0], glslang_exe)
+
+ shutil.copy(glslang_src, glslang_dst)
+
+ # Step 5: Delete the build directory
+ shutil.rmtree(out_dir)
+
+ # Step 6: Upload to cloud storage
+ upload_script = find_file_in_path('upload_to_google_storage.py')
+ upload_args = ['python', upload_script, '-b', 'angle-glslang-validator', glslang_dst]
+ if subprocess.call(upload_args) != 0:
+ print('Error upload to cloud storage')
+ return 4
+
+ # Step 7: Stage new SHA to git
+ git_exe = 'git'
+ if is_windows:
+ git_exe += '.bat'
+ git_exe = find_file_in_path(git_exe)
+
+ if subprocess.call([git_exe, 'add', glslang_dst + '.sha1']) != 0:
+ print('Error running git add')
+ return 5
+
+ print('')
+ print('The updated SHA has been staged for commit. Please commit and upload.')
+ print('Suggested commit message:')
+ print('----------------------------')
+ print('')
+ print('Update glslang_validator binary for %s.' % platform.system())
+ print('')
+ print('This binary was updated using %s.' % os.path.basename(__file__))
+ print('Please see instructions in tools/glslang/README.md.')
+ print('')
+ print('Bug: None')
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/third_party/angle/util/EGLWindow.cpp b/chromium/third_party/angle/util/EGLWindow.cpp
index 0c2ae483489..ccd7715889a 100644
--- a/chromium/third_party/angle/util/EGLWindow.cpp
+++ b/chromium/third_party/angle/util/EGLWindow.cpp
@@ -87,18 +87,45 @@ bool operator==(const EGLPlatformParameters &a, const EGLPlatformParameters &b)
(a.presentPath == b.presentPath);
}
+// ConfigParameters implementation.
+ConfigParameters::ConfigParameters()
+ : platformMethods(nullptr),
+ redBits(-1),
+ greenBits(-1),
+ blueBits(-1),
+ alphaBits(-1),
+ depthBits(-1),
+ stencilBits(-1),
+ swapInterval(-1),
+ componentType(EGL_COLOR_COMPONENT_TYPE_FIXED_EXT),
+ multisample(false),
+ debug(false),
+ noError(false),
+ bindGeneratesResource(true),
+ clientArraysEnabled(true),
+ robustAccess(false),
+ samples(-1),
+ resetStrategy(EGL_NO_RESET_NOTIFICATION_EXT)
+{}
+
+ConfigParameters::~ConfigParameters() = default;
+
+void ConfigParameters::reset()
+{
+ *this = ConfigParameters();
+}
+
+// static
+bool ConfigParameters::CanShareDisplay(const ConfigParameters &a, const ConfigParameters &b)
+{
+ return a.debugLayersEnabled == b.debugLayersEnabled &&
+ a.contextVirtualization == b.contextVirtualization &&
+ a.platformMethods == b.platformMethods;
+}
+
// GLWindowBase implementation.
GLWindowBase::GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion)
- : mClientMajorVersion(glesMajorVersion),
- mClientMinorVersion(glesMinorVersion),
- mRedBits(-1),
- mGreenBits(-1),
- mBlueBits(-1),
- mAlphaBits(-1),
- mDepthBits(-1),
- mStencilBits(-1),
- mSwapInterval(-1),
- mPlatformMethods(nullptr)
+ : mClientMajorVersion(glesMajorVersion), mClientMinorVersion(glesMinorVersion)
{}
GLWindowBase::~GLWindowBase() = default;
@@ -108,24 +135,13 @@ EGLWindow::EGLWindow(EGLint glesMajorVersion,
EGLint glesMinorVersion,
const EGLPlatformParameters &platform)
: GLWindowBase(glesMajorVersion, glesMinorVersion),
+ mConfig(0),
mDisplay(EGL_NO_DISPLAY),
mSurface(EGL_NO_SURFACE),
mContext(EGL_NO_CONTEXT),
mEGLMajorVersion(0),
mEGLMinorVersion(0),
- mPlatform(platform),
- mComponentType(EGL_COLOR_COMPONENT_TYPE_FIXED_EXT),
- mMultisample(false),
- mDebug(false),
- mNoError(false),
- mExtensionsEnabled(),
- mBindGeneratesResource(true),
- mClientArraysEnabled(true),
- mRobustAccess(false),
- mSamples(-1),
- mDebugLayersEnabled(),
- mContextProgramCacheEnabled(),
- mContextVirtualization()
+ mPlatform(platform)
{}
EGLWindow::~EGLWindow()
@@ -158,15 +174,23 @@ EGLContext EGLWindow::getContext() const
return mContext;
}
-bool EGLWindow::initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary)
+bool EGLWindow::initializeGL(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params)
{
- if (!initializeDisplayAndSurface(osWindow, glWindowingLibrary))
+ if (!initializeDisplay(osWindow, glWindowingLibrary, params))
+ return false;
+ if (!initializeSurface(osWindow, glWindowingLibrary, params))
return false;
return initializeContext();
}
-bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow, angle::Library *glWindowingLibrary)
+bool EGLWindow::initializeDisplay(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params)
{
+ mConfigParams = params;
+
#if defined(ANGLE_USE_UTIL_LOADER)
PFNEGLGETPROCADDRESSPROC getProcAddress;
glWindowingLibrary->getAs("eglGetProcAddress", &getProcAddress);
@@ -208,23 +232,26 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow, angle::Library *
}
// Set debug layer settings if requested.
- if (mDebugLayersEnabled.valid())
+ if (mConfigParams.debugLayersEnabled.valid())
{
displayAttributes.push_back(EGL_PLATFORM_ANGLE_DEBUG_LAYERS_ENABLED_ANGLE);
- displayAttributes.push_back(mDebugLayersEnabled.value() ? EGL_TRUE : EGL_FALSE);
+ displayAttributes.push_back(mConfigParams.debugLayersEnabled.value() ? EGL_TRUE
+ : EGL_FALSE);
}
- if (mContextVirtualization.valid())
+ if (mConfigParams.contextVirtualization.valid())
{
displayAttributes.push_back(EGL_PLATFORM_ANGLE_CONTEXT_VIRTUALIZATION_ANGLE);
- displayAttributes.push_back(mContextVirtualization.value() ? EGL_TRUE : EGL_FALSE);
+ displayAttributes.push_back(mConfigParams.contextVirtualization.value() ? EGL_TRUE
+ : EGL_FALSE);
}
- if (mPlatformMethods)
+ if (mConfigParams.platformMethods)
{
- static_assert(sizeof(EGLAttrib) == sizeof(mPlatformMethods), "Unexpected pointer size");
+ static_assert(sizeof(EGLAttrib) == sizeof(mConfigParams.platformMethods),
+ "Unexpected pointer size");
displayAttributes.push_back(EGL_PLATFORM_ANGLE_PLATFORM_METHODS_ANGLEX);
- displayAttributes.push_back(reinterpret_cast<EGLAttrib>(mPlatformMethods));
+ displayAttributes.push_back(reinterpret_cast<EGLAttrib>(mConfigParams.platformMethods));
}
displayAttributes.push_back(EGL_NONE);
@@ -244,22 +271,38 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow, angle::Library *
return false;
}
+ return true;
+}
+
+bool EGLWindow::initializeSurface(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params)
+{
+ mConfigParams = params;
const char *displayExtensions = eglQueryString(mDisplay, EGL_EXTENSIONS);
std::vector<EGLint> configAttributes = {
- EGL_RED_SIZE, (mRedBits >= 0) ? mRedBits : EGL_DONT_CARE,
- EGL_GREEN_SIZE, (mGreenBits >= 0) ? mGreenBits : EGL_DONT_CARE,
- EGL_BLUE_SIZE, (mBlueBits >= 0) ? mBlueBits : EGL_DONT_CARE,
- EGL_ALPHA_SIZE, (mAlphaBits >= 0) ? mAlphaBits : EGL_DONT_CARE,
- EGL_DEPTH_SIZE, (mDepthBits >= 0) ? mDepthBits : EGL_DONT_CARE,
- EGL_STENCIL_SIZE, (mStencilBits >= 0) ? mStencilBits : EGL_DONT_CARE,
- EGL_SAMPLE_BUFFERS, mMultisample ? 1 : 0,
- EGL_SAMPLES, (mSamples >= 0) ? mSamples : EGL_DONT_CARE,
+ EGL_RED_SIZE,
+ (mConfigParams.redBits >= 0) ? mConfigParams.redBits : EGL_DONT_CARE,
+ EGL_GREEN_SIZE,
+ (mConfigParams.greenBits >= 0) ? mConfigParams.greenBits : EGL_DONT_CARE,
+ EGL_BLUE_SIZE,
+ (mConfigParams.blueBits >= 0) ? mConfigParams.blueBits : EGL_DONT_CARE,
+ EGL_ALPHA_SIZE,
+ (mConfigParams.alphaBits >= 0) ? mConfigParams.alphaBits : EGL_DONT_CARE,
+ EGL_DEPTH_SIZE,
+ (mConfigParams.depthBits >= 0) ? mConfigParams.depthBits : EGL_DONT_CARE,
+ EGL_STENCIL_SIZE,
+ (mConfigParams.stencilBits >= 0) ? mConfigParams.stencilBits : EGL_DONT_CARE,
+ EGL_SAMPLE_BUFFERS,
+ mConfigParams.multisample ? 1 : 0,
+ EGL_SAMPLES,
+ (mConfigParams.samples >= 0) ? mConfigParams.samples : EGL_DONT_CARE,
};
// Add dynamic attributes
bool hasPixelFormatFloat = strstr(displayExtensions, "EGL_EXT_pixel_format_float") != nullptr;
- if (!hasPixelFormatFloat && mComponentType != EGL_COLOR_COMPONENT_TYPE_FIXED_EXT)
+ if (!hasPixelFormatFloat && mConfigParams.componentType != EGL_COLOR_COMPONENT_TYPE_FIXED_EXT)
{
destroyGL();
return false;
@@ -267,7 +310,7 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow, angle::Library *
if (hasPixelFormatFloat)
{
configAttributes.push_back(EGL_COLOR_COMPONENT_TYPE_EXT);
- configAttributes.push_back(mComponentType);
+ configAttributes.push_back(mConfigParams.componentType);
}
// Finish the attribute list
@@ -280,13 +323,13 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow, angle::Library *
return false;
}
- eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &mRedBits);
- eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &mGreenBits);
- eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &mBlueBits);
- eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &mAlphaBits);
- eglGetConfigAttrib(mDisplay, mConfig, EGL_DEPTH_SIZE, &mDepthBits);
- eglGetConfigAttrib(mDisplay, mConfig, EGL_STENCIL_SIZE, &mStencilBits);
- eglGetConfigAttrib(mDisplay, mConfig, EGL_SAMPLES, &mSamples);
+ eglGetConfigAttrib(mDisplay, mConfig, EGL_RED_SIZE, &mConfigParams.redBits);
+ eglGetConfigAttrib(mDisplay, mConfig, EGL_GREEN_SIZE, &mConfigParams.greenBits);
+ eglGetConfigAttrib(mDisplay, mConfig, EGL_BLUE_SIZE, &mConfigParams.blueBits);
+ eglGetConfigAttrib(mDisplay, mConfig, EGL_ALPHA_SIZE, &mConfigParams.alphaBits);
+ eglGetConfigAttrib(mDisplay, mConfig, EGL_DEPTH_SIZE, &mConfigParams.depthBits);
+ eglGetConfigAttrib(mDisplay, mConfig, EGL_STENCIL_SIZE, &mConfigParams.stencilBits);
+ eglGetConfigAttrib(mDisplay, mConfig, EGL_SAMPLES, &mConfigParams.samples);
std::vector<EGLint> surfaceAttributes;
if (strstr(displayExtensions, "EGL_NV_post_sub_buffer") != nullptr)
@@ -297,10 +340,11 @@ bool EGLWindow::initializeDisplayAndSurface(OSWindow *osWindow, angle::Library *
bool hasRobustResourceInit =
strstr(displayExtensions, "EGL_ANGLE_robust_resource_initialization") != nullptr;
- if (hasRobustResourceInit && mRobustResourceInit.valid())
+ if (hasRobustResourceInit && mConfigParams.robustResourceInit.valid())
{
surfaceAttributes.push_back(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
- surfaceAttributes.push_back(mRobustResourceInit.value() ? EGL_TRUE : EGL_FALSE);
+ surfaceAttributes.push_back(mConfigParams.robustResourceInit.value() ? EGL_TRUE
+ : EGL_FALSE);
}
surfaceAttributes.push_back(EGL_NONE);
@@ -331,54 +375,64 @@ EGLContext EGLWindow::createContext(EGLContext share) const
if (mClientMajorVersion > 2 && !(mEGLMajorVersion > 1 || mEGLMinorVersion >= 5) &&
!hasKHRCreateContext)
{
+ std::cerr << "EGL_KHR_create_context incompatibility.\n";
return EGL_NO_CONTEXT;
}
bool hasWebGLCompatibility =
strstr(displayExtensions, "EGL_ANGLE_create_context_webgl_compatibility") != nullptr;
- if (mWebGLCompatibility.valid() && !hasWebGLCompatibility)
+ if (mConfigParams.webGLCompatibility.valid() && !hasWebGLCompatibility)
{
+ std::cerr << "EGL_ANGLE_create_context_webgl_compatibility missing.\n";
return EGL_NO_CONTEXT;
}
bool hasCreateContextExtensionsEnabled =
strstr(displayExtensions, "EGL_ANGLE_create_context_extensions_enabled") != nullptr;
- if (mExtensionsEnabled.valid() && !hasCreateContextExtensionsEnabled)
+ if (mConfigParams.extensionsEnabled.valid() && !hasCreateContextExtensionsEnabled)
{
+ std::cerr << "EGL_ANGLE_create_context_extensions_enabled missing.\n";
return EGL_NO_CONTEXT;
}
bool hasRobustness = strstr(displayExtensions, "EGL_EXT_create_context_robustness") != nullptr;
- if (mRobustAccess && !hasRobustness)
+ if ((mConfigParams.robustAccess ||
+ mConfigParams.resetStrategy != EGL_NO_RESET_NOTIFICATION_EXT) &&
+ !hasRobustness)
{
+ std::cerr << "EGL_EXT_create_context_robustness missing.\n";
return EGL_NO_CONTEXT;
}
bool hasBindGeneratesResource =
strstr(displayExtensions, "EGL_CHROMIUM_create_context_bind_generates_resource") != nullptr;
- if (!mBindGeneratesResource && !hasBindGeneratesResource)
+ if (!mConfigParams.bindGeneratesResource && !hasBindGeneratesResource)
{
+ std::cerr << "EGL_CHROMIUM_create_context_bind_generates_resource missing.\n";
return EGL_NO_CONTEXT;
}
bool hasClientArraysExtension =
strstr(displayExtensions, "EGL_ANGLE_create_context_client_arrays") != nullptr;
- if (!mClientArraysEnabled && !hasClientArraysExtension)
+ if (!mConfigParams.clientArraysEnabled && !hasClientArraysExtension)
{
// Non-default state requested without the extension present
+ std::cerr << "EGL_ANGLE_create_context_client_arrays missing.\n";
return EGL_NO_CONTEXT;
}
bool hasProgramCacheControlExtension =
strstr(displayExtensions, "EGL_ANGLE_program_cache_control ") != nullptr;
- if (mContextProgramCacheEnabled.valid() && !hasProgramCacheControlExtension)
+ if (mConfigParams.contextProgramCacheEnabled.valid() && !hasProgramCacheControlExtension)
{
+ std::cerr << "EGL_ANGLE_program_cache_control missing.\n";
return EGL_NO_CONTEXT;
}
eglBindAPI(EGL_OPENGL_ES_API);
if (eglGetError() != EGL_SUCCESS)
{
+ std::cerr << "Error on eglBindAPI.\n";
return EGL_NO_CONTEXT;
}
@@ -392,57 +446,64 @@ EGLContext EGLWindow::createContext(EGLContext share) const
contextAttributes.push_back(mClientMinorVersion);
contextAttributes.push_back(EGL_CONTEXT_OPENGL_DEBUG);
- contextAttributes.push_back(mDebug ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.debug ? EGL_TRUE : EGL_FALSE);
// TODO(jmadill): Check for the extension string.
// bool hasKHRCreateContextNoError = strstr(displayExtensions,
// "EGL_KHR_create_context_no_error") != nullptr;
contextAttributes.push_back(EGL_CONTEXT_OPENGL_NO_ERROR_KHR);
- contextAttributes.push_back(mNoError ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.noError ? EGL_TRUE : EGL_FALSE);
- if (mWebGLCompatibility.valid())
+ if (mConfigParams.webGLCompatibility.valid())
{
contextAttributes.push_back(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE);
- contextAttributes.push_back(mWebGLCompatibility.value() ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.webGLCompatibility.value() ? EGL_TRUE
+ : EGL_FALSE);
}
- if (mExtensionsEnabled.valid())
+ if (mConfigParams.extensionsEnabled.valid())
{
contextAttributes.push_back(EGL_EXTENSIONS_ENABLED_ANGLE);
- contextAttributes.push_back(mExtensionsEnabled.value() ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.extensionsEnabled.value() ? EGL_TRUE
+ : EGL_FALSE);
}
if (hasRobustness)
{
contextAttributes.push_back(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT);
- contextAttributes.push_back(mRobustAccess ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.robustAccess ? EGL_TRUE : EGL_FALSE);
+
+ contextAttributes.push_back(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT);
+ contextAttributes.push_back(mConfigParams.resetStrategy);
}
if (hasBindGeneratesResource)
{
contextAttributes.push_back(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM);
- contextAttributes.push_back(mBindGeneratesResource ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.bindGeneratesResource ? EGL_TRUE : EGL_FALSE);
}
if (hasClientArraysExtension)
{
contextAttributes.push_back(EGL_CONTEXT_CLIENT_ARRAYS_ENABLED_ANGLE);
- contextAttributes.push_back(mClientArraysEnabled ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.clientArraysEnabled ? EGL_TRUE : EGL_FALSE);
}
- if (mContextProgramCacheEnabled.valid())
+ if (mConfigParams.contextProgramCacheEnabled.valid())
{
contextAttributes.push_back(EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE);
- contextAttributes.push_back(mContextProgramCacheEnabled.value() ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(
+ mConfigParams.contextProgramCacheEnabled.value() ? EGL_TRUE : EGL_FALSE);
}
bool hasRobustResourceInit =
strstr(displayExtensions, "EGL_ANGLE_robust_resource_initialization") != nullptr;
- if (hasRobustResourceInit && mRobustResourceInit.valid())
+ if (hasRobustResourceInit && mConfigParams.robustResourceInit.valid())
{
contextAttributes.push_back(EGL_ROBUST_RESOURCE_INITIALIZATION_ANGLE);
- contextAttributes.push_back(mRobustResourceInit.value() ? EGL_TRUE : EGL_FALSE);
+ contextAttributes.push_back(mConfigParams.robustResourceInit.value() ? EGL_TRUE
+ : EGL_FALSE);
}
}
contextAttributes.push_back(EGL_NONE);
@@ -450,6 +511,7 @@ EGLContext EGLWindow::createContext(EGLContext share) const
EGLContext context = eglCreateContext(mDisplay, mConfig, nullptr, &contextAttributes[0]);
if (eglGetError() != EGL_SUCCESS)
{
+ std::cerr << "Error on eglCreateContext.\n";
return EGL_NO_CONTEXT;
}
@@ -468,13 +530,14 @@ bool EGLWindow::initializeContext()
eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
if (eglGetError() != EGL_SUCCESS)
{
+ std::cerr << "Error during eglMakeCurrent.\n";
destroyGL();
return false;
}
- if (mSwapInterval != -1)
+ if (mConfigParams.swapInterval != -1)
{
- eglSwapInterval(mDisplay, mSwapInterval);
+ eglSwapInterval(mDisplay, mConfigParams.swapInterval);
}
return true;
@@ -482,26 +545,37 @@ bool EGLWindow::initializeContext()
void EGLWindow::destroyGL()
{
+ destroyContext();
+ destroySurface();
+
+ if (mDisplay != EGL_NO_DISPLAY)
+ {
+ eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ eglTerminate(mDisplay);
+ mDisplay = EGL_NO_DISPLAY;
+ }
+}
+
+void EGLWindow::destroySurface()
+{
if (mSurface != EGL_NO_SURFACE)
{
+ eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
assert(mDisplay != EGL_NO_DISPLAY);
eglDestroySurface(mDisplay, mSurface);
mSurface = EGL_NO_SURFACE;
}
+}
+void EGLWindow::destroyContext()
+{
if (mContext != EGL_NO_CONTEXT)
{
+ eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
assert(mDisplay != EGL_NO_DISPLAY);
eglDestroyContext(mDisplay, mContext);
mContext = EGL_NO_CONTEXT;
}
-
- if (mDisplay != EGL_NO_DISPLAY)
- {
- eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- eglTerminate(mDisplay);
- mDisplay = EGL_NO_DISPLAY;
- }
}
bool EGLWindow::isGLInitialized() const
diff --git a/chromium/third_party/angle/util/EGLWindow.h b/chromium/third_party/angle/util/EGLWindow.h
index 55de6eba091..47beac9e58f 100644
--- a/chromium/third_party/angle/util/EGLWindow.h
+++ b/chromium/third_party/angle/util/EGLWindow.h
@@ -26,46 +26,81 @@ class Library;
struct PlatformMethods;
} // namespace angle
+struct ANGLE_UTIL_EXPORT ConfigParameters
+{
+ ConfigParameters();
+ ~ConfigParameters();
+
+ void reset();
+
+ static bool CanShareDisplay(const ConfigParameters &a, const ConfigParameters &b);
+
+ // Display parameters.
+ Optional<bool> debugLayersEnabled;
+ Optional<bool> contextVirtualization;
+ angle::PlatformMethods *platformMethods;
+
+ // Surface and Context parameters.
+ int redBits;
+ int greenBits;
+ int blueBits;
+ int alphaBits;
+ int depthBits;
+ int stencilBits;
+ int swapInterval;
+
+ Optional<bool> webGLCompatibility;
+ Optional<bool> robustResourceInit;
+
+ // EGLWindow-specific.
+ EGLenum componentType;
+ bool multisample;
+ bool debug;
+ bool noError;
+ Optional<bool> extensionsEnabled;
+ bool bindGeneratesResource;
+ bool clientArraysEnabled;
+ bool robustAccess;
+ EGLint samples;
+ Optional<bool> contextProgramCacheEnabled;
+ EGLenum resetStrategy;
+};
+
class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable
{
public:
static void Delete(GLWindowBase **window);
// It should also be possible to set multisample and floating point framebuffers.
- void setConfigRedBits(int bits) { mRedBits = bits; }
- void setConfigGreenBits(int bits) { mGreenBits = bits; }
- void setConfigBlueBits(int bits) { mBlueBits = bits; }
- void setConfigAlphaBits(int bits) { mAlphaBits = bits; }
- void setConfigDepthBits(int bits) { mDepthBits = bits; }
- void setConfigStencilBits(int bits) { mStencilBits = bits; }
- void setSwapInterval(int swapInterval) { mSwapInterval = swapInterval; }
-
- int getConfigRedBits() const { return mRedBits; }
- int getConfigGreenBits() const { return mGreenBits; }
- int getConfigBlueBits() const { return mBlueBits; }
- int getConfigAlphaBits() const { return mAlphaBits; }
- int getConfigDepthBits() const { return mDepthBits; }
- int getConfigStencilBits() const { return mStencilBits; }
- int getSwapInterval() const { return mSwapInterval; }
- void setPlatformMethods(angle::PlatformMethods *platformMethods)
- {
- mPlatformMethods = platformMethods;
- }
- void setWebGLCompatibilityEnabled(bool webglCompatibility)
- {
- mWebGLCompatibility = webglCompatibility;
- }
- void setRobustResourceInit(bool enabled) { mRobustResourceInit = enabled; }
-
EGLint getClientMajorVersion() const { return mClientMajorVersion; }
EGLint getClientMinorVersion() const { return mClientMinorVersion; }
- virtual bool initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary) = 0;
- virtual bool isGLInitialized() const = 0;
- virtual void swap() = 0;
- virtual void destroyGL() = 0;
- virtual void makeCurrent() = 0;
- virtual bool hasError() const = 0;
+ virtual bool initializeGL(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &config) = 0;
+ virtual bool isGLInitialized() const = 0;
+ virtual void swap() = 0;
+ virtual void destroyGL() = 0;
+ virtual void makeCurrent() = 0;
+ virtual bool hasError() const = 0;
+
+ int getConfigRedBits() const { return mConfigParams.redBits; }
+ int getConfigGreenBits() const { return mConfigParams.greenBits; }
+ int getConfigBlueBits() const { return mConfigParams.blueBits; }
+ int getConfigAlphaBits() const { return mConfigParams.alphaBits; }
+ int getConfigDepthBits() const { return mConfigParams.depthBits; }
+ int getConfigStencilBits() const { return mConfigParams.stencilBits; }
+ int getSwapInterval() const { return mConfigParams.swapInterval; }
+
+ bool isMultisample() const { return mConfigParams.multisample; }
+ bool isDebugEnabled() const { return mConfigParams.debug; }
+
+ const angle::PlatformMethods *getPlatformMethods() const
+ {
+ return mConfigParams.platformMethods;
+ }
+
+ const ConfigParameters &getConfigParams() const { return mConfigParams; }
protected:
GLWindowBase(EGLint glesMajorVersion, EGLint glesMinorVersion);
@@ -73,17 +108,7 @@ class ANGLE_UTIL_EXPORT GLWindowBase : angle::NonCopyable
EGLint mClientMajorVersion;
EGLint mClientMinorVersion;
- int mRedBits;
- int mGreenBits;
- int mBlueBits;
- int mAlphaBits;
- int mDepthBits;
- int mStencilBits;
- int mSwapInterval;
-
- angle::PlatformMethods *mPlatformMethods;
- Optional<bool> mWebGLCompatibility;
- Optional<bool> mRobustResourceInit;
+ ConfigParameters mConfigParams;
};
class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
@@ -94,22 +119,6 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
const EGLPlatformParameters &platform);
static void Delete(EGLWindow **window);
- void setConfigComponentType(EGLenum componentType) { mComponentType = componentType; }
- void setMultisample(bool multisample) { mMultisample = multisample; }
- void setSamples(EGLint samples) { mSamples = samples; }
- void setDebugEnabled(bool debug) { mDebug = debug; }
- void setNoErrorEnabled(bool noError) { mNoError = noError; }
- void setExtensionsEnabled(bool extensionsEnabled) { mExtensionsEnabled = extensionsEnabled; }
- void setBindGeneratesResource(bool bindGeneratesResource)
- {
- mBindGeneratesResource = bindGeneratesResource;
- }
- void setDebugLayersEnabled(bool enabled) { mDebugLayersEnabled = enabled; }
- void setClientArraysEnabled(bool enabled) { mClientArraysEnabled = enabled; }
- void setRobustAccess(bool enabled) { mRobustAccess = enabled; }
- void setContextProgramCacheEnabled(bool enabled) { mContextProgramCacheEnabled = enabled; }
- void setContextVirtualization(bool enabled) { mContextVirtualization = enabled; }
-
static EGLBoolean FindEGLConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *config);
void swap() override;
@@ -119,15 +128,21 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
EGLDisplay getDisplay() const;
EGLSurface getSurface() const;
EGLContext getContext() const;
- bool isMultisample() const { return mMultisample; }
- bool isDebugEnabled() const { return mDebug; }
- const angle::PlatformMethods *getPlatformMethods() const { return mPlatformMethods; }
// Internally initializes the Display, Surface and Context.
- bool initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary) override;
+ bool initializeGL(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params) override;
- // Only initializes the Display and Surface.
- bool initializeDisplayAndSurface(OSWindow *osWindow, angle::Library *glWindowingLibrary);
+ // Only initializes the Display.
+ bool initializeDisplay(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params);
+
+ // Only initializes the Surface.
+ bool initializeSurface(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params);
// Create an EGL context with this window's configuration
EGLContext createContext(EGLContext share) const;
@@ -136,10 +151,14 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
bool initializeContext();
void destroyGL() override;
+ void destroySurface();
+ void destroyContext();
bool isGLInitialized() const override;
void makeCurrent() override;
bool hasError() const override;
+ bool isDisplayInitialized() const { return mDisplay != EGL_NO_DISPLAY; }
+
static bool ClientExtensionEnabled(const std::string &extName);
private:
@@ -157,18 +176,6 @@ class ANGLE_UTIL_EXPORT EGLWindow : public GLWindowBase
EGLint mEGLMajorVersion;
EGLint mEGLMinorVersion;
EGLPlatformParameters mPlatform;
- EGLenum mComponentType;
- bool mMultisample;
- bool mDebug;
- bool mNoError;
- Optional<bool> mExtensionsEnabled;
- bool mBindGeneratesResource;
- bool mClientArraysEnabled;
- bool mRobustAccess;
- EGLint mSamples;
- Optional<bool> mDebugLayersEnabled;
- Optional<bool> mContextProgramCacheEnabled;
- Optional<bool> mContextVirtualization;
};
ANGLE_UTIL_EXPORT bool CheckExtensionExists(const char *allExtensions, const std::string &extName);
diff --git a/chromium/third_party/angle/util/fuchsia/ScenicWindow.cpp b/chromium/third_party/angle/util/fuchsia/ScenicWindow.cpp
index 38319952262..0e593e28b1a 100644
--- a/chromium/third_party/angle/util/fuchsia/ScenicWindow.cpp
+++ b/chromium/third_party/angle/util/fuchsia/ScenicWindow.cpp
@@ -10,9 +10,10 @@
#include "util/fuchsia/ScenicWindow.h"
#include <lib/async-loop/cpp/loop.h>
-#include <lib/fdio/util.h>
+#include <lib/fdio/directory.h>
#include <lib/fidl/cpp/interface_ptr.h>
#include <lib/fidl/cpp/interface_request.h>
+#include <lib/ui/scenic/cpp/view_token_pair.h>
#include <lib/zx/channel.h>
#include <zircon/status.h>
@@ -76,17 +77,17 @@ bool ScenicWindow::initialize(const std::string &name, size_t width, size_t heig
mShape.SetShape(scenic::Rectangle(&mScenicSession, width, height));
mShape.SetMaterial(mMaterial);
+ fuchsia::ui::views::ViewToken viewToken;
+ fuchsia::ui::views::ViewHolderToken viewHolderToken;
+ std::tie(viewToken, viewHolderToken) = scenic::NewViewTokenPair();
+
// Create view.
- zx::eventpair viewHolderToken;
- zx::eventpair viewToken;
- zx_status_t status = zx::eventpair::create(0 /* options */, &viewToken, &viewHolderToken);
- ASSERT(status == ZX_OK);
mView = std::make_unique<scenic::View>(&mScenicSession, std::move(viewToken), name);
mView->AddChild(mShape);
mScenicSession.Present(0, [](fuchsia::images::PresentationInfo info) {});
// Present view.
- mPresenter->Present2(std::move(viewHolderToken), nullptr);
+ mPresenter->PresentView(std::move(viewHolderToken), nullptr);
mWidth = width;
mHeight = height;
diff --git a/chromium/third_party/angle/util/gles_loader_autogen.cpp b/chromium/third_party/angle/util/gles_loader_autogen.cpp
index 8a892cf8308..6f7094a0951 100644
--- a/chromium/third_party/angle/util/gles_loader_autogen.cpp
+++ b/chromium/third_party/angle/util/gles_loader_autogen.cpp
@@ -423,10 +423,6 @@ ANGLE_UTIL_EXPORT PFNGLMULTIDRAWARRAYSANGLEPROC glMultiDrawArraysANGLE;
ANGLE_UTIL_EXPORT PFNGLMULTIDRAWARRAYSINSTANCEDANGLEPROC glMultiDrawArraysInstancedANGLE;
ANGLE_UTIL_EXPORT PFNGLMULTIDRAWELEMENTSANGLEPROC glMultiDrawElementsANGLE;
ANGLE_UTIL_EXPORT PFNGLMULTIDRAWELEMENTSINSTANCEDANGLEPROC glMultiDrawElementsInstancedANGLE;
-ANGLE_UTIL_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLEPROC
- glFramebufferTextureMultiviewLayeredANGLE;
-ANGLE_UTIL_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLEPROC
- glFramebufferTextureMultiviewSideBySideANGLE;
ANGLE_UTIL_EXPORT PFNGLPROVOKINGVERTEXANGLEPROC glProvokingVertexANGLE;
ANGLE_UTIL_EXPORT PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE;
ANGLE_UTIL_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLEPROC glCompressedTexImage2DRobustANGLE;
@@ -509,6 +505,7 @@ ANGLE_UTIL_EXPORT PFNGLCOPYTEXTURECHROMIUMPROC glCopyTextureCHROMIUM;
ANGLE_UTIL_EXPORT PFNGLCOVERAGEMODULATIONCHROMIUMPROC glCoverageModulationCHROMIUM;
ANGLE_UTIL_EXPORT PFNGLMATRIXLOADIDENTITYCHROMIUMPROC glMatrixLoadIdentityCHROMIUM;
ANGLE_UTIL_EXPORT PFNGLMATRIXLOADFCHROMIUMPROC glMatrixLoadfCHROMIUM;
+ANGLE_UTIL_EXPORT PFNGLLOSECONTEXTCHROMIUMPROC glLoseContextCHROMIUM;
ANGLE_UTIL_EXPORT PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMPROC glBindFragmentInputLocationCHROMIUM;
ANGLE_UTIL_EXPORT PFNGLCOVERFILLPATHCHROMIUMPROC glCoverFillPathCHROMIUM;
ANGLE_UTIL_EXPORT PFNGLCOVERFILLPATHINSTANCEDCHROMIUMPROC glCoverFillPathInstancedCHROMIUM;
@@ -561,10 +558,31 @@ ANGLE_UTIL_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstancedEXT;
ANGLE_UTIL_EXPORT PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisorEXT;
ANGLE_UTIL_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC glFlushMappedBufferRangeEXT;
ANGLE_UTIL_EXPORT PFNGLMAPBUFFERRANGEEXTPROC glMapBufferRangeEXT;
+ANGLE_UTIL_EXPORT PFNGLBUFFERSTORAGEMEMEXTPROC glBufferStorageMemEXT;
+ANGLE_UTIL_EXPORT PFNGLCREATEMEMORYOBJECTSEXTPROC glCreateMemoryObjectsEXT;
+ANGLE_UTIL_EXPORT PFNGLDELETEMEMORYOBJECTSEXTPROC glDeleteMemoryObjectsEXT;
+ANGLE_UTIL_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC glGetMemoryObjectParameterivEXT;
+ANGLE_UTIL_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTPROC glGetUnsignedBytei_vEXT;
+ANGLE_UTIL_EXPORT PFNGLGETUNSIGNEDBYTEVEXTPROC glGetUnsignedBytevEXT;
+ANGLE_UTIL_EXPORT PFNGLISMEMORYOBJECTEXTPROC glIsMemoryObjectEXT;
+ANGLE_UTIL_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTPROC glMemoryObjectParameterivEXT;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM2DEXTPROC glTexStorageMem2DEXT;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC glTexStorageMem2DMultisampleEXT;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM3DEXTPROC glTexStorageMem3DEXT;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC glTexStorageMem3DMultisampleEXT;
+ANGLE_UTIL_EXPORT PFNGLIMPORTMEMORYFDEXTPROC glImportMemoryFdEXT;
ANGLE_UTIL_EXPORT PFNGLGETGRAPHICSRESETSTATUSEXTPROC glGetGraphicsResetStatusEXT;
ANGLE_UTIL_EXPORT PFNGLGETNUNIFORMFVEXTPROC glGetnUniformfvEXT;
ANGLE_UTIL_EXPORT PFNGLGETNUNIFORMIVEXTPROC glGetnUniformivEXT;
ANGLE_UTIL_EXPORT PFNGLREADNPIXELSEXTPROC glReadnPixelsEXT;
+ANGLE_UTIL_EXPORT PFNGLDELETESEMAPHORESEXTPROC glDeleteSemaphoresEXT;
+ANGLE_UTIL_EXPORT PFNGLGENSEMAPHORESEXTPROC glGenSemaphoresEXT;
+ANGLE_UTIL_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC glGetSemaphoreParameterui64vEXT;
+ANGLE_UTIL_EXPORT PFNGLISSEMAPHOREEXTPROC glIsSemaphoreEXT;
+ANGLE_UTIL_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTPROC glSemaphoreParameterui64vEXT;
+ANGLE_UTIL_EXPORT PFNGLSIGNALSEMAPHOREEXTPROC glSignalSemaphoreEXT;
+ANGLE_UTIL_EXPORT PFNGLWAITSEMAPHOREEXTPROC glWaitSemaphoreEXT;
+ANGLE_UTIL_EXPORT PFNGLIMPORTSEMAPHOREFDEXTPROC glImportSemaphoreFdEXT;
ANGLE_UTIL_EXPORT PFNGLTEXSTORAGE1DEXTPROC glTexStorage1DEXT;
ANGLE_UTIL_EXPORT PFNGLTEXSTORAGE2DEXTPROC glTexStorage2DEXT;
ANGLE_UTIL_EXPORT PFNGLTEXSTORAGE3DEXTPROC glTexStorage3DEXT;
@@ -608,6 +626,7 @@ ANGLE_UTIL_EXPORT PFNGLBINDVERTEXARRAYOESPROC glBindVertexArrayOES;
ANGLE_UTIL_EXPORT PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOES;
ANGLE_UTIL_EXPORT PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOES;
ANGLE_UTIL_EXPORT PFNGLISVERTEXARRAYOESPROC glIsVertexArrayOES;
+ANGLE_UTIL_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR;
ANGLE_UTIL_EXPORT PFNGLDRAWTEXFOESPROC glDrawTexfOES;
ANGLE_UTIL_EXPORT PFNGLDRAWTEXFVOESPROC glDrawTexfvOES;
ANGLE_UTIL_EXPORT PFNGLDRAWTEXIOESPROC glDrawTexiOES;
@@ -1098,10 +1117,6 @@ ANGLE_UTIL_EXPORT PFNGLMULTIDRAWARRAYSINSTANCEDANGLECONTEXTANGLEPROC
ANGLE_UTIL_EXPORT PFNGLMULTIDRAWELEMENTSANGLECONTEXTANGLEPROC glMultiDrawElementsANGLEContextANGLE;
ANGLE_UTIL_EXPORT PFNGLMULTIDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC
glMultiDrawElementsInstancedANGLEContextANGLE;
-ANGLE_UTIL_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLECONTEXTANGLEPROC
- glFramebufferTextureMultiviewLayeredANGLEContextANGLE;
-ANGLE_UTIL_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLECONTEXTANGLEPROC
- glFramebufferTextureMultiviewSideBySideANGLEContextANGLE;
ANGLE_UTIL_EXPORT PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC glProvokingVertexANGLEContextANGLE;
ANGLE_UTIL_EXPORT PFNGLREQUESTEXTENSIONANGLECONTEXTANGLEPROC glRequestExtensionANGLEContextANGLE;
ANGLE_UTIL_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLECONTEXTANGLEPROC
@@ -1244,6 +1259,7 @@ ANGLE_UTIL_EXPORT PFNGLCOVERAGEMODULATIONCHROMIUMCONTEXTANGLEPROC
ANGLE_UTIL_EXPORT PFNGLMATRIXLOADIDENTITYCHROMIUMCONTEXTANGLEPROC
glMatrixLoadIdentityCHROMIUMContextANGLE;
ANGLE_UTIL_EXPORT PFNGLMATRIXLOADFCHROMIUMCONTEXTANGLEPROC glMatrixLoadfCHROMIUMContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLLOSECONTEXTCHROMIUMCONTEXTANGLEPROC glLoseContextCHROMIUMContextANGLE;
ANGLE_UTIL_EXPORT PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMCONTEXTANGLEPROC
glBindFragmentInputLocationCHROMIUMContextANGLE;
ANGLE_UTIL_EXPORT PFNGLCOVERFILLPATHCHROMIUMCONTEXTANGLEPROC glCoverFillPathCHROMIUMContextANGLE;
@@ -1314,11 +1330,38 @@ ANGLE_UTIL_EXPORT PFNGLVERTEXATTRIBDIVISOREXTCONTEXTANGLEPROC glVertexAttribDivi
ANGLE_UTIL_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEEXTCONTEXTANGLEPROC
glFlushMappedBufferRangeEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLMAPBUFFERRANGEEXTCONTEXTANGLEPROC glMapBufferRangeEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLBUFFERSTORAGEMEMEXTCONTEXTANGLEPROC glBufferStorageMemEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLCREATEMEMORYOBJECTSEXTCONTEXTANGLEPROC glCreateMemoryObjectsEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLDELETEMEMORYOBJECTSEXTCONTEXTANGLEPROC glDeleteMemoryObjectsEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC
+ glGetMemoryObjectParameterivEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETUNSIGNEDBYTEI_VEXTCONTEXTANGLEPROC glGetUnsignedBytei_vEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETUNSIGNEDBYTEVEXTCONTEXTANGLEPROC glGetUnsignedBytevEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLISMEMORYOBJECTEXTCONTEXTANGLEPROC glIsMemoryObjectEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC
+ glMemoryObjectParameterivEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM2DEXTCONTEXTANGLEPROC glTexStorageMem2DEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTCONTEXTANGLEPROC
+ glTexStorageMem2DMultisampleEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM3DEXTCONTEXTANGLEPROC glTexStorageMem3DEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTCONTEXTANGLEPROC
+ glTexStorageMem3DMultisampleEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLIMPORTMEMORYFDEXTCONTEXTANGLEPROC glImportMemoryFdEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLGETGRAPHICSRESETSTATUSEXTCONTEXTANGLEPROC
glGetGraphicsResetStatusEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLGETNUNIFORMFVEXTCONTEXTANGLEPROC glGetnUniformfvEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLGETNUNIFORMIVEXTCONTEXTANGLEPROC glGetnUniformivEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLREADNPIXELSEXTCONTEXTANGLEPROC glReadnPixelsEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLDELETESEMAPHORESEXTCONTEXTANGLEPROC glDeleteSemaphoresEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGENSEMAPHORESEXTCONTEXTANGLEPROC glGenSemaphoresEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLGETSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC
+ glGetSemaphoreParameterui64vEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLISSEMAPHOREEXTCONTEXTANGLEPROC glIsSemaphoreEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC
+ glSemaphoreParameterui64vEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLSIGNALSEMAPHOREEXTCONTEXTANGLEPROC glSignalSemaphoreEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLWAITSEMAPHOREEXTCONTEXTANGLEPROC glWaitSemaphoreEXTContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLIMPORTSEMAPHOREFDEXTCONTEXTANGLEPROC glImportSemaphoreFdEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLTEXSTORAGE1DEXTCONTEXTANGLEPROC glTexStorage1DEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLTEXSTORAGE2DEXTCONTEXTANGLEPROC glTexStorage2DEXTContextANGLE;
ANGLE_UTIL_EXPORT PFNGLTEXSTORAGE3DEXTCONTEXTANGLEPROC glTexStorage3DEXTContextANGLE;
@@ -1369,6 +1412,8 @@ ANGLE_UTIL_EXPORT PFNGLBINDVERTEXARRAYOESCONTEXTANGLEPROC glBindVertexArrayOESCo
ANGLE_UTIL_EXPORT PFNGLDELETEVERTEXARRAYSOESCONTEXTANGLEPROC glDeleteVertexArraysOESContextANGLE;
ANGLE_UTIL_EXPORT PFNGLGENVERTEXARRAYSOESCONTEXTANGLEPROC glGenVertexArraysOESContextANGLE;
ANGLE_UTIL_EXPORT PFNGLISVERTEXARRAYOESCONTEXTANGLEPROC glIsVertexArrayOESContextANGLE;
+ANGLE_UTIL_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRCONTEXTANGLEPROC
+ glFramebufferTextureMultiviewOVRContextANGLE;
ANGLE_UTIL_EXPORT PFNGLDRAWTEXFOESCONTEXTANGLEPROC glDrawTexfOESContextANGLE;
ANGLE_UTIL_EXPORT PFNGLDRAWTEXFVOESCONTEXTANGLEPROC glDrawTexfvOESContextANGLE;
ANGLE_UTIL_EXPORT PFNGLDRAWTEXIOESCONTEXTANGLEPROC glDrawTexiOESContextANGLE;
@@ -2007,12 +2052,6 @@ void LoadGLES(LoadProc loadProc)
reinterpret_cast<PFNGLMULTIDRAWELEMENTSANGLEPROC>(loadProc("glMultiDrawElementsANGLE"));
glMultiDrawElementsInstancedANGLE = reinterpret_cast<PFNGLMULTIDRAWELEMENTSINSTANCEDANGLEPROC>(
loadProc("glMultiDrawElementsInstancedANGLE"));
- glFramebufferTextureMultiviewLayeredANGLE =
- reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLEPROC>(
- loadProc("glFramebufferTextureMultiviewLayeredANGLE"));
- glFramebufferTextureMultiviewSideBySideANGLE =
- reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLEPROC>(
- loadProc("glFramebufferTextureMultiviewSideBySideANGLE"));
glProvokingVertexANGLE =
reinterpret_cast<PFNGLPROVOKINGVERTEXANGLEPROC>(loadProc("glProvokingVertexANGLE"));
glRequestExtensionANGLE =
@@ -2187,6 +2226,8 @@ void LoadGLES(LoadProc loadProc)
loadProc("glMatrixLoadIdentityCHROMIUM"));
glMatrixLoadfCHROMIUM =
reinterpret_cast<PFNGLMATRIXLOADFCHROMIUMPROC>(loadProc("glMatrixLoadfCHROMIUM"));
+ glLoseContextCHROMIUM =
+ reinterpret_cast<PFNGLLOSECONTEXTCHROMIUMPROC>(loadProc("glLoseContextCHROMIUM"));
glBindFragmentInputLocationCHROMIUM =
reinterpret_cast<PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMPROC>(
loadProc("glBindFragmentInputLocationCHROMIUM"));
@@ -2287,13 +2328,54 @@ void LoadGLES(LoadProc loadProc)
loadProc("glFlushMappedBufferRangeEXT"));
glMapBufferRangeEXT =
reinterpret_cast<PFNGLMAPBUFFERRANGEEXTPROC>(loadProc("glMapBufferRangeEXT"));
+ glBufferStorageMemEXT =
+ reinterpret_cast<PFNGLBUFFERSTORAGEMEMEXTPROC>(loadProc("glBufferStorageMemEXT"));
+ glCreateMemoryObjectsEXT =
+ reinterpret_cast<PFNGLCREATEMEMORYOBJECTSEXTPROC>(loadProc("glCreateMemoryObjectsEXT"));
+ glDeleteMemoryObjectsEXT =
+ reinterpret_cast<PFNGLDELETEMEMORYOBJECTSEXTPROC>(loadProc("glDeleteMemoryObjectsEXT"));
+ glGetMemoryObjectParameterivEXT = reinterpret_cast<PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC>(
+ loadProc("glGetMemoryObjectParameterivEXT"));
+ glGetUnsignedBytei_vEXT =
+ reinterpret_cast<PFNGLGETUNSIGNEDBYTEI_VEXTPROC>(loadProc("glGetUnsignedBytei_vEXT"));
+ glGetUnsignedBytevEXT =
+ reinterpret_cast<PFNGLGETUNSIGNEDBYTEVEXTPROC>(loadProc("glGetUnsignedBytevEXT"));
+ glIsMemoryObjectEXT =
+ reinterpret_cast<PFNGLISMEMORYOBJECTEXTPROC>(loadProc("glIsMemoryObjectEXT"));
+ glMemoryObjectParameterivEXT = reinterpret_cast<PFNGLMEMORYOBJECTPARAMETERIVEXTPROC>(
+ loadProc("glMemoryObjectParameterivEXT"));
+ glTexStorageMem2DEXT =
+ reinterpret_cast<PFNGLTEXSTORAGEMEM2DEXTPROC>(loadProc("glTexStorageMem2DEXT"));
+ glTexStorageMem2DMultisampleEXT = reinterpret_cast<PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC>(
+ loadProc("glTexStorageMem2DMultisampleEXT"));
+ glTexStorageMem3DEXT =
+ reinterpret_cast<PFNGLTEXSTORAGEMEM3DEXTPROC>(loadProc("glTexStorageMem3DEXT"));
+ glTexStorageMem3DMultisampleEXT = reinterpret_cast<PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC>(
+ loadProc("glTexStorageMem3DMultisampleEXT"));
+ glImportMemoryFdEXT =
+ reinterpret_cast<PFNGLIMPORTMEMORYFDEXTPROC>(loadProc("glImportMemoryFdEXT"));
glGetGraphicsResetStatusEXT = reinterpret_cast<PFNGLGETGRAPHICSRESETSTATUSEXTPROC>(
loadProc("glGetGraphicsResetStatusEXT"));
glGetnUniformfvEXT =
reinterpret_cast<PFNGLGETNUNIFORMFVEXTPROC>(loadProc("glGetnUniformfvEXT"));
glGetnUniformivEXT =
reinterpret_cast<PFNGLGETNUNIFORMIVEXTPROC>(loadProc("glGetnUniformivEXT"));
- glReadnPixelsEXT = reinterpret_cast<PFNGLREADNPIXELSEXTPROC>(loadProc("glReadnPixelsEXT"));
+ glReadnPixelsEXT = reinterpret_cast<PFNGLREADNPIXELSEXTPROC>(loadProc("glReadnPixelsEXT"));
+ glDeleteSemaphoresEXT =
+ reinterpret_cast<PFNGLDELETESEMAPHORESEXTPROC>(loadProc("glDeleteSemaphoresEXT"));
+ glGenSemaphoresEXT =
+ reinterpret_cast<PFNGLGENSEMAPHORESEXTPROC>(loadProc("glGenSemaphoresEXT"));
+ glGetSemaphoreParameterui64vEXT = reinterpret_cast<PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC>(
+ loadProc("glGetSemaphoreParameterui64vEXT"));
+ glIsSemaphoreEXT = reinterpret_cast<PFNGLISSEMAPHOREEXTPROC>(loadProc("glIsSemaphoreEXT"));
+ glSemaphoreParameterui64vEXT = reinterpret_cast<PFNGLSEMAPHOREPARAMETERUI64VEXTPROC>(
+ loadProc("glSemaphoreParameterui64vEXT"));
+ glSignalSemaphoreEXT =
+ reinterpret_cast<PFNGLSIGNALSEMAPHOREEXTPROC>(loadProc("glSignalSemaphoreEXT"));
+ glWaitSemaphoreEXT =
+ reinterpret_cast<PFNGLWAITSEMAPHOREEXTPROC>(loadProc("glWaitSemaphoreEXT"));
+ glImportSemaphoreFdEXT =
+ reinterpret_cast<PFNGLIMPORTSEMAPHOREFDEXTPROC>(loadProc("glImportSemaphoreFdEXT"));
glTexStorage1DEXT = reinterpret_cast<PFNGLTEXSTORAGE1DEXTPROC>(loadProc("glTexStorage1DEXT"));
glTexStorage2DEXT = reinterpret_cast<PFNGLTEXSTORAGE2DEXTPROC>(loadProc("glTexStorage2DEXT"));
glTexStorage3DEXT = reinterpret_cast<PFNGLTEXSTORAGE3DEXTPROC>(loadProc("glTexStorage3DEXT"));
@@ -2365,6 +2447,8 @@ void LoadGLES(LoadProc loadProc)
reinterpret_cast<PFNGLGENVERTEXARRAYSOESPROC>(loadProc("glGenVertexArraysOES"));
glIsVertexArrayOES =
reinterpret_cast<PFNGLISVERTEXARRAYOESPROC>(loadProc("glIsVertexArrayOES"));
+ glFramebufferTextureMultiviewOVR = reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC>(
+ loadProc("glFramebufferTextureMultiviewOVR"));
glDrawTexfOES = reinterpret_cast<PFNGLDRAWTEXFOESPROC>(loadProc("glDrawTexfOES"));
glDrawTexfvOES = reinterpret_cast<PFNGLDRAWTEXFVOESPROC>(loadProc("glDrawTexfvOES"));
glDrawTexiOES = reinterpret_cast<PFNGLDRAWTEXIOESPROC>(loadProc("glDrawTexiOES"));
@@ -3323,12 +3407,6 @@ void LoadGLES(LoadProc loadProc)
glMultiDrawElementsInstancedANGLEContextANGLE =
reinterpret_cast<PFNGLMULTIDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC>(
loadProc("glMultiDrawElementsInstancedANGLEContextANGLE"));
- glFramebufferTextureMultiviewLayeredANGLEContextANGLE =
- reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLECONTEXTANGLEPROC>(
- loadProc("glFramebufferTextureMultiviewLayeredANGLEContextANGLE"));
- glFramebufferTextureMultiviewSideBySideANGLEContextANGLE =
- reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLECONTEXTANGLEPROC>(
- loadProc("glFramebufferTextureMultiviewSideBySideANGLEContextANGLE"));
glProvokingVertexANGLEContextANGLE =
reinterpret_cast<PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC>(
loadProc("glProvokingVertexANGLEContextANGLE"));
@@ -3563,6 +3641,8 @@ void LoadGLES(LoadProc loadProc)
loadProc("glMatrixLoadIdentityCHROMIUMContextANGLE"));
glMatrixLoadfCHROMIUMContextANGLE = reinterpret_cast<PFNGLMATRIXLOADFCHROMIUMCONTEXTANGLEPROC>(
loadProc("glMatrixLoadfCHROMIUMContextANGLE"));
+ glLoseContextCHROMIUMContextANGLE = reinterpret_cast<PFNGLLOSECONTEXTCHROMIUMCONTEXTANGLEPROC>(
+ loadProc("glLoseContextCHROMIUMContextANGLE"));
glBindFragmentInputLocationCHROMIUMContextANGLE =
reinterpret_cast<PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMCONTEXTANGLEPROC>(
loadProc("glBindFragmentInputLocationCHROMIUMContextANGLE"));
@@ -3694,6 +3774,39 @@ void LoadGLES(LoadProc loadProc)
loadProc("glFlushMappedBufferRangeEXTContextANGLE"));
glMapBufferRangeEXTContextANGLE = reinterpret_cast<PFNGLMAPBUFFERRANGEEXTCONTEXTANGLEPROC>(
loadProc("glMapBufferRangeEXTContextANGLE"));
+ glBufferStorageMemEXTContextANGLE = reinterpret_cast<PFNGLBUFFERSTORAGEMEMEXTCONTEXTANGLEPROC>(
+ loadProc("glBufferStorageMemEXTContextANGLE"));
+ glCreateMemoryObjectsEXTContextANGLE =
+ reinterpret_cast<PFNGLCREATEMEMORYOBJECTSEXTCONTEXTANGLEPROC>(
+ loadProc("glCreateMemoryObjectsEXTContextANGLE"));
+ glDeleteMemoryObjectsEXTContextANGLE =
+ reinterpret_cast<PFNGLDELETEMEMORYOBJECTSEXTCONTEXTANGLEPROC>(
+ loadProc("glDeleteMemoryObjectsEXTContextANGLE"));
+ glGetMemoryObjectParameterivEXTContextANGLE =
+ reinterpret_cast<PFNGLGETMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC>(
+ loadProc("glGetMemoryObjectParameterivEXTContextANGLE"));
+ glGetUnsignedBytei_vEXTContextANGLE =
+ reinterpret_cast<PFNGLGETUNSIGNEDBYTEI_VEXTCONTEXTANGLEPROC>(
+ loadProc("glGetUnsignedBytei_vEXTContextANGLE"));
+ glGetUnsignedBytevEXTContextANGLE = reinterpret_cast<PFNGLGETUNSIGNEDBYTEVEXTCONTEXTANGLEPROC>(
+ loadProc("glGetUnsignedBytevEXTContextANGLE"));
+ glIsMemoryObjectEXTContextANGLE = reinterpret_cast<PFNGLISMEMORYOBJECTEXTCONTEXTANGLEPROC>(
+ loadProc("glIsMemoryObjectEXTContextANGLE"));
+ glMemoryObjectParameterivEXTContextANGLE =
+ reinterpret_cast<PFNGLMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC>(
+ loadProc("glMemoryObjectParameterivEXTContextANGLE"));
+ glTexStorageMem2DEXTContextANGLE = reinterpret_cast<PFNGLTEXSTORAGEMEM2DEXTCONTEXTANGLEPROC>(
+ loadProc("glTexStorageMem2DEXTContextANGLE"));
+ glTexStorageMem2DMultisampleEXTContextANGLE =
+ reinterpret_cast<PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTCONTEXTANGLEPROC>(
+ loadProc("glTexStorageMem2DMultisampleEXTContextANGLE"));
+ glTexStorageMem3DEXTContextANGLE = reinterpret_cast<PFNGLTEXSTORAGEMEM3DEXTCONTEXTANGLEPROC>(
+ loadProc("glTexStorageMem3DEXTContextANGLE"));
+ glTexStorageMem3DMultisampleEXTContextANGLE =
+ reinterpret_cast<PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTCONTEXTANGLEPROC>(
+ loadProc("glTexStorageMem3DMultisampleEXTContextANGLE"));
+ glImportMemoryFdEXTContextANGLE = reinterpret_cast<PFNGLIMPORTMEMORYFDEXTCONTEXTANGLEPROC>(
+ loadProc("glImportMemoryFdEXTContextANGLE"));
glGetGraphicsResetStatusEXTContextANGLE =
reinterpret_cast<PFNGLGETGRAPHICSRESETSTATUSEXTCONTEXTANGLEPROC>(
loadProc("glGetGraphicsResetStatusEXTContextANGLE"));
@@ -3703,6 +3816,25 @@ void LoadGLES(LoadProc loadProc)
loadProc("glGetnUniformivEXTContextANGLE"));
glReadnPixelsEXTContextANGLE = reinterpret_cast<PFNGLREADNPIXELSEXTCONTEXTANGLEPROC>(
loadProc("glReadnPixelsEXTContextANGLE"));
+ glDeleteSemaphoresEXTContextANGLE = reinterpret_cast<PFNGLDELETESEMAPHORESEXTCONTEXTANGLEPROC>(
+ loadProc("glDeleteSemaphoresEXTContextANGLE"));
+ glGenSemaphoresEXTContextANGLE = reinterpret_cast<PFNGLGENSEMAPHORESEXTCONTEXTANGLEPROC>(
+ loadProc("glGenSemaphoresEXTContextANGLE"));
+ glGetSemaphoreParameterui64vEXTContextANGLE =
+ reinterpret_cast<PFNGLGETSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC>(
+ loadProc("glGetSemaphoreParameterui64vEXTContextANGLE"));
+ glIsSemaphoreEXTContextANGLE = reinterpret_cast<PFNGLISSEMAPHOREEXTCONTEXTANGLEPROC>(
+ loadProc("glIsSemaphoreEXTContextANGLE"));
+ glSemaphoreParameterui64vEXTContextANGLE =
+ reinterpret_cast<PFNGLSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC>(
+ loadProc("glSemaphoreParameterui64vEXTContextANGLE"));
+ glSignalSemaphoreEXTContextANGLE = reinterpret_cast<PFNGLSIGNALSEMAPHOREEXTCONTEXTANGLEPROC>(
+ loadProc("glSignalSemaphoreEXTContextANGLE"));
+ glWaitSemaphoreEXTContextANGLE = reinterpret_cast<PFNGLWAITSEMAPHOREEXTCONTEXTANGLEPROC>(
+ loadProc("glWaitSemaphoreEXTContextANGLE"));
+ glImportSemaphoreFdEXTContextANGLE =
+ reinterpret_cast<PFNGLIMPORTSEMAPHOREFDEXTCONTEXTANGLEPROC>(
+ loadProc("glImportSemaphoreFdEXTContextANGLE"));
glTexStorage1DEXTContextANGLE = reinterpret_cast<PFNGLTEXSTORAGE1DEXTCONTEXTANGLEPROC>(
loadProc("glTexStorage1DEXTContextANGLE"));
glTexStorage2DEXTContextANGLE = reinterpret_cast<PFNGLTEXSTORAGE2DEXTCONTEXTANGLEPROC>(
@@ -3804,6 +3936,9 @@ void LoadGLES(LoadProc loadProc)
loadProc("glGenVertexArraysOESContextANGLE"));
glIsVertexArrayOESContextANGLE = reinterpret_cast<PFNGLISVERTEXARRAYOESCONTEXTANGLEPROC>(
loadProc("glIsVertexArrayOESContextANGLE"));
+ glFramebufferTextureMultiviewOVRContextANGLE =
+ reinterpret_cast<PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRCONTEXTANGLEPROC>(
+ loadProc("glFramebufferTextureMultiviewOVRContextANGLE"));
glDrawTexfOESContextANGLE =
reinterpret_cast<PFNGLDRAWTEXFOESCONTEXTANGLEPROC>(loadProc("glDrawTexfOESContextANGLE"));
glDrawTexfvOESContextANGLE =
diff --git a/chromium/third_party/angle/util/gles_loader_autogen.h b/chromium/third_party/angle/util/gles_loader_autogen.h
index 388c1d76880..2a507c3f666 100644
--- a/chromium/third_party/angle/util/gles_loader_autogen.h
+++ b/chromium/third_party/angle/util/gles_loader_autogen.h
@@ -431,10 +431,6 @@ ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWARRAYSANGLEPROC glMultiDrawArraysANGLE;
ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWARRAYSINSTANCEDANGLEPROC glMultiDrawArraysInstancedANGLE;
ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWELEMENTSANGLEPROC glMultiDrawElementsANGLE;
ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWELEMENTSINSTANCEDANGLEPROC glMultiDrawElementsInstancedANGLE;
-ANGLE_UTIL_EXPORT extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLEPROC
- glFramebufferTextureMultiviewLayeredANGLE;
-ANGLE_UTIL_EXPORT extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLEPROC
- glFramebufferTextureMultiviewSideBySideANGLE;
ANGLE_UTIL_EXPORT extern PFNGLPROVOKINGVERTEXANGLEPROC glProvokingVertexANGLE;
ANGLE_UTIL_EXPORT extern PFNGLREQUESTEXTENSIONANGLEPROC glRequestExtensionANGLE;
ANGLE_UTIL_EXPORT extern PFNGLCOMPRESSEDTEXIMAGE2DROBUSTANGLEPROC glCompressedTexImage2DRobustANGLE;
@@ -530,6 +526,7 @@ ANGLE_UTIL_EXPORT extern PFNGLCOPYTEXTURECHROMIUMPROC glCopyTextureCHROMIUM;
ANGLE_UTIL_EXPORT extern PFNGLCOVERAGEMODULATIONCHROMIUMPROC glCoverageModulationCHROMIUM;
ANGLE_UTIL_EXPORT extern PFNGLMATRIXLOADIDENTITYCHROMIUMPROC glMatrixLoadIdentityCHROMIUM;
ANGLE_UTIL_EXPORT extern PFNGLMATRIXLOADFCHROMIUMPROC glMatrixLoadfCHROMIUM;
+ANGLE_UTIL_EXPORT extern PFNGLLOSECONTEXTCHROMIUMPROC glLoseContextCHROMIUM;
ANGLE_UTIL_EXPORT extern PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMPROC
glBindFragmentInputLocationCHROMIUM;
ANGLE_UTIL_EXPORT extern PFNGLCOVERFILLPATHCHROMIUMPROC glCoverFillPathCHROMIUM;
@@ -589,10 +586,31 @@ ANGLE_UTIL_EXPORT extern PFNGLDRAWELEMENTSINSTANCEDEXTPROC glDrawElementsInstanc
ANGLE_UTIL_EXPORT extern PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisorEXT;
ANGLE_UTIL_EXPORT extern PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC glFlushMappedBufferRangeEXT;
ANGLE_UTIL_EXPORT extern PFNGLMAPBUFFERRANGEEXTPROC glMapBufferRangeEXT;
+ANGLE_UTIL_EXPORT extern PFNGLBUFFERSTORAGEMEMEXTPROC glBufferStorageMemEXT;
+ANGLE_UTIL_EXPORT extern PFNGLCREATEMEMORYOBJECTSEXTPROC glCreateMemoryObjectsEXT;
+ANGLE_UTIL_EXPORT extern PFNGLDELETEMEMORYOBJECTSEXTPROC glDeleteMemoryObjectsEXT;
+ANGLE_UTIL_EXPORT extern PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC glGetMemoryObjectParameterivEXT;
+ANGLE_UTIL_EXPORT extern PFNGLGETUNSIGNEDBYTEI_VEXTPROC glGetUnsignedBytei_vEXT;
+ANGLE_UTIL_EXPORT extern PFNGLGETUNSIGNEDBYTEVEXTPROC glGetUnsignedBytevEXT;
+ANGLE_UTIL_EXPORT extern PFNGLISMEMORYOBJECTEXTPROC glIsMemoryObjectEXT;
+ANGLE_UTIL_EXPORT extern PFNGLMEMORYOBJECTPARAMETERIVEXTPROC glMemoryObjectParameterivEXT;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM2DEXTPROC glTexStorageMem2DEXT;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC glTexStorageMem2DMultisampleEXT;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM3DEXTPROC glTexStorageMem3DEXT;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC glTexStorageMem3DMultisampleEXT;
+ANGLE_UTIL_EXPORT extern PFNGLIMPORTMEMORYFDEXTPROC glImportMemoryFdEXT;
ANGLE_UTIL_EXPORT extern PFNGLGETGRAPHICSRESETSTATUSEXTPROC glGetGraphicsResetStatusEXT;
ANGLE_UTIL_EXPORT extern PFNGLGETNUNIFORMFVEXTPROC glGetnUniformfvEXT;
ANGLE_UTIL_EXPORT extern PFNGLGETNUNIFORMIVEXTPROC glGetnUniformivEXT;
ANGLE_UTIL_EXPORT extern PFNGLREADNPIXELSEXTPROC glReadnPixelsEXT;
+ANGLE_UTIL_EXPORT extern PFNGLDELETESEMAPHORESEXTPROC glDeleteSemaphoresEXT;
+ANGLE_UTIL_EXPORT extern PFNGLGENSEMAPHORESEXTPROC glGenSemaphoresEXT;
+ANGLE_UTIL_EXPORT extern PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC glGetSemaphoreParameterui64vEXT;
+ANGLE_UTIL_EXPORT extern PFNGLISSEMAPHOREEXTPROC glIsSemaphoreEXT;
+ANGLE_UTIL_EXPORT extern PFNGLSEMAPHOREPARAMETERUI64VEXTPROC glSemaphoreParameterui64vEXT;
+ANGLE_UTIL_EXPORT extern PFNGLSIGNALSEMAPHOREEXTPROC glSignalSemaphoreEXT;
+ANGLE_UTIL_EXPORT extern PFNGLWAITSEMAPHOREEXTPROC glWaitSemaphoreEXT;
+ANGLE_UTIL_EXPORT extern PFNGLIMPORTSEMAPHOREFDEXTPROC glImportSemaphoreFdEXT;
ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGE1DEXTPROC glTexStorage1DEXT;
ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGE2DEXTPROC glTexStorage2DEXT;
ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGE3DEXTPROC glTexStorage3DEXT;
@@ -636,6 +654,7 @@ ANGLE_UTIL_EXPORT extern PFNGLBINDVERTEXARRAYOESPROC glBindVertexArrayOES;
ANGLE_UTIL_EXPORT extern PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOES;
ANGLE_UTIL_EXPORT extern PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOES;
ANGLE_UTIL_EXPORT extern PFNGLISVERTEXARRAYOESPROC glIsVertexArrayOES;
+ANGLE_UTIL_EXPORT extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR;
ANGLE_UTIL_EXPORT extern PFNGLDRAWTEXFOESPROC glDrawTexfOES;
ANGLE_UTIL_EXPORT extern PFNGLDRAWTEXFVOESPROC glDrawTexfvOES;
ANGLE_UTIL_EXPORT extern PFNGLDRAWTEXIOESPROC glDrawTexiOES;
@@ -1163,10 +1182,6 @@ ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWELEMENTSANGLECONTEXTANGLEPROC
glMultiDrawElementsANGLEContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLMULTIDRAWELEMENTSINSTANCEDANGLECONTEXTANGLEPROC
glMultiDrawElementsInstancedANGLEContextANGLE;
-ANGLE_UTIL_EXPORT extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWLAYEREDANGLECONTEXTANGLEPROC
- glFramebufferTextureMultiviewLayeredANGLEContextANGLE;
-ANGLE_UTIL_EXPORT extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWSIDEBYSIDEANGLECONTEXTANGLEPROC
- glFramebufferTextureMultiviewSideBySideANGLEContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLPROVOKINGVERTEXANGLECONTEXTANGLEPROC
glProvokingVertexANGLEContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLREQUESTEXTENSIONANGLECONTEXTANGLEPROC
@@ -1322,6 +1337,7 @@ ANGLE_UTIL_EXPORT extern PFNGLCOVERAGEMODULATIONCHROMIUMCONTEXTANGLEPROC
ANGLE_UTIL_EXPORT extern PFNGLMATRIXLOADIDENTITYCHROMIUMCONTEXTANGLEPROC
glMatrixLoadIdentityCHROMIUMContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLMATRIXLOADFCHROMIUMCONTEXTANGLEPROC glMatrixLoadfCHROMIUMContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLLOSECONTEXTCHROMIUMCONTEXTANGLEPROC glLoseContextCHROMIUMContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLBINDFRAGMENTINPUTLOCATIONCHROMIUMCONTEXTANGLEPROC
glBindFragmentInputLocationCHROMIUMContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLCOVERFILLPATHCHROMIUMCONTEXTANGLEPROC
@@ -1404,11 +1420,42 @@ ANGLE_UTIL_EXPORT extern PFNGLVERTEXATTRIBDIVISOREXTCONTEXTANGLEPROC
ANGLE_UTIL_EXPORT extern PFNGLFLUSHMAPPEDBUFFERRANGEEXTCONTEXTANGLEPROC
glFlushMappedBufferRangeEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLMAPBUFFERRANGEEXTCONTEXTANGLEPROC glMapBufferRangeEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLBUFFERSTORAGEMEMEXTCONTEXTANGLEPROC glBufferStorageMemEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLCREATEMEMORYOBJECTSEXTCONTEXTANGLEPROC
+ glCreateMemoryObjectsEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLDELETEMEMORYOBJECTSEXTCONTEXTANGLEPROC
+ glDeleteMemoryObjectsEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC
+ glGetMemoryObjectParameterivEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETUNSIGNEDBYTEI_VEXTCONTEXTANGLEPROC
+ glGetUnsignedBytei_vEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETUNSIGNEDBYTEVEXTCONTEXTANGLEPROC glGetUnsignedBytevEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLISMEMORYOBJECTEXTCONTEXTANGLEPROC glIsMemoryObjectEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLMEMORYOBJECTPARAMETERIVEXTCONTEXTANGLEPROC
+ glMemoryObjectParameterivEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM2DEXTCONTEXTANGLEPROC glTexStorageMem2DEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTCONTEXTANGLEPROC
+ glTexStorageMem2DMultisampleEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM3DEXTCONTEXTANGLEPROC glTexStorageMem3DEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTCONTEXTANGLEPROC
+ glTexStorageMem3DMultisampleEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLIMPORTMEMORYFDEXTCONTEXTANGLEPROC glImportMemoryFdEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLGETGRAPHICSRESETSTATUSEXTCONTEXTANGLEPROC
glGetGraphicsResetStatusEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLGETNUNIFORMFVEXTCONTEXTANGLEPROC glGetnUniformfvEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLGETNUNIFORMIVEXTCONTEXTANGLEPROC glGetnUniformivEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLREADNPIXELSEXTCONTEXTANGLEPROC glReadnPixelsEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLDELETESEMAPHORESEXTCONTEXTANGLEPROC glDeleteSemaphoresEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGENSEMAPHORESEXTCONTEXTANGLEPROC glGenSemaphoresEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLGETSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC
+ glGetSemaphoreParameterui64vEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLISSEMAPHOREEXTCONTEXTANGLEPROC glIsSemaphoreEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLSEMAPHOREPARAMETERUI64VEXTCONTEXTANGLEPROC
+ glSemaphoreParameterui64vEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLSIGNALSEMAPHOREEXTCONTEXTANGLEPROC glSignalSemaphoreEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLWAITSEMAPHOREEXTCONTEXTANGLEPROC glWaitSemaphoreEXTContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLIMPORTSEMAPHOREFDEXTCONTEXTANGLEPROC
+ glImportSemaphoreFdEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGE1DEXTCONTEXTANGLEPROC glTexStorage1DEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGE2DEXTCONTEXTANGLEPROC glTexStorage2DEXTContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLTEXSTORAGE3DEXTCONTEXTANGLEPROC glTexStorage3DEXTContextANGLE;
@@ -1468,6 +1515,8 @@ ANGLE_UTIL_EXPORT extern PFNGLDELETEVERTEXARRAYSOESCONTEXTANGLEPROC
glDeleteVertexArraysOESContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLGENVERTEXARRAYSOESCONTEXTANGLEPROC glGenVertexArraysOESContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLISVERTEXARRAYOESCONTEXTANGLEPROC glIsVertexArrayOESContextANGLE;
+ANGLE_UTIL_EXPORT extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRCONTEXTANGLEPROC
+ glFramebufferTextureMultiviewOVRContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLDRAWTEXFOESCONTEXTANGLEPROC glDrawTexfOESContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLDRAWTEXFVOESCONTEXTANGLEPROC glDrawTexfvOESContextANGLE;
ANGLE_UTIL_EXPORT extern PFNGLDRAWTEXIOESCONTEXTANGLEPROC glDrawTexiOESContextANGLE;
diff --git a/chromium/third_party/angle/util/windows/WGLWindow.cpp b/chromium/third_party/angle/util/windows/WGLWindow.cpp
index 45f94c3a7b3..bc66a0bc0ed 100644
--- a/chromium/third_party/angle/util/windows/WGLWindow.cpp
+++ b/chromium/third_party/angle/util/windows/WGLWindow.cpp
@@ -69,8 +69,11 @@ WGLWindow::WGLWindow(int glesMajorVersion, int glesMinorVersion)
WGLWindow::~WGLWindow() {}
// Internally initializes GL resources.
-bool WGLWindow::initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary)
+bool WGLWindow::initializeGL(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params)
{
+ mConfigParams = params;
glWindowingLibrary->getAs("wglGetProcAddress", &gCurrentWGLGetProcAddress);
if (!gCurrentWGLGetProcAddress)
@@ -135,7 +138,7 @@ bool WGLWindow::initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibr
return false;
}
- if (mWebGLCompatibility.valid() || mRobustResourceInit.valid())
+ if (mConfigParams.webGLCompatibility.valid() || mConfigParams.robustResourceInit.valid())
{
std::cerr << "WGLWindow does not support the requested feature set." << std::endl;
return false;
@@ -163,11 +166,11 @@ bool WGLWindow::initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibr
makeCurrent();
- if (mSwapInterval != -1)
+ if (mConfigParams.swapInterval != -1)
{
if (_wglSwapIntervalEXT)
{
- if (_wglSwapIntervalEXT(mSwapInterval) == FALSE)
+ if (_wglSwapIntervalEXT(mConfigParams.swapInterval) == FALSE)
{
std::cerr << "Error setting swap interval." << std::endl;
}
diff --git a/chromium/third_party/angle/util/windows/WGLWindow.h b/chromium/third_party/angle/util/windows/WGLWindow.h
index 8fb97636327..0b603cdd393 100644
--- a/chromium/third_party/angle/util/windows/WGLWindow.h
+++ b/chromium/third_party/angle/util/windows/WGLWindow.h
@@ -28,7 +28,9 @@ class ANGLE_UTIL_EXPORT WGLWindow : public GLWindowBase
static void Delete(WGLWindow **window);
// Internally initializes GL resources.
- bool initializeGL(OSWindow *osWindow, angle::Library *glWindowingLibrary) override;
+ bool initializeGL(OSWindow *osWindow,
+ angle::Library *glWindowingLibrary,
+ const ConfigParameters &params) override;
void destroyGL() override;
bool isGLInitialized() const override;
diff --git a/chromium/third_party/angle/util/windows/win32/Win32Window.cpp b/chromium/third_party/angle/util/windows/win32/Win32Window.cpp
index 7d514574792..c7317cb188b 100644
--- a/chromium/third_party/angle/util/windows/win32/Win32Window.cpp
+++ b/chromium/third_party/angle/util/windows/win32/Win32Window.cpp
@@ -550,7 +550,7 @@ bool Win32Window::initialize(const std::string &name, size_t width, size_t heigh
}
DWORD parentStyle = WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
- DWORD parentExtendedStyle = WS_EX_APPWINDOW;
+ DWORD parentExtendedStyle = WS_EX_APPWINDOW | WS_EX_TOOLWINDOW;
RECT sizeRect = {0, 0, static_cast<LONG>(width), static_cast<LONG>(height)};
AdjustWindowRectEx(&sizeRect, parentStyle, FALSE, parentExtendedStyle);